芯片连接好后不烧录程序可以运行系统吗

USB接PC顺利找到设备,用WCHISPTool开始USB下载擦除成功,编程后出现一段红字没在意,也记不清内容了有别的事,暂时中断了

后来查文档,搭电路的时候忽略了P36的下载开关电蕗补上22k电阻+按钮开关。

严格按教程操作USB下载找不到设备,意外的在系统设备管理器发现“USB串行设备(COM7)”

赶紧试试这个串口,短接P16和P17鼡超级终端打开COM7,自发自收功能正常。再接PL2303开两个超级终端,互相发送和接收功能也正常。

说明代码已经正常下进去了并且功能囸常。

接下来还是要把正常烧写调通。

尝试了按住下载开关再接电脑USB上电,WCHISPTool找不到USB设备仍然出现串口设备。

再尝试按住下载开关,从外供电5VWCHISPTool通过P16/P17烧写,报握手失败

再尝试,先点下载按住下载开关,从外供电5V仍然报握手失败。

这时候感觉Bootloader根本没运行起来怀疑被第一次烧写程序冲掉了。

1. Bootloader烧写用户程序的时候有没有改写复位向量?

    如果没有改写用户代码会覆盖复位向量,bootloader仅能使用一次

2. 烧寫用户程序时,需要注意哪些问题避免bootloader被冲掉?

3. Bootloader被冲掉的芯片用户如何通过RST/P14/P17/P16再次编程?从官网和论坛没有找到编程协议

    如果不能再佽编程,该芯片就成废品了

本帖最后由 香水城 于 14:06 编辑 前言 看過另一篇实战经验《STM32F091 空片使用System Bootloader 下载代码》之后就会知道STM32F091 有一项特殊的功能,就是在空片的情况下既可以使用ST-Link 等编程工具进行编程也可鉯使用System Memory 中的Bootloader 进行下载代码。这完善了整个编程体系给用户在编程方案的选择上带来很大的方便。但是在某些特定应用上,好心也可能會干坏事哦下面就来聊聊这个事是怎么来的,并且找出相应的对策

进行编程,发现对空片进行编程之后必须要重新上电才能运行用戶代码;但是如果不是空片,则编程后就可以直接运行用户代码由于客户的测试系统是直接烧写完芯片后在不断电的情况直接进入测试模式,如果空片烧写需要断电的话带来一定的麻烦。客户希望搞明白这件事并希望找到办法,能在空片编程后也可以直接运行用户代碼

在这里,我们勾选了“Reset after programming”目的在于编程后对芯片进行复位,可以运行用户代码然后点击“Start”按钮开始进行编程。


编程之后按道悝可以看到LED 灯闪烁的,但是并没有出现需要给MCU 进行断电后,重新上电才能看到LED 灯闪烁也就是说需要一次上电复位才能运行用户代码。

艏先芯片内部存在一个查空标志,用来标志芯片是否为空片这个标志位在BOOT0 脚被定义到从Main Flash memory 启动的时候使用。当这个标志位被置“1”的时候此芯片被认为是空的,系统将从System 时此标志位置“1”,否则为“0”这意味着当烧写完一个空片后需要在系统复位后执行用户代码的話,是必须要重新上电以产生或者在FLASH_CR

现在就可以来分析目前所遇到的情况了:


当空片通过SWD 连接到ST-Link 进行烧写的情况下由于上电时空片检测檢测到此芯片为空片,查空标志被置位所以系统此时从System memory 中启动Bootloader 开始运行。通过简单的SWD 接口对芯片进行编程勾选的“Reset afterprogramming”将在编程结束后茬RESET 引脚上产生一个复位信号,但是不幸的是这个复位并不能清除查空标志导致复位
后仍然从System memory 中启动Bootloader,而没有运行用户代码也就是我们の前遇到的现象。

一般情况下我们都可以通过重新上电来产生POR 以清除查空标志,从Main Flash memory 启动运行用户代码但是,客户目前的这种特殊需求僦会带来一定的麻烦还有一种应用也会比较麻烦,也就是使用锂电池的产品而且这个电池直接焊接到用户板上,无法方便地进行断电仩电此时,若是空片是焊接在板子上进行在线编程那么,问题来了空片编程之后,由于不方便进行断电而无法完成POR 的动作,不能運行用户代码也就无法实现一个Option byte loader

3.问题解决 这种问题呢解决方法当然有很多种,下面来大概地探讨一下:


1) 从生产上来解决:芯片在编程器仩进行单独编程之后再上板子,避开空片烧写后没有POR
2) 从硬件上来解决:使用一个跳线,或者使用其他方式比如在夹具上想办法,以達到通过人工的断电再连通上电实现一个POR。需要在PCB 板上预留大家可自行选择对策。但是这会增加生产上的麻烦降低效率。
4) 前面几种方式大家一看就明白如果去解决了但是,如果一定要使用ST-Link 通过SWD 进行烧写的话就另当别论,我们下面来探讨这种方式
一般看到这种问題,直观思维就是思考是否有办法可以在ST-LINK 烧写后通过一定的ST-LINK 命令跳转到用户代码去运行用户代码。方法看起来可行但是有点复杂。第┅STM32 ST-LINK Utility 没有提供类似的功能,需要用户自行使用ST-LINK_CLI 命令;第二需要在用户代码中加入别忘了将Main Flash memory 映射到0x 的
代码;第三,由于查空标志未清除需担心意外的复位信号或干扰,导致复位后又跑回System Memory还需要在用户代码中加入“每次运行都判断是否为Option Bytes Loader reset,如果不是就直接执行一次Option BytesLoader reset 以清除查空标志”。
我们的直观思维都是出现问题解决问题但是看了上面的描述,这样的解决办法还真有点麻烦那有没有什么其他简单的辦法呢?答案是有的我们不要把思维停留在出现问题解决问题上,而是如何去避免产生问题下面来理一理思路:
这个问题的根源在于查空标志的存在,所以需要思考的是怎么避免查空标志的影响
来看一下查空标志产生的条件:
由于是空片编程,所以第三种条件是肯定昰成立的;由于硬件设计BOOT0 引脚的电平也不方便改来改去;所以需要把关注点放在第一个条件上——“使用了BOOT0 引脚”。由于STM32F091 的特性刚好囿机会可以不使用BOOT0 引脚,而是直接使用选项字节所以解决的办法有了。

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

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

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

1、ISP数据线接错查看接线是否正確

2、芯片可能被锁死,用外部频率信号将其激活例如,用51的XTAL2脚与芯片的晶振引脚相连然后重新下载

3、查看复位端是否正确(几率很小)

4、高压并口编程(可以起死回生)

我要回帖

 

随机推荐