0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32F091空片编程后怎样直接运行用户代码

STM32单片机 来源:未知 作者:佚名 2017-08-31 14:16 次阅读

问题
某客户在其产品的设计中,使用了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以清除查空标志”。


我们的直观思维都是出现问题解决问题,但是看了上面的描述,这样的解决办法还真有点麻烦。那有没有什么其他简单的办法呢?答案是有的,我们不要把思维停留在出现问题解决问题上,而是如何去避免产生问题。下面来理一理思路:

这个问题的根源在于查空标志的存在,所以需要思考的是怎么避免查空标志的影响?
来看一下查空标志产生的条件

a) 使用了BOOT0 引脚;
b) BOOT0 引脚为低电平,启动区域指向MainFlash memory;
c) 读取0x0800 0000 地址的值为0xFFFF FFFF;


由于是空片编程,所以第三种条件是肯定是成立的;由于硬件设计,BOOT0 引脚的电平也不方便改来改去;所以需要把关注点放在第一个条件上——“使用了BOOT0 引脚”。由于STM32F091的特性,刚好有机会可以不使用BOOT0 引脚,而是直接使用选项字节,所以解决的办法有了。

步骤如下:
i. 打开STM32 ST-LINK Utility,点击“Connect to the target”按钮进行连接;
ii. 从菜单“Target → Option Bytes”调出选项字节对话

将“nBoot0_SW_Cfg”的打勾去掉,点击“Apply”,改成使用选项字节中的nBoot0 和nBoot1 来控制启动区域
iii. 再打开需要烧写的代码文件,点击“Program Verify”按钮,对话框中勾选“Reset after programming”,点击“Start”完成烧写动作就可以了。

这样就可以看到用户代码已经在运行了,是不是很简单。
如果,希望更简单的完成,可以使用ST-LINK_CLI,写一个批处理文件,包含以下动作:

ST-LINK_CLI -c SWD UR

ST-LINK_CLI -ME

ST-LINK_CLI -p xxxxxxxx.hex-v “while_programming”

ST-LINK_CLI -OBnBOOT0_SW_Cfg=0

ST-LINK_CLI –Rst

ST-LINK_CLI.exe位于STM32 ST-LINK Utility 安装目录里,关于命令请参考《ST-LINKUtility UM.pdf》。

结论
由于查空检测机制,导致STM32F091 空片在使用ST-LINK编程后,不断电的情况下复位将回到System Memory,无法进入MainFlash memory 去运行用户代码。所以,在特殊应用中,如果无法进行断电再上电,需要使用办法对这种机制进行破坏。

处理

Boot 启动配置为用选项字节进行控制,而不是使用Boot0引脚,以此来破坏查空机制的影响。


建议
对于问题的解决,一般从两个方向进行思考:一是出现了问题再来找解决问题的办法;二是如何避免出现问题。很多时候,由于思维惯性,很多工程师可能会更喜欢直接从第一种方向去思考问题;然而,事实上,如果能从第二种方向思考,阻止问题的产生,那才是最好的办法。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2270

    文章

    10896

    浏览量

    355757
  • STM32F091
    +关注

    关注

    0

    文章

    4

    浏览量

    3341

原文标题:STM32F091空片编程后不能直接运行用户代码

文章出处:【微信号:STM32_STM8_MCU,微信公众号:STM32单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    请问引脚数相同的STM32F2的程序可以直接运行STM32F4的上吗?

    引脚数相同的STM32F2的程序可以直接运行STM32F4的芯片上吗?手册上说F4全兼容F2的软件
    发表于 03-27 07:43

    如何配置能够同时使用STM32F205,STM32F091,STM32F030支持的最大串口数?

    如何配置,能够同时使用STM32F205,STM32F091,STM32F030支持的最大的串口数?GPIO_AFR配置,无法利用最多的串口数
    发表于 03-28 07:55

    基于stm32f051的工程在stm32f091上不能运行

    基于stm32f051的工程在stm32f091上不能运行,不知道有什么办法可以解决?在stm32f051上的ucosii在091上执行会出
    发表于 09-05 14:41

    新手学STM32 kEIL软件安装没驱动

    刚入手了一块STM32f091,可kEIL软件安装没驱动,求大神指导
    发表于 09-11 09:31

    请问有STM32F091资料分享吗

    哪位朋友有STM32F091的数据手册,中文的。有的可以分享给我可以吗?
    发表于 09-11 10:58

    STM32F091 写数据重启

    程序中,对STM32F091进行数据写入操作时,会引起复位重启,请问有谁遇到过类似的问题,有什么解决办法吗,谢谢指教
    发表于 03-26 08:53

    STM32F091下载问题

    哪位用过STM32F091我最近在用,用JLINK下载不了,可能是工程问题,下载出现以下问题请问是咋回事
    发表于 11-01 08:57

    如何通过UART使用内部引导加载程序对STM32F091进行编程

    我想通过 UART (AN2606) 使用内部引导加载程序对 STM32F091 进行编程。我的特殊情况是我必须不从 PC 进行编程,它是另一个控制 STM32F091
    发表于 12-01 07:11

    STM32F091备份域是什么?

    我正在阅读 STM32F091 的参考手册,尤其是 RTC 章节。然后我查看了 CubeIDE 生成的(全部设置为 LL,而不是 HAL)初始化代码的作用。因此它具有此函数
    发表于 01-13 06:04

    STM32F091使用System Bootloader下载

    STM32F091使用System Bootloader下载代码
    发表于 12-07 18:17 0次下载

    proteus 调试MDK生成的HEX时不能直接运行的方法

    proteus 调试MDK生成的HEX时不能直接运行的方法
    发表于 09-22 15:16 4次下载
    proteus 调试MDK生成的HEX时不能<b class='flag-5'>直接运行</b>的方法

    直接运行图像压缩的处理代码

    图像压缩的处理代码,可直接运行
    发表于 02-05 14:36 0次下载

    解密运行外Flash中的app代码

    STM32L5的新特性 OTFDEC OnTheFlyDECrypt硬件可以实时解密外置OSPI Flash中的数据和代码,从而CPU能够直接运行外Flash上的加密
    的头像 发表于 09-09 13:54 2687次阅读

    DS10312_STM32F091xB STM32F091xC单片机数据手册

    DS10312_STM32F091xB STM32F091xC单片机数据手册
    发表于 11-23 20:24 1次下载
    DS10312_<b class='flag-5'>STM32F091</b>xB <b class='flag-5'>STM32F091</b>xC单片机数据手册

    ES0282_STM32F091xB和STM32F091xC单片机的局限性

    ES0282_STM32F091xB和STM32F091xC单片机的局限性
    发表于 11-23 20:38 0次下载
    ES0282_<b class='flag-5'>STM32F091</b>xB和<b class='flag-5'>STM32F091</b>xC单片机的局限性