引言 有客户反映,STM32G071RBT6 在使用 STM32CubeProgrammer 烧录完程序后只能运行一次,复位后,程序无法运行,如果掉电后重新上电,程序恢复正常。 问题描述 根据客户描述,该问题可通过以下步骤复现: 7 t- F& w8 W) M9 M5 v H9 Q6 x2.1. 测试代码的功能流程图 准备测试代码 App1 和 App2: ; q% V- m4 H3 B4 b, _9 T3 _5 m 2.2. 问题复现步骤 操作步骤 (1) 在 STM32CubeProgrammer 中下载 应用程序 App1(如图 3),并设置 RDP=1(如图 4);然后断开 STM32CubeProgrammer 的连接,板子断电后重新上电; (2) 根据 log 提示(如图 5),按下用户按键,板子会在 RDP 降级的过程中,产生全片擦除的动作,等待 10s,确保芯片擦除完成后从板子再断电并重新上电; 9 P0 ^/ B4 q" i6 N7 x(3) 使用 STM32CubeProgrammer 重新连接板子,在下载界面选中“Run afterprogramming”后,下载应用程序 App2(如图 6),下载完成后,可以看到板子执行闪灯的效果,并从 App2 的 log 信息可知,此时的 empty check 位被置起(如图 7)。 (4) 在不断电的情况下,如果直接按下外部复位按钮,程序将出现无法执行的现象。 问题解决 通过问题的复现,我们注意到,程序无法正常运行时,实际进入了内置的 ISP 程序,即内置的 bootloader 程序。为什么会进入 bootloader 呢?在 G0 的参考手册中,我们注意到 empty check 的描述如下: 这里的描述有两点是很重要的。 ( Y# F8 w$ t# q0 E* S A :出厂的芯片,因为是没有程序的空片,empty check 位是被置位的,但实际电路中因 boot 管脚定义的程序从 Main Flash 启动的场景时,程序会由于 empty check 位而强制从内置的 bootloader 启动。 B :empty check 只会在加载 OptionByte 时更新,所以在空片上下载完程序后,应当通过 power on reset 或者手动清除该位,程序才可以正常运行。 4 C: s8 [" `- r7 h/ i P2 I我们来验证一下,在复现问题的第(4)步中,如果先按下用户按钮,应用程序 App2会通过软件清除 empty check 位,再通过外部复位按钮,则程序正常运行, 根据 log 信息可以看到 empty check 位被清除(如图 9),且程序运行恢复正常。 4 n% D# u7 y' I# s) s U* L2 I7 p( p2 o9 x5 D% H9 o 小结 本文描述的问题虽然隐藏的比较深,但规律还是很明显的,只要重新上电即可恢复,说明很可能和 power on reset 有关。在参考手册中搜索 power on reset 关键字,可以很快的找到一些线索。所以分析问题时,要多关注这样的有规律的问题信息。 |
STM32固件库分享,超全系列整理
STM32G030F6P6基于HAL库模拟SPI驱动1.8寸TFT LCD屏幕
STM32的CAN FD位定时设置注意事项
基于STM32将移植 SBSFU 到 STM32G070过程分享
基于STM32G030 RAM不够用经验分享
STM32G070在OLED上移植U8G2单色GUI
【经验分享】STM32 IAP+Ymodem功能实现(参考官方代码)
【经验分享】STM32的SPI问题
【经验分享】STM32 的加密实现
STM32G070—使用platformio+arduino