AT32F403a/407开启RAM扩展,增加RAM到224K字节

  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. 编译运行结果:

posted @ 2024-11-21 21:09  PlayerPencil  阅读(60)  评论(0编辑  收藏  举报