多云转晴 发表于 2022-3-31 19:59

如何在SRAM中存放和执行程序

本帖最后由 多云转晴 于 2022-3-31 19:59 编辑

在对单片机的日常使用中,我们通常是在FLASH中存放程序,在SRAM中执行程序的。但生活不会永远一帆风顺,芯片的FLASH也不会一直安好;如果FLASH自身出现读写错误,那么写入的程序可能也会出现错误。这时候,我们就要调整思路,将程序存放到SRAM中来调试程序,下面将简单介绍如何在SRAM中存放和执行程序。(本次介绍以APM32F072RBT6作为典例示范)① 首先,在极海官网找到型号表,并找出对应型号芯片的SRAM大小,详见图一
② 打开KEIL软件,点击上方的“魔法棒”按钮,选择程序存放和执行的区域。如图二
③ 由步骤一可以知道,APM32F072RBT6的FLASH大小为128K,SRAM大小为16K,经过计算机计算,可以得出FLASH和SRAM的地址范围(FLASH基地址为0X08000000,SRAM基地址为0X20000000)。PS: FLASH地址范围:0X08000000 - 0X08020000SRAM地址范围:0X20000000 - 0X20004000
④ 因为要在SRAM中存放和执行,因此要将SRAM分成两个部分分别执行,如图三所示。注意:存放区域与执行区域不能重叠!!!
file:///C:\Users\DELL-K\AppData\Local\Temp\ksohtml\wpsA37A.tmp.jpg⑤ 在更改完存放区域和执行区域之后,也要改变运算区域的地址范围,如图四所示注意:执行区域和运算区域可以重叠;由于程序存放和执行都在SRAM中,因此只能通过Debug调试程序,固不勾选Reset and Run。
file:///C:\Users\DELL-K\AppData\Local\Temp\ksohtml\wpsA37B.tmp.jpg⑥ 创建配置文件
FUNC void Setup(void){SP = _RDWORD(0X20000000);      //设置堆栈指针PC = _RDWORD(0X20000004);      //设置PC指针_WDWORD(0XE000ED08,0X20000000);//设置中断向量表地址}LOAD $L%L INCREMENTAL      //装载代码到CPU内部RAM//LOAD PLL.axf INCREMENTALSetup();      //调用Setup函数修改堆栈指针和PC指针,SP的值要从目标代码中读取g.main      //运行到main函数
以上为配置文件的内容,文件名称不限,但文件格式为XXX.ini。然后将其添加到KEIL的配置中,详见图五。
file:///C:\Users\DELL-K\AppData\Local\Temp\ksohtml\wpsA37C.tmp.jpg⑦ 在硬件上,要将BOOT0和BOOT1都引出为1(即连接VDD)。
到这里,软件和硬件的配置就结束了,这个时候我们就可以在通过SRAM进行程序调试了。
欢迎各位行业精英进行批评指正!














七毛钱 发表于 2022-4-1 09:37

讲解相当详细

zjh20070904 发表于 2022-4-1 14:36

有个疑问:system_apm32f10x.c 中的SCB->VTOR = FMC_BASE | VECT_TAB_OFFSET 还需要修改吗?
页: [1]
查看完整版本: 如何在SRAM中存放和执行程序