《ARM Cortex-M0XX指南》是全球首本系统论述ARM Cortex-M0处理器及其编程的图书。本书既有ARM Cortex-M0处理器内核、体系结构及其应用的详尽论述,也有指令集、编译器、软件开发的基本论述,甚至也涵盖如何定位程序代码中的错误和软件移植等方面的知识。本书适合的读者对象包括:嵌入式产品设计工程师、嵌入式软件开发人员、电子爱好者以及学习嵌入式系统课程(ARM Cortex-M0)的高年级本科生及研究生等。
目录
- 译者序
- 推荐序
- 前言
- 致谢
- 本书约定
- 缩写术语
- 第1章 绪论
- 1.1为什么要选择CortexM0
- 1.1.1能耗效率
- 1.1.2代码密度
- 1.1.3易于使用
- 1.2CortexM0处理器的应用
- 1.3ARM和ARM处理器的背景
- 1.4CortexM0处理器说明和ARM体系结构
- 1.5ARM处理器和ARM生态系统
- 1.6开始使用CortexM0处理器
- 1.7本书的结构和资源
- 第2章 CortexM0技术综述
- 2.1CortexM0处理器简介
- 2.2ARM CortexM0处理器的特性
- 2.2.1系统特性
- 2.2.2应用特性
- 2.2.3调试特性
- 2.2.4其他特性
- 2.3CortexM0处理器的优势
- 2.3.1能耗效率
- 2.3.28位和16位架构的局限性
- 2.3.3易于使用,软件可移植
- 2.3.4选择多样化
- 2.4低功耗应用
- 2.4.1门数量低
- 2.4.2高效率
- 2.4.3低功耗特性
- 2.4.4逻辑单元提升
- 2.5CortexM0的软件可移植性
- 第3章 体系结构
- 3.1概述
- 3.2系统模型
- 3.2.1操作模式和状态
- 3.2.2寄存器和特殊寄存器
- 3.2.3R0R12
- 3.2.4R13,栈指针(SP)
- 3.2.5R14,链接寄存器(LR)
- 3.2.6R15,程序计数器(PC)
- 3.2.7xPSR,组合程序状态寄存器
- 3.2.8应用程序状态寄存器(APSR)的行为
- 3.2.9PRIMASK: 中断屏蔽特殊寄存器
- 3.2.10CONTROL: 特殊寄存器
- 3.3存储器系统
- 3.4栈空间操作
- 3.5异常和中断
- 3.6嵌套向量中断控制器(NVIC)
- 3.6.1灵活的中断管理
- 3.6.2支持嵌套中断
- 3.6.3向量化的异常入口
- 3.6.4中断屏蔽
- 3.7系统控制块(SCB)
- 调试系统
- 3.8程序映像和启动流程
- 第4章 CortexM0编程入门
- 4.1嵌入式系统编程入门
- 4.1.1微控制器是如何启动的
- 4.1.2嵌入式程序设计
- 4.2输入和输出
- 4.3开发流程
- 4.4C编程和汇编编程
- 4.5什么是程序映像
- 4.5.1向量表
- 4.5.2C启动代码
- 4.5.3程序代码
- 4.5.4C库代码
- 4.5.5RAM中的数据
- 4.6C编程: 数据类型
- 4.7用C语言操作外设
- 4.8Cortex微控制器软件接口标准(CMSIS)
- 4.8.1CMSIS介绍
- 4.8.2CMSIS中有什么是标准化的
- 4.8.3CMSIS的组织结构
- 4.8.4使用CMSIS
- 4.9CMSIS的优势
- 第5章 指令集
- 5.1ARM和Thumb指令集的背景
- 5.2汇编基础
- 5.2.1汇编语法一览
- 5.2.2后缀的使用
- 5.2.3Thumb代码和统一汇编语言(UAL)
- 5.2.4指令列表
- 5.2.5处理器内移动数据
- 5.2.6存储器访问
- 5.2.7栈空间访问
- 5.2.8算术运算
- 5.2.9逻辑运算
- 5.2.10移位和循环操作
- 5.2.11展开和顺序反转操作
- 5.2.12程序流控制
- 5.2.13存储器屏障指令
- 5.2.14异常相关指令
- 5.2.15休眠模式特性相关指令
- 5.2.16其他指令
- 5.3伪指令
- 第6章 指令集使用实例
- 6.1概述
- 6.2程序控制
- 6.2.1IfElse
- 6.2.2循环
- 6.2.3进一步了解跳转指令
- 6.2.4跳转条件的典型用法
- 6.2.5函数调用和函数返回
- 6.2.6跳转表
- 6.3数据访问
- 6.3.1简单数据访问
- 6.3.2使用存储器访问指令的例子
- 6.4数据类型转换
- 6.4.1数据大小的转换
- 6.4.2大小端转换
- 6.5数据处理
- 6.5.164位/128位加法
- 6.5.264位/128位减法
- 6.5.3整数除法
- 6.5.4无符号整数开方根
- 6.5.5位和位域运算
- 第7章 存储器系统
- 7.1概述
- 7.2存储器映射
- 7.3程序存储器,Boot Loader和存储器重映射
- 7.4数据存储器
- 7.5支持小端和大端
- 7.5.1数据类型
- 7.5.2硬件行为对编程的影响
- 7.5.3数据对齐
- 7.5.4访问非法地址
- 7.5.5多寄存器加载和存储指令的使用
- 7.6存储器属性
- 第8章 异常和中断
- 8.1什么是异常和中断
- 8.2CortexM0处理器的异常类型
- 8.2.1不可屏蔽中断(NMI)
- 8.2.2硬件错误
- 8.2.3SVC(请求管理调用)
- 8.2.4PendSV(可挂起的系统调用)
- 8.2.5系统节拍
- 8.2.6中断
- 8.3异常优先级定义
- 8.4向量表
- 8.5异常流程概述
- 8.5.1接受异常请求
- 8.5.2压栈和出栈
- 8.5.3异常返回指令
- 8.5.4末尾连锁
- 8.5.5延迟到达
- 8.6EXC_RETURN
- 8.7异常入口流程的细节
- 8.7.1压栈
- 8.7.2取出向量并更新PC
- 8.7.3寄存器更新
- 8.8异常退出流程的细节
- 8.8.1寄存器出栈
- 8.8.2从返回地址取值并执行
- 第9章 中断控制和系统控制
- 9.1NVIC和系统控制块特性
- 9.2中断使能和清除使能
- 9.3中断挂起和清除挂起
- 9.4中断优先级
- 9.5中断控制的通用汇编代码
- 9.5.1使能和禁止中断
- 9.5.2设置和清除中断挂起状态
- 9.5.3设置中断优先级
- 9.6异常屏蔽寄存器(PRIMASK)
- 9.7中断输入和挂起行为
- 简单的中断处理
- 9.8中断等待
- 9.9系统异常的控制寄存器
- 9.10系统控制寄存器
- 9.10.1CPU ID基址寄存器
- 9.10.2应用中断和复位控制寄存器
- 9.10.3配置和控制寄存器
- 第10章 支持操作系统的特性
- 10.1支持操作系统的特性概述
- 为什么要使用嵌入式操作系统
- 10.2SysTick定时器
- 10.3SysTick寄存器
- 10.3.1设置SysTick
- 10.3.2SysTick用于时间测量
- 10.4进程栈和进程栈指针
- 10.5SVC
- 10.6PendSV
- 第11章 低功耗特性
- 11.1低功耗嵌入式系统概述
- 11.2CortexM0处理器的低功耗优势
- 11.3低功耗特性概述
- 11.4休眠模式
- 11.5等待事件(WFE)和等待中断(WFI)
- 11.5.1等待事件(WFE)
- 11.5.2等待中断(WFI)
- 11.5.3唤醒条件
- 11.6退出休眠特性
- 11.7唤醒中断控制器
- 第12章 错误处理
- 12.1错误异常概述
- 错误是怎么发生的
- 12.2分析错误
- 12.3意外切换至ARM状态
- 12.4实际应用中的错误处理
- 12.5锁定
- 12.5.1锁定的原因
- 12.5.2锁定期间发生了什么
- 12.6防止锁定
- 第13章 调试特性
- 13.1软件开发和调试特性
- 13.2调试特性一览
- 13.3调试接口
- 13.4暂停模式和调试事件
- 13.5调试系统
- 第14章 Keil MDK入门
- 14.1Keil MDK介绍
- 14.2使用Keil MDK的
- 第一步
- 14.2.1创建Blinky工程
- 14.2.2创建工程代码
- 14.2.3工程设置
- 14.2.4编译和建立程序
- 14.2.5使用调试器
- 14.3其他的工程配置
- 14.3.1目标,源文件组
- 14.3.2编译器和代码生成选项
- 14.3.3模拟器
- 14.3.4在RAM中运行
- 14.4定制Keil中的启动代码
- 14.5使用Keil中的分散加载特性
- 第15章 简单应用程序开发
- 15.1使用CMSIS
- 15.2将SysTick用作单发定时器
- 15.3UART示例
- 15.3.1简单的输入和输出
- 15.3.2重定向
- 15.3.3开发自己的输入和输出函数
- 15.4简单中断编程
- 15.4.1中断编程概述
- 15.4.2度盘控制接口实例
- 15.4.3中断控制函数
- 15.5CMSIS的不同版本
- 第16章 汇编工程和C与汇编混合工程
- 16.1用汇编开发工程
- 16.2汇编编程的建议规则
- 16.3汇编函数的结构
- 16.4简单的汇编工程实例
- 16.5为变量分配数据空间
- 16.6用汇编实现UART
- 16.7其他的文字输出函数
- 复杂的跳转处理
- 16.8混合语言工程
- 16.8.1在汇编中调用C函数
- 16.8.2在C代码中调用汇编函数
- 16.9嵌入汇编
- 16.10使用特殊指令
- 16.11习语识别
- 第17章 在编程中使用低功耗特性
- 17.1概述
- 17.2CortexM0处理器的休眠模式回顾
- 17.3在程序中使用WFE和WFI
- 17.4使用挂起发送事件特性
- 17.5使用退出休眠特性
- 17.6唤醒中断控制器(WIC)特性
- 17.7事件通信接口
- 17.8开发低功耗应用程序
- 17.9LPC111x的低功耗特性使用示例
- 第18章 使用SVC、PendSV和Keil RTX Kernel
- 18.1概述
- 18.2使用SVC异常
- 18.3使用PendSV异常
- 18.4使用嵌入式OS
- 18.5Keil RTX实时内核
- 18.6OS启动流程
- 18.6.1简单的OS实例
- 18.6.2任务间通信
- 18.6.3事件通信
- 18.6.4互斥体
- 18.6.5信号量
- 18.6.6信箱消息
- 18.6.7周期时间间隔
- 18.6.8其他的RTX特性
- 18.6.9应用程序实例
- 第19章 ARM RealView开发组件入门
- 19.1概述
- 19.2简单的应用程序实例
- 19.3使用分散加载文件
- 19.4用C实现的含有向量表的实例
- 19.5在RVDS中使用MicroLIB
- 19.6在RVDS中使用汇编进行应用程序开发
- 19.7Flash编程
- 19.8使用RealView调试器进行调试
- 19.9使用RealView调试器的串行线调试
- 19.10RVDS中的重定向
- 第20章 GNU C编译器入门
- 20.1概述
- 20.2典型的开发流程
- 20.3简单的C程序开发
- 20.4CodeSourcery通用启动代码
- 20.5使用用户定义的向量表
- 20.6在gcc中使用Printf
- 20.7内联汇编
- 20.8gcc中的SVC实例
- 20.9硬件错误异常实例
- 20.10Flash编程和调试
- 第21章 软件移植
- 21.1概述
- 21.2ARM处理器
- 21.3ARM7TDMI和CortexM0之间的差异
- 21.3.1操作模式
- 21.3.2寄存器
- 21.3.3指令集
- 21.3.4中断
- 21.4从ARM7TDMI向CortexM0移植软件
- 21.4.1启动代码和向量表
- 21.4.2中断
- 21.4.3C程序代码
- 21.4.4汇编代码
- 21.4.5原子操作
- 21.4.6优化
- 21.5CortexM1和CortexM0之间的差异
- 21.5.1指令集
- 21.5.2NVIC
- 21.5.3系统级特性
- 21.6在CortexM0和CortexM1之间移植软件
- 21.7CortexM3和CortexM0之间的差异
- 21.7.1系统模型
- 21.7.2NVIC和异常
- 21.7.3指令集
- 21.7.4系统级特性
- 21.7.5调试特性
- 21.8在CortexM0和CortexM3之间移植软件
- 21.9在CortexM0和CortexM4处理器之间移植软件
- 21.10从8位机/16位机往CortexM0移植程序
- 21.10.1通用改动
- 21.10.2存储器需求
- 21.10.38位机和16位机不再适用的优化
- 21.10.4实例: 从8051移植到ARM CortexM0
- 第22章 CortexM0产品
- 22.1概述
- 22.2微控制器产品和专用标准产品(ASSP)
- 22.2.1NXP CortexM0微控制器
- 22.2.2NuMicro微控制器
- 22.2.3Mocha1 ARM CortexM0可配置阵列
- 22.2.4Melfas MCS7000系列触摸屏控制器
- 22.3编译器和软件开发组件
- 22.3.1Keil微控制器开发套件(MDK)
- 22.3.2TASKING VXToolset for ARM
- 22.3.3IAR Embedded Workbench for ARM
- 22.3.4CrossWorks for ARM
- 22.3.5Red Suite
- 22.3.6LabVIEW C代码生成器
- 22.4开发板
- 22.4.1LPCXpresso
- 22.4.2IAR的LPC1114入门套件
- 22.4.3LPC1114 CortexM0模块
- 22.4.4Keil CortexM0开发板
- 附录ACortexM0指令集
- 附录BCortexM0异常类型快速参考
- B.1异常类型
- B.2异常压栈后的栈内容
- 附录C软件接口标准(CMSIS)快速参考
- C.1数据类型
- C.2异常枚举
- C.3NVIC操作函数
- C.4系统和SysTick操作函数
- C.5内核寄存器操作函数
- C.6特殊指令操作函数
- 附录DNVIC、SCB以及SysTick寄存器快速参考
- D.1NVIC寄存器一览
- D.2中断设置使能寄存器(NVIC->ISER)
- D.3中断清除使能寄存器(NVIC->ICER)
- D.4中断设置挂起寄存器(NVIC->ISPR)
- D.5中断清除挂起寄存器(NVIC->ICPR)
- D.6中断优先级寄存器(NVIC->IRP[0]到NVIC->IRP[7])
- D.7SCB寄存器一览
- D.8CPU ID基地址寄存器(SCB->CPUID)
- D.9中断控制状态寄存器(SCB->ICSR)
- D.10应用中断和控制状态寄存器(SCB->AIRCR)
- D.11系统控制寄存器(SCB->SCR)
- D.12配置控制寄存器(SCB->CCR)
- D.13系统处理优先级寄存器2(SCB->SHR[0])
- D.14系统处理优先级寄存器3(SCB->SHR[1])
- D.15系统处理控制和状态寄存器
- D.16SysTick寄存器一览
- D.17SysTick控制和状态寄存器(SysTick->CTRL)
- D.18SysTick重装载值寄存器(SysTick->LOAD)
- D.19SysTick当前值寄存器(SysTick->VAL)
- D.20SysTick校准值寄存器(SysTick->CALIB)
- 附录E调试寄存器快速参考
- E.1概述
- E.2内核调试寄存器
- E.3断点单元
- E.4数据监视点单元
- E.5ROM表寄存器
- 附录F调试接头分配
- F.110针Cortex调试连接头
- F.220针Cortex调试+ETM接头
- F.3老式的20针IDC接头排列
- 附录GCodeSourcery G++ Lite的链接器脚本
- 附录H实例代码文件
- H.1system_LPC11xx.c
- H.2system_LPC11xx.h
- H.3LPC11xx.hs
- H.4uart_test.s
- H.5RTX_config.c
- 附录I疑难解答
- I.1程序不运行/启动
- I.1.1向量表丢失或位置错误
- I.1.2使用了错误的C启动代码
- I.1.3复位向量中的值错误
- I.1.4程序映像没有正确地编程到Flash中
- I.1.5错误的工具链配置
- I.1.6错误的栈指针初始值
- I.1.7错误的大小端设置
- I.2程序启动,却进入了硬件错误
- I.2.1非法存储器访问
- I.2.2非对齐数据访问
- I.2.3从总线返回错误
- I.2.4异常处理中的栈被破坏
- I.2.5程序在某些C函数中崩溃
- I.2.6意外地试图切换至ARM状态
- I.2.7在错误的优先级上执行SVC
- I.3休眠问题
- I.3.1执行WFE不进入休眠
- I.3.2退出休眠过早地引起休眠
- I.3.3中断已经在挂起态时SEVONPEND不工作
- I.3.4由于休眠模式可能禁止了某些时钟,处理器无法唤醒
- I.3.5竞态
- I.4中断问题
- I.4.1执行了多余的中断处理
- I.4.2执行了额外的SysTick处理
- I.4.3在中断处理中禁止中断
- I.4.4错误的中断返回指令
- I.4.5异常优先级设置的数值
- I.5其他问题
- I.5.1错误的SVC参数传递方法
- I.5.2调试连接受到I/O设置或低功耗模式的影响
- I.5.3调试协议选择
- I.5.4使用事件输出作为脉冲I/O
- 附录J实用参考文档