當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 來完成的。
System Control Block (SCB),提供系統實作訊息和系統控制,包括
Exception 的配置、控制,有一些 Registers 用於控制 fault exceptions。
/** @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
#define SCS_BASE (0xE000E000) /*!< System Control Space Base Address */``
#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 可以被分三組
0 代表代表沒有發生 Fault,1 代表發生Fault 會記錄著原因。
今天介紹了 Exception registers 和 操作方式,但還有許多 Register 尚未介紹,但其實在ARM -M系列的相關文件都講得相當清楚,這邊只舉幾個當作範例。
Definitive Guide To the ARM Cortex-M3