拿到野火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开发板吧,MCU为STM32F103RCT6,FLASH为256K,RAM为48K,在使用RAM调试的时候,由于不会用到FLASH,所以需要将48K的RAM进行分割,拿一部分空间用来代替FLASH的功能,用另一部分空间来代替RAM的功能。
这个是我从野火的例程中随便找了一个串口例程。
程序功能:上电串口打印出一串字符。然后在串口接收中断中,将串口接收到的数据通过串口发送出来。
为什么我没找LED的例程?
因为,我想顺便试试,中断是不是也能在RAM调试中很好的被使用。
程序编译完成后可以看到,整个程序需要占空的空间如下:
ROM(Flash) size = Code + RO-data + RW-data =4648 byte =4.5 K
RAM size = RW-data + ZI-data =1072byte =1.05K
根据上面的数据,结合自己的经验,我决定把48K的RAM分割成40K+8K的模式,即用40K来代替FLASH的功能,用8K来空间来实现RAM的功能。
第一步,在原有的工程里面新建一个RAM的项目,并切换到RAM项目
第二步,配置RAM项目的工程参数。
这里的IROM1的起始地址就是RAM的起始地址,0x20000000尺寸大小为40K=0xA000
IRAM1的地址地址就是RAM剩下的地址,0x2000A000,尺寸大小为8K=0x200.
注意:地址是0x2000 0000,我在第一次使用的时候,把地址写成了0x2000000,少些了一个0,折腾我好几个小时。
第三步,使能中断向量表,重定义到RAM里面。
通过system_stm32f10x.c文件中的代码可以看到,使能了中断向量表重映射之后,其Vector起始地址被定义到0x2000 0000
第四步,Linker里面保持默认就可以,最好不要修改。
第五步,设置DEBUG
首先选择自己的仿真器类型,我这里使用的是JLINK
然后加载配置文件。我是将配置文件放在工程目录下
如果取消LOAD %L INCREMENTA和g, main 的注释,则Load Application ar Startup和Run to main()就可以不用打勾
另外,LOAD %L INCREMENTA 与LOAD CpuRAM\obj\output.axf INCREMENTAL 这两句是等效的,任意一句都可以,用LOAD CpuRAM\obj\output.axf INCREMENTAL 需要注意工程的axf文件的路径。建议使用LOAD %L INCREMENTA语句。
关于这句的用法,可以查看“Vision Help”
第六步,设置setting里面红色标记的,实际上对RAM调试没有影响。
在网上有的教程里说,红色部分的必须勾选,或者不能勾选。经过我实测,勾选与部勾选都可以。
同样,还有的说法是必须选择Do not Erase ,RAM的算法规则地址必须要改,编程芯片选择也必须删掉,经过我实测,同样不会有影响。
我的选择Erase Sector状态系,FLASH的内容没有变化,因为在ROM的地址,我已经设置为0x20000000
第七步,设置Utilities
Update Target before debugging 这个绝对不能勾选,另外一个可以勾选也可以不勾选。
最后一步,就是回到工程,点击DEBUG就可以,实现RAM调试。
注意,不要点击“下载”,RAM调试的时候下载是不能用的。
串口中断收发正常、GPIO也正常。到这里就可以实现RAM仿真程序了。
最后,在说说STM32的BOOT0 、BOOT1引脚的电平。
根据手册,单片机从RAM启动,需要将BOOT0、BOOT1设置为高电平。但是在实际使用过程中,BOOT0、BOOT1即使设置为高是,单片机依然不能正常的从RAM启动。通过硬件仿真,可以看打PC指针与SP指针值并没有只在RAM范围内。所以才需要DebugRAM.ini文件进行引导和加载。
通过DebugRAM.ini引导加载之后,实际上的BOOT0、BOOT1电平就显得无用了,故BOOT0、BOOT1都为0的时候,依然能够实现RAM调试仿真。
|