历史上的今天
今天是:2025年01月30日(星期四)
2019年01月30日 | 在RAM中调试STM32程序的配置方法
2019-01-30 来源:eefocus
早就听说可以在RAM中调试STM32程序了,直到昨天晚上看了个视频,自己也想来试试。乘热打铁,今天上午跑到实验室,从网上下载资料,凭着零星的记忆开始配置。不过任何事情都不是一次成功的,这次也不意外。But经过反反复复修改,查资料,修改,查资料。还是成功啦!下面就把我配置的一些经验,结合网上已经有的一些资料傻瓜式总结出来,希望所有像我这样的初学者能够少走弯路。。。。。。
先说说在RAM中调试STM32程序的好处吧!
1. 可以单步调试程序,并且不用像仿真调试那样需要去查看繁琐的寄存器位,直接可以通过实验现象来Debug。
2. 避免擦写Flash次数限制,虽然Flash的烧写次数高达1000次以上,但是也经不起小白程序员的折腾呀!!!!!
好了,关键步骤开始了。
一、 硬件配置。
我想大多数的人最开始想到在RAM中调试程序的时候都认为跟BOOT[1:0]有关吧!我也一样,直到我看到一篇博文。

大家可以放心这句话的真实性,我已经试了,确实是与BOOT[1 :0]选择无关。
说了这么多废话,其实就是说不用管硬件配置!!!!!!
二、 软件配置。
1、 准备
(1)将Keil安装目录下:D:\Keil\ARM\Boards\Keil\MCBSTM32\STLIB_Blinky的RAM.ini文件拷贝到需要调试的工程目录下。
(2)在工程目录下新建文件夹Ramout。

(3)修改RAM.ini文件:将红圈处改为“工程名.axf”就行了。如果没有找到该文件不要怕,自己在文本编辑器里面写一个,就几行保存为.ini格式就行了。

2、 IDE软件配置
(1) 单击启动如下对话框,并按照下图配置。

(2) 如果按照上述配置方式配置成功后,KEIL配置模式会变为SRAM。

(3) 单击,按照以下步骤一步一步进行配置。
(4)

作者Liunus是用的ST公司的STM32F103VC,其Flash是256KB,SRAM 是48KB。记清楚了哟,特别是SRAM大小,这个与后面分配空间有关系。因 为我们将程序也放到SRAM中,所以需要将SRAM分为两个部分;一个部分 用于存放程序代码,另一个部分用于存放程序运行中的数据。
256(KB)=256*1024 (byte) =262144 (byte) 转换为16进制:40000
48(KB)=48*1024(byte)=49152(byte)转换为16进制:C000
所以FLASH的总大小为40000,SRAM总大小为C000。
从CORTEX_M3内核资料我们可以获知,FLASH的起始地址是0x08000000; SRAM的起始地,0x2000000。
(5)

(6)上图是将程序下载到FLASH中,所以Read/Only Memory Areas起始地址是0x800 0000,大小0x4 0000;Read/Write Memory Areas起始地址是0x2000 0000,大小0xC000;但是我们是在SRAM中进行调试,所以需要修改这两个区域,结果如图下图:

至于为什么这样分配,这都是大神们根据自己做项目的经验总结的,我们可以不必深究。不过也很简单,首先SRAM的起始地址是0x2000 0000,Read/Only Memory Areas是从0x2000 0000开始的。根据程序编译结束后生成的报告只要满足Read/Only Memory Areas区大于CODE 加上 RO-DATA;Read/Write Memory Areas区大于 RW-DATA 加上 ZI-DATA就行了。

(7)

(8)如果程序中使用了中断,需要在如图红框中加入VECT_TAB_RAM。因为我目前的工程没有用中断,所以我填入的是RAM_MODE REMAP。其实这里没定义也没有关系,还可以在程序开头定义如:#define VECT_TAB_RAM

(9)

(10)

(11)在Debug标签栏下,点击settings,然后再选择Flash Download出现如下窗口。

(12)

三、 调试程序。
经过上面一系列的配置,我们已经完成95%了。现在我们要做的最后一步就是编译、下载、调试了。But在编译之前,建议大家做以下几步,避免出错。
1、 确保整个建立过程是在SRAM环境下进行的,需检查第(2)步。
2、 确保SRAM大小分配正确,并且认真检查有没有马虎造成的地址大小分配错误,需检查第(6)(9)(11)步。
好啦,可以编译啦。编译通过后,下载,调试。
你就可以像使用仿真工具一样的进行仿真了

下图是运行时的图片,可以看到,程序是在SRAM区。(汇编地址是0x2xxx xxxx)

四、 参考资料
网上有很多好的博客和好的资料,下面推荐几个。Liunus就是通过反复查看资料才配置好的。所以大家在看Liunus资料配置不成功时可以参考网上资料。
史海拾趣
|
1.开关柜的型号识别 机电部于1983年制定了JB/DQ4085开关柜型号编制办法的部标。自此以后开发的新产品按此规定编制型号,使型号管理走上科学化。 开关柜的型号有二种:一种叫产品型号,用字母来代表 ...… 查看全部问答> |
|
作者:裘荟荟 他曾经是一位IC设计工程师,他勇于想象,敢于挑战权威,在他35岁时,他创造出一个改变半导体产业格局的新器件,缔造出一个新的半导体帝国,但41岁时,他英年早逝,将财富、景仰与遗憾留于后人。 他,就是FPGA的发明人了,Ross Freem ...… 查看全部问答> |
|
我手头有一个A/D采集的模块。这个A/D是外部扩展的A/D(不是2440自带的A/D模块),这个扩展模块有12位的并行数据总线,直接挂在2440的数据总线上面。还有一个开始启动脚,一个转换完成脚,一个读使能脚。它内部没有缓存,也就意味着每转换一次,都要 ...… 查看全部问答> |
|
7月流火!天气是越来越热了,再有一个星期就是小暑了,也就开始了一年中最热的3伏天了! 在这个“火热”天气里,ADI又给大家的情绪再加了一把火--ADI实验室大赛! ADI实验室电路DIY大赛正在如火如荼的进行!大家的积极性 ...… 查看全部问答> |
|
链路层中有这种规定:SOF之后如果EOF到来之前出现了SYNCp,那么就认定此帧结束,双方进入IDLE,等待下一帧。 问题:硬盘在何种情况下会结束此次帧发送?… 查看全部问答> |
|
带LED典型状态(电池充饱百分比)显示的锂电充电管理/移动电源方案说明 方案概述 本方案广泛应用于手机,MP3,MP4等数码产品充电,5V的电源接入输入端,唤醒MCU,从而进入充电模式,电量由充电IC将电量存储在锂电池中,当有负载插入时,当MCU会检测到有负载接入,则进入放电模式,MCU打开升压IC,把锂电池的电压升高 ...… 查看全部问答> |




