本帖最后由 lc115647 于 2024-8-13 10:48 编辑
前言
在使用MCU的过程中可能会存在flash块存在异常的现象,导致程序出现跑飞或者读取到的数据错误,我们可以通过将程序放入RAM执行,通过写读验证flash上的数据是否存在异常,排查故障。下面介绍如何基于APM32F072VB实现在RAM运行程序。
1、设置代码区和程序变量区大小
在工程的Options for Target ->Target中将IROM1,和IRAM1都修成在RAM区间,注意按芯片RAM大小来设置,并根据程序大小及变量多少来划分,本例MCU为APM32F072VB,芯片有16k RAM,将前12k设成IROM1用来放代码,将后4k用来当IRAM1存程序变量,堆和栈。
2、定义VECT_TAB_SRAM
在工程的Options for Target ->C/C++选项卡中加入VECT_TAB_SRAM宏定义:
3、定义USE MEMORY LAYOUT FROM TARGET Dialog
Linker选项卡中先不勾选USE MEMORY LAYOUT FROM TARGET Dialog,并设置R/O Base 和R/W Base 如下 :
修改完毕后勾选USE MEMORY LAYOUT FROM TARGET Dialog
4、新建CpuRAM.ini文件(文件名随意),内容如下:
FUNC void Setup (void) { SP = _RDWORD(0x20000000); // 设置堆栈指针PC = _RDWORD(0x20000004); // 设置PC指针
_WDWORD(0xE000ED08, 0x20000000); // 设置中断向量表地址
}
//LOAD CpuRAM\obj\output.axf INCREMENTAL
// 先装载代码到CPU内部RAM (工程选项中就不要选Load Application ar Startup)
LOAD $L%L INCREMENTAL
Setup(); // 再调用Setup函数修改堆栈和PC指针(因为SP的值需要从目标代码中读取)
g, main // 运行到main()函数
5、在工程的Options for Target ->Debug选项卡中先加入刚新建的CpuRam.ini文件作为仿真初值化文件:同时去掉Load Application at Startup勾选
6、在工程的Options for Target ->Debug->Settings选项卡中按下图配置烧录规则/算法:
7、完成上述配置程序编译完对应的地址空间就在SRAM区间,对工程进行仿真调试就可以直接看到效果
|