文章目录
- Cortex-M7内核外设
- Cortex-M7处理器编程者模型
-
- 软件运行时的处理器模式和特权级
-
- 两种处理器模式:
-
- 线程模式
- Handler模式
- 软件运行时的两种特权等级:
-
- 非特权级:
- 特权级:
- 栈
- 处理器寄存器
-
- 栈指针
- 链接寄存器
- 程序计数器
- 程序状态寄存器
- 应用程序状态寄存器
- 中断程序状态寄存器
- 运行程序状态寄存器
- 异常屏蔽寄存器
- 优先级屏蔽寄存器
- 故障屏蔽寄存器
- 基本优先级屏蔽寄存器
- 控制寄存器
Cortex-M7内核外设
寄存器 | 读写属性 | 特权/非特权访问 | 复位后的值 | 描述 |
---|---|---|---|---|
R0-R12 | RW | 均可以 | 未知 | 32位的通用寄存器 |
MSP | RW | 均可以 | 复位后从地址0x00000000加载MSP的初始值 (引导程序的中断向量表从0x00000000开始,前四个字节为sp初值) |
主栈指针 |
PSP | RW | 均可以 | 0x00000000 | 主栈指针 |
LR | RW | 均可以 | 0xFFFFFFFF | 链接寄存器 |
PC | RW | 均可以 | 复位后从地址0x00000004加载复位向量的值,该值的第0位会被加载到ESSR的T位,用于决定程序是否运行于Thumb状态 | 程序计数器 |
PSR | RW | 均可以 | 0x01000000 | 程序状态寄存器不是一个寄存器,它包含APSR,IPSR,EPSR |
APSR | RW | 均可以 | 未知 | 应用程序状态寄存器 |
IPSPR | RO | 特权 | 0x00000000 | 中断程序状态寄存器 |
EPSR | RO | 特权 | 0x01000000 | 运行程序状态寄存器 |
PRIMASK | RW | 特权 | 0x00000000 | 优先级屏蔽寄存器 |
FAULTMASK | RW | 特权 | 0x00000000 | 故障屏蔽寄存器 |
BASEPRI | RW | 特权 | 0x00000000 | 基本优先级屏蔽寄存器 |
CONTROL | RW | 特权 | 0x00000000 | 控制寄存器 |
栈指针
在线程模式下,控制寄存器的bit[1]指示当前使用的是哪一个栈指针
- 0 主栈(MSP)
- 1 线程栈(PSP)
链接寄存器
存储了函数调用,异常处理的返回信息,复位后值为0xFFFFFFFF
程序计数器
包含当前指令的地址,复位后从0x00000004加载复位向量的值作为初值,该值的bit[0]会被加载到运行程序状态寄存器(EPSR)的T位,表明当前程序运行在Thumb状态还是其他状态。
程序状态寄存器
程序状态寄存器是APSR,EPSR,IPSR的组合,它们之间的位域相互独立,比特位的分布如下:
应用程序状态寄存器
应用程序状态寄存器中的标识位表示了运行指令后的当前状态。
ICI域:
- 当中断发生时程序正在执行STM,LDM,PUSH,POP指令,或者FPU正在运行VSTM,VLDM,VPUSH,VPOP时会暂停该指令,然后把下一个操作数放到ICI域中,当中断执行完成之后,从ICI域中恢复操作数,继续执行该指令。
Thumb 状态:
- Cortex-M7只能在Thumb状态下运行指令,下面几种情况会把该位清零
- BLX, BX, POP{PC}
- 异常返回时从栈中恢复状态寄存器的值。
- 一个中断向量的Bit[0]或者复位。
- Handler模式下始终使用MSP,因此在Handler模式下处理器会忽略对SPSEL位的写入,异常的进入和返回机制会根据EXC_RETURN的值自动更新控制寄存器的值。
- 默认情况下,线程模式下使用的是MSP,如果想切换成PSP:
- 可以使用MSR指令修改SPSEL位为1
- 执行一个异常处理然后使用一个适当的EXC_RETURN进行返回。
- 当切换栈指针之后必须使用ISB指令刷新流水线,以保证在ISB之后执行的指令都使用新的栈。
故障屏蔽寄存器
它的第0位决定了是否屏蔽除了不可屏蔽中断(NMI)之外的其他中断,通过MSR指令在特权模式下可以访问。
控制寄存器
该寄存器控制着线程模式下程序运行时的特权等级和使用的栈,还可以指示当前是否处于FPU状态。

文章知识点与官方知识档案匹配,可进一步学习相关知识C技能树首页概览113095 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!