1760|0

2015

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

测评STM32“鸡肋”的RAM调试 [复制链接]

        拿到野火MINI STM32开发板有一段时间了,这个开发板是上次社区“RTT开发者大会直播,深度体验RT-Thread”直播间抽奖得到的,感谢社区!

         开发STM32有好几年了,每次都是毫无意外的使用FLASH调试,RAM调试一次都没有使用过,RAM调试好像显得有点“鸡肋”了,本次也是抱着仅学习和尝试的目的了解一下,以备不时之需。

 

RAM调试的优点:

Ø  下载速度超快。在使用FLASH的时候,由于需要擦除扇区,所以需要一定的时间。但是使用RAM调试的时候,无需这个过程,所以下载速度很快

Ø  可以延长FLASH的寿命。单片机的FLASH擦写寿面最小在10K个循环,“延长寿命”这个说法是没有问题,但是实际上,没有太多的意义,10K次,假设10S烧录一次,那至少也得不吃不喝连续烧录27个小时;实际项目开发一个单片机也就烧录几十上百次就完成了开发项目,所以RAM调试意义不大。

Ø  RAM调试不会更改和破坏单片机FLASH原有的程序,某些特殊场合可能会用到。

 

RAM调试的缺点:

Ø  程序断电、或者引脚复位,程序就丢失了。

Ø  RAM空间尺寸要比FLASH小很多,所以,RAM调试的代码尺寸有限

 

         可能就第一条缺点,就注定了RAM调试显得有点“鸡肋”,但是作为一种技术,可以去抱着学习的心态,去了解和学习,说不定某天公司研发要求使用必须使用RAM调试呢(网上好像看到这样的公司)。

        

         本次测试就拿野火MINI STM32开发板吧,MCUSTM32F103RCT6FLASH256KRAM48K,在使用RAM调试的时候,由于不会用到FLASH,所以需要将48KRAM进行分割,拿一部分空间用来代替FLASH的功能,用另一部分空间来代替RAM的功能。

 

这个是我从野火的例程中随便找了一个串口例程。

程序功能:上电串口打印出一串字符。然后在串口接收中断中,将串口接收到的数据通过串口发送出来。

为什么我没找LED的例程?

因为,我想顺便试试,中断是不是也能在RAM调试中很好的被使用。

11.jpg

 

程序编译完成后可以看到,整个程序需要占空的空间如下:

         ROM(Flash)     size = Code + RO-data + RW-data   =4648 byte       =4.5 K

         RAM               size = RW-data + ZI-data                            =1072byte        =1.05K

         根据上面的数据,结合自己的经验,我决定把48KRAM分割成40K+8K的模式,即用40K来代替FLASH的功能,用8K来空间来实现RAM的功能。

 

第一步,在原有的工程里面新建一个RAM的项目,并切换到RAM项目

22.jpg

33.jpg

 

第二步,配置RAM项目的工程参数。

44.jpg

 

这里的IROM1的起始地址就是RAM的起始地址,0x20000000尺寸大小为40K=0xA000

IRAM1的地址地址就是RAM剩下的地址,0x2000A000,尺寸大小为8K=0x200.

 

注意:地址是0x2000 0000,我在第一次使用的时候,把地址写成了0x2000000,少些了一个0,折腾我好几个小时。

 

第三步,使能中断向量表,重定义到RAM里面。

55.jpg

 

通过system_stm32f10x.c文件中的代码可以看到,使能了中断向量表重映射之后,其Vector起始地址被定义到0x2000 0000

66.jpg

 

第四步Linker里面保持默认就可以,最好不要修改。

77.jpg

第五步,设置DEBUG

81.jpg

 

 

首先选择自己的仿真器类型,我这里使用的是JLINK

然后加载配置文件。我是将配置文件放在工程目录下

82.jpg

 

83.jpg

 

         如果取消LOAD %L INCREMENTAg, main 的注释,则Load Application ar StartupRun to main()就可以不用打勾

         另外,LOAD %L INCREMENTA  LOAD CpuRAM\obj\output.axf INCREMENTAL 这两句是等效的,任意一句都可以,用LOAD CpuRAM\obj\output.axf INCREMENTAL 需要注意工程的axf文件的路径。建议使用LOAD %L INCREMENTA语句。

 

关于这句的用法,可以查看“Vision Help”

84.jpg

 

 

第六步,设置setting里面红色标记的,实际上对RAM调试没有影响。

85.jpg

 

 

在网上有的教程里说,红色部分的必须勾选,或者不能勾选。经过我实测,勾选与部勾选都可以。

86.jpg

 

同样,还有的说法是必须选择Do not Erase ,RAM的算法规则地址必须要改,编程芯片选择也必须删掉,经过我实测,同样不会有影响。

         我的选择Erase Sector状态系,FLASH的内容没有变化,因为在ROM的地址,我已经设置为0x20000000

第七步,设置Utilities

87.jpg

 

Update Target before debugging 这个绝对不能勾选,另外一个可以勾选也可以不勾选。

 

最后一步,就是回到工程,点击DEBUG就可以,实现RAM调试。

90.jpg

 

注意,不要点击“下载”,RAM调试的时候下载是不能用的。

91.jpg

 

串口中断收发正常、GPIO也正常。到这里就可以实现RAM仿真程序了。

 

最后,在说说STM32BOOT0 BOOT1引脚的电平。

92.jpg

 

 

       根据手册,单片机从RAM启动,需要将BOOT0BOOT1设置为高电平。但是在实际使用过程中,BOOT0BOOT1即使设置为高是,单片机依然不能正常的从RAM启动。通过硬件仿真,可以看打PC指针与SP指针值并没有只在RAM范围内。所以才需要DebugRAM.ini文件进行引导和加载。

通过DebugRAM.ini引导加载之后,实际上的BOOT0BOOT1电平就显得无用了,故BOOT0BOOT1都为0的时候,依然能够实现RAM调试仿真。

 
点赞 关注

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表