搜索
查看: 7409|回复: 3

[实战经验] 【实战经验】无法使用内置 Bootloader 的 DFU 方式进行固件升...

[复制链接]
  • TA的每日心情
    开心
    2018-2-6 09:20
  • 签到天数: 1 天

    [LV.1]初来乍到

    1182

    主题

    4967

    帖子

    1

    蝴蝶豆

    论坛元老

    最后登录
    2020-3-17
    发表于 2016-9-20 16:02:50 | 显示全部楼层 |阅读模式
    无法使用内置 Bootloader 的 DFU 方式进行固件升级


    1 前言
    本文将针对客户无法使用内置Bootloader的DFU方式进行固件升级的问题进行分析。


    2 问题描述
    客户使用的是STM32F205VET6,做了个最小系统测试板,在BOOT0=1,BOOT1=0的情况下连接PC,使用PC端软件DfuSeDemo无法检测到DFU设备,但是同样在Bootloader模式下,却可以通过串口1进行固件升级。


    3 问题分析
    首先怀疑的是USB线路问题,因此,在却换到正常模式(BOOT0=0,BOOT1=0)时,使用CubeMx做了个简单的鼠标HID测试程序验证,结果发现在正常模式下测试程序是能正常运行的,从这点可以说明USB不存在线路不通的问题。

    其次,检查各个管脚的电平,VDD,BOOT0,BOOT1均未发现异常。
    于是打开应用文档AN2606-STM32 microcontroller system memory boot mode.pdf,通过此应用文档可知,不同的Bootloader版本可用于固件升级的方式不尽相同,如3.2节如下内容:
    11.png

    因此怀疑此MCU的BID是否会不支持DFU?通过上图可知,BID可以通过SWD直接读取,因此我们需要找到保存此BID信息的地址。
    通过应用文档AN2606 3.2节的表3:
    12.png

    如上图可知,STM32F2的Bootloader存在两种BID,可以通过地址为0x1FFF77DE这个地址的值来获取,如为0x20则只支持USART,若为0x33,则支持USART,CAN,DFU这3种方式。于是使用PC端软件STM32 ST-LINK Utility通过SWD读取0x1FFF77DE这个地址的值,如下图所示:
    13.png
    如上图,可见客户使用的STM32F205的BID为0x33,是同时支持USART,CAN和DFU这3种方式的,因此,排除Bootloader版本问题的可能性。

    在上述可能性都排除外,客户提出怀疑芯片本身或Bootloader烧录的代码有问题,于是找出一块STM32F4-DISCOVERY板进行MCU替换,替换后的结果为STM32F205在放到DISCOVERY板上则能正常通过Bootloader的DFU方式进行固件升级,因此,这就明确排除了芯片本身问题的可能性,因此,只可能是用户板子外围电路的问题。
    再次回到AN2606这个应用文档,在15.2.2节找到Bootloader的工作流程图,如下所示:
    14.png

    通过上图可知,Bootloader是依次检查USART->CAN->DFU的方式,怀疑Bootloader程序在DFU之前由于某种未知原因是否已经进入到USAR或CAN的方式中而一直没有出来?

    为了排除这种可能性,我们针对USART1的RX脚PA10,USART3的RX脚PB11和PC11拉高,同时将CAN2的RX脚PB5拉低进行测试,结果还是无法检测到DFU设备。

    再次回到上图进行分析,如上图,若USART和CAN都没有检测到的话,Bootloader程序会检测USB线是否连接,然后检测外部HSE,若HSE不存在,则产生系统复位,否则将会重现配置系统主频到60M。

    由于我们是连着USB线且在正常运行模式下USB是能正常工作的,因此,这里检测USB线结果应该是通过的,于是按照程序流程,接下来检测外部HSE,若检测失败则复位系统。与是用示波器查看
    VDD与NRST脚的波形,发现系统在VDD上电后有3次复位,如此,可以得出Bootloader程序在检测外部HSE时结果为失败,如下:
    15.png

    为什么会检测外部HSE失败? 用户使用的HSE是8M晶振,与DISCOVERY板一样都是8M外部晶振,对比用户的外部晶振电路与DISCOVERY的对应电路,如下图所示:
    16.png

    如上图,左边为客户板子的晶振电路,右边为DISCOVERY板的晶振电路,对比可知,用户的负载电容使用的是33pF,且多了个1M的反馈电阻。
    首先将反馈电阻去掉后测试,结果还是一样。进一步将客户板子的晶振负载电容换成20pF后进行测试,结果可以正常检测到DFU设备,如此可见,正是因为这个负载电容的原因造成Bootloader的DFU无**常工作!


    4 总结
    此问题是由于晶振负载电容过大,导致内置Bootloader程序在检测外部HSE的时间点与实际HSE稳定震荡所需的时间不同步造成,结果就是检测不到HSE,进而引起系统复位,最终无法使用Bootloader的DFU方式进行固件升级。


    5 本文所涉及到的文档与软件下载链接
    AN2606 https://www.stmcu.org.cn/document/detail/index/id-200918
    DfuSeDemo https://www.stmcu.org.cn/document/detail/index/id-214339
    STM32 ST-LINK Utility https://www.stmcu.org.cn/document/detail/index/id-215840


    点击下载文档
    查看更多实战经验

    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    4

    帖子

    0

    蝴蝶豆

    新手上路

    最后登录
    2017-2-7
    发表于 2016-10-8 16:53:47 | 显示全部楼层
    这个分析的好,厉害
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    38

    主题

    580

    帖子

    0

    蝴蝶豆

    金牌会员

    最后登录
    2023-8-23
    发表于 2016-10-8 18:25:08 | 显示全部楼层
    问题分析的很透彻,学习了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9

    主题

    109

    帖子

    2

    蝴蝶豆

    金牌会员

    最后登录
    2020-5-14
    发表于 2016-12-15 15:07:58 | 显示全部楼层
    谢谢分享啊~
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

    GMT+8, 2024-4-27 21:45 , Processed in 0.187182 second(s), 40 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表