复位序列
在离开复位状态后,CM3 做的第一件事就是读取下列两个32 位整数的值:
从地址 0x0000,0000 处取出MSP 的初始值。
从地址 0x0000,0004 处取出PC 的初始值——这个值是复位向量,LSB 必须是1。然
后从这个值所对应的地址处取指。
图3.17 复位序列
请注意,这与传统的ARM 架构不同——其实也和绝大多数的其它单片机不同。传统的
ARM 架构总是从0 地址开始执行第一条指令。它们的0 地址处总是一条跳转指令。在CM3
中,0 地址处提供MSP 的初始值,然后就是向量表(向量表在以后还可以被移至其它位置)。
向量表中的数值是32 位的地址,而不是跳转指令。向量表的第一个条目指向复位后应执行
的第一条指令。
图3.18 初始MSP 及PC 初始化的一个范例
因为CM3 使用的是向下生长的满栈,所以MSP 的初始值必须是堆栈内存的末地址加1。
举例来说,如果你的堆栈区域在0x20007C00‐0x20007FFF 之间,那么MSP 的初始值就必须是
0x20008000。
向量表跟随在MSP 的初始值之后——也就是第2 个表目。要注意因为CM3 是在Thumb
态下执行,所以向量表中的每个数值都必须把LSB 置1(也就是奇数)。正是因为这个原因,
图3.18 中使用0x101 来表达地址0x100。当0x100 处的指令得到执行后,就正式开始了程序
的执行。在此之前初始化MSP 是必需的,因为可能第1 条指令还没执行就会被NMI 或是其
它fault 打断。MSP 初始化好后就已经为它们的服务例程准备好了堆栈。
对于不同的开发工具,需要使用不同的格式来设置MSP 初值和复位向量——有些则由
开发工具自行计算。如果想要获知细节,最快的办法就是参考开发工具提供的一个示例工程。
本书的第10 章和第20 章介绍ARM 提供的开发工具,第19 章则介绍GCC 工具链。
复位信号
基于CM3的单片机对复位电路有特定的要求,具体内容在《Cortex‐M3 Technical
Reference Manual(Ref1)》中给出,它列出了若干个可以使用的复位信号。不过,实现成单片
机后,往往只用到了1至2个。至余其它的,芯片厂商会在芯片中布设复位信号发生器,由它
在内部产生剩余的复位信号。细节需要参考制造商提供的数据手册,以获取如何正确复位其
芯片的信息。在CM3处理器的水平上,复位信号由表6.3列出。
图6.5 典型的Cortex-M3芯片内部复位信号和其作用范围示意图
Cortex-M3 复位方式
通过处理器设计中出现的复位信号,用户可以单独对设计中的不同元件进行复位。表
6-4 列出了这些复位信号和他们的组合形式,以及可能的应用。