AT32F403a/407開啟RAM擴充套件,增加RAM到224K位元組

PlayerPencil發表於2024-11-21
  1. 開啟artery的AN0026應用筆記(AN0026_Extending_SRAM_in_User's_Program_ZH_V2.0.0.pdf),可以看到AT32的出廠預設的SRAM的大小為96K位元組,可以修改EOPB0擴充套件到224K位元組。EOPB0的暫存器設定如下,根據下方可知需要將EOPB0的0-7位設定位0xFE。

  2. 但是在設定EOPB0之後,必須執行系統復位的命令,新的EOPB0數值才可以生效並且真正的設定到所選的SRAM大小,就需要做如下操作:

    • main 檔案中建立 extend_sram 函式

      void extend_sram(void)
      {
        // check if RAM has been set to 224K, if not, change EOPB0
        if(((USD->eopb0) & 0xFF) != 0xFE)
        {
          /* Unlock Option Bytes Program Erase controller */
          flash_unlock();
          /* Erase Option Bytes */
          flash_user_system_data_erase();
          /* Change SRAM size to 224KB */
          flash_user_system_data_program((uint32_t)&USD->eopb0,0xFE);
          NVIC_SystemReset();
        }
      }
      
    • 修改 startup_at32f403a_407.s 啟動檔案,在復位之前執行extend_sram函式:

      ; Reset handler  需要修改Reset_Handler
      Reset_Handler   PROC
                      EXPORT  Reset_Handler                       [WEAK]
                      IMPORT  __main
                      IMPORT  SystemInit
      ; 從此項以下開始新增
                      IMPORT  extend_sram
                      MOV32   R0,#0x20001000
                      MOV     SP,R0
                      LDR     R0, =extend_sram
                      BLX     R0
                      MOV32   R0,#0x08000000
                      LDR     SP,[R0]
      ; 到此項以上結束
                      LDR     R0, =SystemInit
                      BLX     R0
                      LDR     R0, =__main
                      BX      R0
                      ENDP
      
    • 之後修改RAM大小:

  3. 注意事項:

    • 必須在Reset_Handler的一開頭就去做EOPB0的修改,不要在SystemInit()函式里頭設定,因為 使用者一開始在Keil/IAR等開發環境設定的SRAM範圍,就可能是以擴充後的224K位元組作設定,且 實際用到的SRAM可能超過了預設的96K,此時堆疊(STACK)的指標初始值會被設定到96K之後 的地址,執行SystemInit( )時就會出錯,甚至發生HardFault而造成當機。
    • 在呼叫extend_sram()函式前,要將堆疊(STACK)的指標先改到 96K位元組內(例程中是修改到 (0x20001000),避免因STACK的指標初始值被設定到96K之後的地址,而造成extend_SRAM函 數執行時發生錯誤。
  4. 編譯執行結果:

相關文章