-
打开artery的AN0026应用笔记(AN0026_Extending_SRAM_in_User's_Program_ZH_V2.0.0.pdf),可以看到AT32的出厂预设的SRAM的大小为96K字节,可以修改EOPB0扩展到224K字节。EOPB0的寄存器设置如下,根据下方可知需要将EOPB0的0-7位设置位0xFE。
-
但是在设置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大小:
-
-
注意事项:
- 必须在Reset_Handler的一开头就去做EOPB0的修改,不要在SystemInit()函数里头设置,因为 用户一开始在Keil/IAR等开发环境设定的SRAM范围,就可能是以扩充后的224K字节作设定,且 实际用到的SRAM可能超过了默认的96K,此时堆栈(STACK)的指针初始值会被设定到96K之后 的地址,执行SystemInit( )时就会出错,甚至发生HardFault而造成死机。
- 在调用extend_sram()函数前,要将堆栈(STACK)的指针先改到 96K字节内(例程中是修改到 (0x20001000),避免因STACK的指针初始值被设定到96K之后的地址,而造成extend_SRAM函 数执行时发生错误。
-
编译运行结果: