iT邦幫忙

2021 iThome 鐵人賽

DAY 11
0
Arm Platforms

30天從0開始探索嵌入式世界系列 第 11

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


上一篇
Day.10 進入 ARM 世界: ARM Cortex-M Exception 介紹
下一篇
Day12.進入 ARM 世界: ARM Cortex-M Exception Behavior
系列文
30天從0開始探索嵌入式世界15

尚未有邦友留言

立即登入留言