测评STM32“鸡肋”的RAM调试

RAM调试 STM32 野火MINI
川楠
发布时间: 2019-01-22
阅读: 3469

        大家好,拿到野火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调试仿真。


原创作品,未经权利人授权禁止转载。详情见转载须知 举报文章

点赞 (0)
川楠 擅长:单片机综合应用 硬件设计
评论(0)

登录后可评论,请 登录注册

相关文章推荐
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回

我要举报该内容理由

×
请输入您举报的理由(50字以内)