本帖最后由 多云转晴 于 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 - 0X08020000 SRAM地址范围: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 INCREMENTAL Setup(); //调用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进行程序调试了。
欢迎各位行业精英进行批评指正!
|