LOADING

加载过慢请开启缓存 浏览器默认开启

在RAM中调试

2024/5/1 MCU

在RAM中调试的好处?

FLASH的擦除寿命

需要了解的是FLASH的擦除次数有限,例如:STM32g0xx的擦除耐力大约在10K次。

而每次烧录程序是会对 部分 / 所有 扇区进行擦除然后再写入的,虽然10K是一个较大的值,假设每天烧录百次也需要百天才会损耗掉频繁使用的区域。
但更具有优势的是把程序放在RAM中运行,并不用担心擦除耐力这个问题。不止于此,在RAM中烧录程序会非常迅速,因为省去了擦除FLASH操作所带来的时间。

操作步骤

设置启动地址

STM32中可以设置 BOOT引脚 / 选项字节 使MCU在不同的地址区域上电运行。

  • 通过BOOTx来设置启动地址。
  • 通过BOOT选项字节来设置启动地址。

链接设置

虽然设置了MCU上电在RAM中启动,但是需要仔细的是编译之后生成的文件并没有全部正确的链接到RAM所属的地址当中。这时需要修改ld文件,将所有的分区映射到RAM当中。

  • 这里仅演示部分修改。

修改之后,编译输出信息里会观察到FLASH占用为0%

Debug设置

如果顺利完成上述中设置启动地址链接设置这两步,并且烧录后进行软复位(复位PC等寄存器),程序会正常运行,但是看上去似乎和在FLASH中运行没有区别。因为即便是烧录到FLASH中,程序也会“搬移”到RAM中运行,所以大多数情况在RAM或者FLASH中调试结果区别不大。

那如何判断之前的工作是否成功呢?一个有效的办法是在程序运行时,观察PC的值是否如所愿——在RAM所属的地址区域内变化。

  • 在示例图中:PC值为0x20000226,值得高兴的是,这属于RAM的地址——告示着,配置工作成功完成了。

一些Bug

因为笔者不久前成功完成了一款Wireless DAP-Link的制作, 无线 / 有线 模式工作正常。但是当笔者想要在RAM中烧录时候却出现校验不通过问题,惊奇的是在调试模式及退出后程序都是如期进行的。

  • ST-LinkJ-Link在烧录程序时候非常顺利。
  • DAP-Link需要按住RST并在烧录过程中松开。或许这样避开了校验