AT32F403a/407开启RAM扩展,增加RAM到224K字节
Published on 2024-11-21 21:09 in 暂未分类 with PlayerPencil

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 @   PlayerPencil  阅读(196)  评论(0编辑  收藏  举报
    相关博文:
    阅读排行:
    · 一个费力不讨好的项目,让我损失了近一半的绩效!
    · 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
    · 实操Deepseek接入个人知识库
    · CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
    · Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
    点击右上角即可分享
    微信分享提示