STM32F091空片编程后怎样直接运行用户代码
问题
某客户在其产品的设计中,使用了STM32F091RCT6。客户使用ST-Link 对STM32F091RCT6 进行编程,发现对空片进行编程之后,必须要重新上电才能运行用户代码;但是如果不是空片,则编程后就可以直接运行用户代码。由于客户的测试系统是直接烧写完芯片后在不断电的情况直接进入测试模式,如果空片烧写需要断电的话,带来一定的麻烦。客户希望搞明白这件事,并希望找到办法,能在空片编程后也可以直接运行用户代码。
调研
1.还原问题
在这里,使用带有STM32F091RCT6 的NUCLEO-F091RC 板来进行问题还原,将此Nucleo 板通过USB 线连接到电脑。打开STM32 ST-LINK Utility,点击"Connect to the target"按钮进行芯片连接,连接后打开一个准备好的LED 灯闪烁的.hex 文件代码,点击"Program verify"按钮准备进行编程。
在这里,我们勾选了"Reset after programming",目的在于编程后对芯片进行复位,可以运行用户代码。然后点击"Start"按钮开始进行编程。
编程之后,按道理可以看到LED 灯闪烁的,但是并没有出现。需要给MCU进行断电后,重新上电才能看到LED 灯闪烁。也就是说需要一次上电复位才能运行用户代码。
2.分析问题
先来回顾一下STM32F091 的参考手册RM0091 对于Empty Check 的描述:
首先,芯片内部存在一个查空标志,用来标志芯片是否为空片。这个标志位是在BOOT0 脚被定义到从Main Flash memory 启动的时候使用。当这个标志位被置"1"的时候,此芯片被认为是空的,系统将从Systemmemory 中启动Bootloader,以允许用户进行代码下载,即使现在BOOT0脚定义的是从Main Flash memory 启动。此标志位只在载入Option bytes 时更新:当地址0x0800 0000 读出的内容为0xFFFF FFFF 时,此标志位置"1",否则为"0"。这意味着当烧写完一个空片后需要在系统复位后执行用户代码的话,是必须要重新上电以产生或者在FLASH_CR寄存器中置位OBL_LAUNCH 来启动Optionbyteloader reset,以清除此查空标志。
现在就可以来分析目前所遇到的情况了:
当空片通过SWD 连接到ST-Link 进行烧写的情况下,由于上电时空片检测检测到此芯片为空片,查空标志被置位,所以系统此时从System memory 中启动Bootloader 开始运行。通过简单的SWD 接口对芯片进行编程,勾选的"Reset afterprogramming"将在编程结束后在RESET引脚上产生一个复位信号,但是不幸的是这个复位并不能清除查空标志,导致复位后仍然从System memory 中启动Bootloader,而没有运行用户代码,也就是我们之前遇到的现象。
一般情况下,我们都可以通过重新上电来产生POR 以清除查空标志,从MainFlash memory 启动运行用户代码。但是,客户目前的这种特殊需求就会带来一定的麻烦。还有一种应用也会比较麻烦,也就是使用锂电池的产品,而且这个电池直接焊接到用户板上,无法方便地进行断电上电。此时,若是空片是焊接在板子上进行在线编程,那么,问题来了。空片编程之后,由于不方便进行断电,而无法完成POR的动作,不能运行用户代码也就无法实现一个Option byte loader reset。查空标志无法清除,程序运行将锁死在System memory 的Bootloader。
3.问题解决
这种问题呢,解决方法当然有很多种,下面来大概地探讨一下:
1) 从生产上来解决:芯片在编程器上进行单独编程,之后再上板子,避开空片烧写后没有POR。
2) 从硬件上来解决:使用一个跳线,或者使用其他方式,比如在夹具上想办法,以达到通过人工的断电再连通上电,实现一个POR。需要在PCB 板上预留。大家可自行选择对策。但是这会增加生产上的麻烦,降低效率。
3) 从编程方法来解决:不使用ST-Link 进行编程,直接使用Bootloader 进行串口升级,升级后跳转到Main Flashmemory 去运行用户代码。需要在用户代码中加入将MainFlash memory 映射到0x0000 0000 的代码。
4) 前面几种方式大家一看就明白如果去解决了。但是,如果一定要使用ST-Link 通过SWD 进行烧写的话,就另当别论,我们下面来探讨这种方式。
一般看到这种问题,直观思维就是思考是否有办法,可以在ST-LINK 烧写后通过一定的ST-LINK命令跳转到用户代码去运行用户代码。方法看起来可行,但是有点复杂。第一,STM32 ST-LINKUtility 没有提供类似的功能,需要用户自行使用ST-LINK_CLI 命令;第二,需要在用户代码中加入别忘了将MainFlash memory 映射到0x0000 0000 的代码;第三,由于查空标志未清除,需担心意外的复位信号或干扰,导致复位后又跑回SystemMemory,还需要在用户代码中加入"每次运行都判断是否为OptionBytes Loader reset,如果不是,就直接执行一次Option BytesLoader reset以清除查空标志"。
- 盘点STM32-NUCLEO开发与仿真平台(03-28)
- 一种基于ZigBee和STM32的室内智能照明系统的设计(05-13)
- 大联大友尚集团推出ST STM32马达控制Nucleo开发工具包,可直接开始运转无刷直流马达(05-27)
- 这些VR设备“内脏”构造大解剖!绝对有你没见过的(02-14)
- 在变频空调风机中永磁同步电机矢量控制方案的运用(04-04)
- 基于STM32和SIM900A的无线通信模块设计(10-07)