STM32 MCU支持多种启动方式,在调试过程中,有时需要配置从SRAM启动,以避免总是擦除flash,影响寿命,网络上主要针对keil IDE做出很多攻略,在cubeide怎么实现一样功能的配置方法,根据自己的摸索,分享出来,希望能帮到需要的朋友。关于启动过程的详解网络上有很多资料,此处不做赘述。实现SRAM的几个关键点,以Nucleo-G474RE开发板每隔1s toggle io管脚闪LED灯为例。 (1)MCU boot配置要正确,否则,debug 重新reset后程序会跑飞,因为找不到正确的入口! }- @. h8 ~& E( ]8 }# F (2)要选用正确的链接脚本,创建工程时,会有2个ld后缀的链接脚本,分别对应于从flash启动和sram启动的脚本,有兴趣可以对比两个文件看看区别$ I* [, e( D4 T9 p& ` (3)编译时要define VECT_TAB_SRAM1 ^3 x- w. g6 i# s2 s7 }5 ^( B (4)debug config设置正确的程序PC。 下面结合一下截图说明一下具体的操作和分析。创建2个一样的工程,在/ ?& X0 b: }! D4 z. Y (a) c/c++ build中分别选不同的linker script,一个工程是STM32G474RETX_RAM.ld,另一个选STM32G474RETX_FLASH.ld; _/ G% t) w, E3 E5 Z8 ]: o2 f (b) gnu gcc compiler增加VECT_TAB_SRAM,编译两个工程,比较两个lst的文件,可以看出区别,固件的地址空间一个在flash+sram,另一个全在sram中。 (c) 从SRAM启动的工程还需在debug configuration的startup中填入specify vector table 0x20000000 通过以上三点,就可以从sram启动程序。 容易出错的几点说明6 u. {0 P* B( z3 t0 c (d)在从SRAM启动的工程中,如果没有设置define vect_tab_sram的话,程序在运行到hal_delay时会出错,因为它没有把中断向量表放到sram中% b1 b6 s' d0 Z% K$ v6 B; J1 W (e)如果mcu的boot启动方式设置是flash启动,先把flash擦除后,用sram启动的工程调试,第一次debug可以,再次用debug reset后,程序会报错地址0xfffffff9 0xfffffffe,因为再次启动flash没有程序,无法定位,启动不了 (f)如果mcu的boot启动方式设置是flash启动,flash中有程序,用sram启动的工程调试,第一次debug可以,再次用debug reset后,程序会运行报错,因为此时会从flash启动代码,但是不对,会运行部分代码,然后在无效机器码的地址停下来 (g)如果mcu的boot启动方式设置是sram启动,用flash启动的工程调试,再次用debug reset后,程序会运行报错地址0xfffffff97 a9 y k" F! U& b0 I $ M2 W. E# X9 W! ~: X& t# d, { 8 T2 K. i. a4 o" F) W7 e: |1 s* f |
你好,想问下这种方法只能用做调试时从SRAM启动,掉电后程序就丢失了。STM32CUBEIDE有没有哪里可以配置上电后先将代码从flash拷贝到ram中再运行 |