Day11.进入 ARM 世界: ARM Cortex-M Exception Registers

VECTOR TABLE

当Exception发生并由 Cortex-M3 处理时,处理器将需要定位 Exception handler 的起始地址,会存储在中的VECTOR TABLE中,默认情况下,VECTOR TABLE 从地址0开始。由於地址 0x0 应该是boot code,通常 VECTOR TABLE 会放在 Flash 或 ROM 中,并且在运行时不能更改该值,但是,VECTOR TABLE可以relocated到 RAM 区域中,以便我们可以在运行时更改 handler,通过在 NVIC 中设置一个称为 vector table offset register 来完成的。

Fault exception registers

System Control Block (SCB),提供系统实作讯息和系统控制,包括
Exception 的配置、控制,有一些 Registers 用於控制 fault exceptions。

  1. 定义 SCB的资料结构
/** @brief System Control Block (SCB) register structure definition */
     typedef struct
     { 
         __I uint32_t CPUID;   /*!< Offset: 0x00 CPU ID Base Register*/ 
         __IO uint32_t ICSR;   /*!< Offset: 0x04 Interrupt Control State Register*/ 
        __IO uint32_t VTOR;   /*!< Offset: 0x08 Vector Table Offset Register*/  
        __IO uint32_t AIRCR;  /*!< Offset: 0x0C Application Interrupt / Reset Control Register*/ 
        __IO uint32_t SCR;    /*!< Offset: 0x10 System Control Register*/  
        __IO uint32_t CCR;    /*!< Offset: 0x14 Configuration Control Register*/   
        __IO uint8_t SHP[12]; /*!< Offset: 0x18 System Handlers Priority Registers (4-7, 8-11, 12-15) */  
        __IO uint32_t SHCSR;  /*!< Offset: 0x24 System Handler Control and State Register */  
        __IO uint32_t CFSR;   /*!< Offset: 0x28 Configurable Fault Status Register*/  
        __IO uint32_t HFSR;   /*!< Offset: 0x2C Hard Fault Status Register*/  
        __IO uint32_t DFSR;   /*!< Offset: 0x30 Debug Fault Status Register */ 
        __IO uint32_t MMFAR;  /*!< Offset: 0x34 Mem Manage Address Register*/  
        __IO uint32_t BFAR;   /*!< Offset: 0x38 Bus Fault Address Register*/ 
        __IO uint32_t AFSR;   /*!< Offset: 0x3C Auxiliary Fault Status Register*/  
        __I uint32_t PFR[2];  /*!< Offset: 0x40 Processor Feature Register*/  
        __I uint32_t DFR;     /*!< Offset: 0x48 Debug Feature Register*/ 
        __I uint32_t ADR;     /*!< Offset: 0x4C Auxiliary Feature Register*/  
        __I uint32_t MMFR[4]; /*!< Offset: 0x50 Memory Model Feature Register*/   
        __I uint32_t ISAR[5]; /*!< Offset: 0x60 ISA Feature Register*/  
    } SCB_Type; 

SCB的资料结构,属於CMSIS Cortex-M3

  1. 定义 SCB 实体空间基底记忆体地址
#define SCS_BASE (0xE000E000) /*!< System Control Space Base Address */``
  1. 定义指向 SCB 的指标
#define SCB ((SCB_Type *)SCB_BASE) /*!< SCB configuration struct * / 

通过以上步骤,我们就可以使用指向 SCB 资料结构的指标来access SCB内部所定义的暂存器,比如给系统控制暂存器 (SCR) 赋值:SCB->SCR=0xFF。

Configuration and Control Register (CCR)
控制 UsageFault 和 被零除和未对齐记忆体访问的行为

System Handler Control and State Register (SHCSR)


SHCSR 负责 enable/disable System exception,例如:Memory Management Fault, Bus Fault, and Usage Fault exceptions 可以使用以下语法Eable Exception

SCB->SHCSR |= SCB_SHCSR_USGFAULTENA_Msk 
 | SCB_SHCSR_BUSFAULTENA_Msk
 | SCB_SHCSR_MEMFAULTENA_Msk; //enable Usage-/Bus-/MPU Fault

Configurable Fault Status Register (CFSR)


CFSR Register 可以被分三组

  • Usage Fault Status
  • Bus Falut Status
  • Memeory Management Falut Status

0 代表代表没有发生 Fault,1 代表发生Fault 会记录着原因。

其他 Registers 说明

今天介绍了 Exception registers 和 操作方式,但还有许多 Register 尚未介绍,但其实在ARM -M系列的相关文件都讲得相当清楚,这边只举几个当作范例。

参考资料

Definitive Guide To the ARM Cortex-M3


<<:  [第09天]理财达人Mx. Ada-订阅盘中交易

>>:  [DAY 11] _软件实现I2C协议以三轴感测器为例 (ADXL345)

html 下拉式选单内的群组

上次说过下拉式选单的写法了,今天来说说选单内的群组 程序码示范 <select> <...

食谱搜寻系统demo

Icebear终於完成简易的食谱搜寻系统啦!!今天就献丑一下啦!! 明天Icebear会整理系统缺点...

Day 16 (Ps)

1.钢笔工具去背 (影片Ps5) (1)用钢笔画出要去背的物件 a.拉,按着左键不要放>Alt...

铁人赛 Day1 -- HTML基本架构

哎呀,自学了两个月後刚好碰到2021的铁人赛开打,顺便来分享一下我的学习过程好了,有错的在劳烦各位大...

基本操作 - 历史资讯

根据官方说明,因为历史资料的查询蛮耗资源的,有可能会拖慢系统的速度,所以官方不建议使用,而且有每5秒...