在 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
的地址。