CM3-读书笔记《Cortex-M3权威指南Cn》-1

来源:互联网 发布:听诊器膜片 知乎 编辑:程序博客网 时间:2024/05/18 16:17

目的:

通过中断向量表等相关描述,得出一个清晰的思路来撰写启动代码,以及bootloader+app双工程的配置问题

具体体现会在以后的demo工程中说明,这里作为参考资料

 (时间紧凑,先摘录原文,回头会来写体会)

 

Cortex-M3  处理器内核  vs.  基于Cortex-M3的MCU
Cortex ‐ M3处理器内核是单片机的中央处理单元(CPU )。完整的基于CM3 的MCU还需要
很多其它组件。在芯片制造商得到CM3 处理器内核的使用授权后,它们就可以把CM3 内核用
在自己的硅片设计中,添加存储器,外设,I/O 以及其它功能块。不同厂家设计出的单片机
会有不同的配置,包括存储器容量、类型、外设等都各具特色。本书主讲处理器内核本身。
如果想要了解某个具体型号的处理器,还需查阅相关厂家提供的文档。 

 

向量表 s
当一个发生的异常被CM3 内核接受,对应的异常 handler就会执行。为了决定 handler的入
口地址,CM3 使用了“向量表查表机制”。这里使用一张向量表。向量表其实是一个WORD
(32位整数)数组,每个下标对应一种异常,该下标元素的值则是该异常handler的入口地
址。向量表的存储位置是可以设置的,通过NVIC 中的一个重定位寄存器来指出向量表的地
址。在复位后,该寄存器的值为 0 。因此,在地址 0 处必须包含一张向量表,用于初始时的
异常分配。

复位序列
  在离开复位状态后,CM3 做的第一件事就是读取下列两个 32位整数的值: 
z   从地址0x0000,0000处取出 MSP 的初始值。 
z   从地址0x0000,0004处取出 PC的初始值——这个值是复位向量,LSB 必须是1 。然
后从这个值所对应的地址处取指。 

  请注意,这与传统的ARM 架构不同——其实也和绝大多数的其它单片机不同。传统的
ARM 架构总是从 0 地址开始执行第一条指令。它们的 0 地址处总是一条跳转指令。在 CM3
中,0 地址处提供 MSP 的初始值,然后就是向量表(向量表在以后还可以被移至其它位置)。
向量表中的数值是32位的地址,而不是跳转指令。向量表的第一个条目指向复位后应执行
的第一条指令。

 

向量表
 
  当发生了异常并且要响应它时,CM3 需要定位其处理例程的入口地址。这些入口地址
存储在所谓的“(异常)向量表”中。缺省情况下,CM3 认为该表位于零地址处,且各向量
占用4 字节,因此每个表项占用 4 字节,如表7.6 所示。

  因为地址0 处应该存储引导代码,所以它通常是Flash或者是ROM器件,并且它们的
值不得在运行时改变。然而,为了动态重分发中断,CM3 允许向量表重定位——从其它地
址处开始定位各异常向量。这些地址对应的区域可以是代码区,但也可以是RAM 区。在RAM
区就可以修改向量的入口地址了。为了实现这个功能,NVIC中有一个寄存器,称为“向量
表偏移量寄存器”(在地址0xE000_ED08 处),通过修改它的值就能定位向量表。但必须注
意的是:向量表的起始地址是有要求的:必须先求出系统中共有多少个向量,再把这个数字
向上增大到是2 的整次幂,而起始地址必须对齐到后者的边界上。例如,如果一共有32个
中断,则共有 32+16(系统异常)=48 个向量,向上增大到 2 的整次幂后值为64,因此地址
地址必须能被64*4=256整除,从而合法的起始地址可以是:0x0,   0x100,   0x200 等。向量表
偏移量寄存器的定义如表7.7 所示。

如果需要动态地更改向量表,则对于任何器件来说,向量表的起始处都必须包含以下向量: 
z   主堆栈指针(MSP)的初始值 
z   复位向量 
z   NMI  
z   硬fault 服务例程 
  后两者也是必需的,因为有可能在引导过程中发生这两种异常。 
  可以在SRAM 中开出一块用于存储向量表。然后在引导完成后,就可以启用内存中的向
量表,从而实现向量可动态调整的功能。

原创粉丝点击