打印
[APM32F0]

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

[复制链接]
871|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 多云转晴 于 2022-3-31 19:59 编辑

在对单片机的日常使用中,我们通常是在FLASH中存放程序,在SRAM中执行程序的。但生活不会永远一帆风顺,芯片的FLASH也不会一直安好;如果FLASH自身出现读写错误,那么写入的程序可能也会出现错误。这时候,我们就要调整思路,将程序存放到SRAM中来调试程序,下面将简单介绍如何在SRAM中存放和执行程序。(本次介绍以APM32F072RBT6作为典例示范)
首先,在极海官网找到型号表,并找出对应型号芯片的SRAM大小,详见图

打开KEIL软件,点击上方的“魔法棒”按钮,选择程序存放和执行的区域。如图二

由步骤一可以知道,APM32F072RBT6FLASH大小为128KSRAM大小为16K,经过计算机计算,可以得出FLASHSRAM的地址范围(FLASH基地址为0X08000000SRAM基地址为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
在硬件上,要将BOOT0BOOT1都引出为1(即连接VDD)。

到这里,软件和硬件的配置就结束了,这个时候我们就可以在通过SRAM进行程序调试了。

欢迎各位行业精英进行批评指正!















图三.png (89.32 KB )

图三.png

图四.png (336.31 KB )

图四.png

图一.png (151.9 KB )

图一.png

图二.png (308.45 KB )

图二.png

图五.png (142.95 KB )

图五.png

如何在SRAM中执行程序.pdf

573.55 KB

使用特权

评论回复
沙发
七毛钱| | 2022-4-1 09:37 | 只看该作者
讲解相当详细

使用特权

评论回复
板凳
zjh20070904| | 2022-4-1 14:36 | 只看该作者
有个疑问:system_apm32f10x.c 中的SCB->VTOR = FMC_BASE | VECT_TAB_OFFSET 还需要修改吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

17

帖子

0

粉丝