[APM32F0] 基于APM32F072VB如何将程序代码放入RAM中运行

[复制链接]
 楼主| lc115647 发表于 2024-8-13 10:51 | 显示全部楼层 |阅读模式
本帖最后由 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存程序变量,堆和栈。
1723471113751.jpg
2、定义VECT_TAB_SRAM
在工程的Options for Target ->C/C++选项卡中加入VECT_TAB_SRAM宏定义:
1723471159780.jpg
3、定义USE MEMORY LAYOUT FROM TARGET Dialog
Linker选项卡中先不勾选USE MEMORY LAYOUT FROM TARGET Dialog,并设置R/O Base 和R/W Base 如下 :
1723471165411.jpg
修改完毕后勾选USE MEMORY LAYOUT FROM TARGET Dialog
1723471175994.jpg
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勾选
20240813102534.png
6、在工程的Options for Target ->Debug->Settings选项卡中按下图配置烧录规则/算法:
1723471186712.jpg
7、完成上述配置程序编译完对应的地址空间就在SRAM区间,对工程进行仿真调试就可以直接看到效果
1723471190535.jpg    









cpuram.rar

670 Bytes, 下载次数: 1

F072_RunRAM.rar

205.57 KB, 下载次数: 1

您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

26

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

19

主题

26

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部