<strong><font color="#004a85">引言</font> </strong>
有客户反映,STM32G071RBT6 在使用 STM32CubeProgrammer 烧录完程序后只能运行一次,复位后,程序无法运行,如果掉电后重新上电,程序恢复正常。
<strong><font color="#004a85">问题描述</font> </strong>
根据客户描述,该问题可通过以下步骤复现:
<strong>2.1. 测试代码的功能流程图 </strong>
准备测试代码 App1 和 App2:
<center><img src="http://mcu.eetrend.com/files/2022-03/wen_zhang_/100558628-246287-1.png&…; alt=“STM32G0 复位后死机"></center>
<center><img src="http://mcu.eetrend.com/files/2022-03/wen_zhang_/100558628-246288-2.png&…; alt=“STM32G0 复位后死机"></center>
<strong>2.2. 问题复现步骤</strong>
操作步骤
(1) 在 STM32CubeProgrammer 中下载
应用程序 App1(如图 3),并设置 RDP=1(如图 4);然后断开 STM32CubeProgrammer 的连接,板子断电后重新上电;
<center><img src="http://mcu.eetrend.com/files/2022-03/wen_zhang_/100558628-246289-3.png&…; alt=“STM32G0 复位后死机"></center>
<center><img src="http://mcu.eetrend.com/files/2022-03/wen_zhang_/100558628-246290-4.png&…; alt=“STM32G0 复位后死机"></center>
(2) 根据 log 提示(如图 5),按下用户按键,板子会在 RDP 降级的过程中,产生全片擦除的动作,等待 10s,确保芯片擦除完成后从板子再断电并重新上电;
<center><img src="http://mcu.eetrend.com/files/2022-03/wen_zhang_/100558628-246291-5.png&…; alt=“STM32G0 复位后死机"></center>
(3) 使用 STM32CubeProgrammer 重新连接板子,在下载界面选中“Run afterprogramming”后,下载应用程序 App2(如图 6),下载完成后,可以看到板子执行闪灯的效果,并从 App2 的 log 信息可知,此时的 empty check 位被置起(如图 7)。
<center><img src="http://mcu.eetrend.com/files/2022-03/wen_zhang_/100558628-246292-6.png&…; alt=“STM32G0 复位后死机"></center>
<center><img src="http://mcu.eetrend.com/files/2022-03/wen_zhang_/100558628-246293-7.png&…; alt=“STM32G0 复位后死机"></center>
(4) 在不断电的情况下,如果直接按下外部复位按钮,程序将出现无法执行的现象。
<strong><font color="#004a85">问题解决</font> </strong>
通过问题的复现,我们注意到,程序无法正常运行时,实际进入了内置的 ISP 程序,即内置的 bootloader 程序。为什么会进入 bootloader 呢?在 G0 的参考手册中,我们注意到 empty check 的描述如下:
<center><img src="http://mcu.eetrend.com/files/2022-03/wen_zhang_/100558628-246295-8.png&…; alt=“STM32G0 复位后死机"></center>
这里的描述有两点是很重要的。
A :出厂的芯片,因为是没有程序的空片,empty check 位是被置位的,但实际电路中因 boot 管脚定义的程序从 Main Flash 启动的场景时,程序会由于 empty check 位而强制从内置的 bootloader 启动。
B :empty check 只会在加载 OptionByte 时更新,所以在空片上下载完程序后,应当通过 power on reset 或者手动清除该位,程序才可以正常运行。
我们来验证一下,在复现问题的第(4)步中,如果先按下用户按钮,应用程序 App2会通过软件清除 empty check 位,再通过外部复位按钮,则程序正常运行, 根据 log 信息可以看到 empty check 位被清除(如图 9),且程序运行恢复正常。
<center><img src="http://mcu.eetrend.com/files/2022-03/wen_zhang_/100558628-246296-9.png&…; alt=“STM32G0 复位后死机"></center>
<strong><font color="#004a85">小结</font> </strong>
本文描述的问题虽然隐藏的比较深,但规律还是很明显的,只要重新上电即可恢复,说明很可能和 power on reset 有关。在参考手册中搜索 power on reset 关键字,可以很快的找到一些线索。所以分析问题时,要多关注这样的有规律的问题信息。
来源:<a href="https://mp.weixin.qq.com/s/23ovqwny1vxWu0NQIUUerg">STM32单片机</a>
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。