STMCU小助手
发布时间:2022-2-20 14:51
|
1 前言 本文将针对客户无法使用内置 Bootloader 的 DFU 方式进行固件升级的问题进行分析。 2 问题描述 客户使用的是 STM32F205VET6,做了个最小系统测试板,在 BOOT0=1,BOOT1=0 的情况下连接PC,使用 PC 端软件 DfuSeDemo 无法检测到 DFU 设备,但是同样在 Bootloader 模式下,却可以通过串口 1 进行固件升级。 3 问题分析! S9 Y" N- M4 Q; @4 ]2 v- d0 V 首先怀疑的是 USB 线路问题,因此,在却换到正常模式(BOOT0=0,BOOT1=0)时,使用 CubeMx 做了个简单的鼠标 HID 测试程序验证,结果发现在正常模式下测试程序是能正常运行的,从这点可以说明USB 不存在线路不通的问题。 其次,检查各个管脚的电平,VDD,BOOT0,BOOT1 均未发现异常。 于是打开应用文档 AN2606-STM32 microcontroller system memory boot mode.pdf,通过此应用文档可知,不同的 Bootloader 版本可用于固件升级的方式不尽相同,如 3.2 节如下内容: 0 b/ D1 z* y: n. N' @ `. |* |
u6 n! i2 ?, N4 h3 G$ u# e& C 因此怀疑此 MCU 的 BID 是否会不支持 DFU?通过上图可知,BID 可以通过 SWD 直接读取,因此我们需要找到保存此 BID 信息的地址。 通过应用文档 AN2606 3.2 节的表 3: 0 V" e, U9 N: A: H
如上图可知,STM32F2 的 Bootloader 存在两种 BID,可以通过地址为 0x1FFF77DE 这个地址的值来获取,如为 0x20 则只支持 USART,若为 0x33,则支持 USART,CAN,DFU 这 3 种方式。于是使用PC 端软件 STM32 ST-LINK Utility 通过 SWD 读取 0x1FFF77DE 这个地址的值,如下图所示: " ?+ M# ]2 Q9 R* x- c9 k
% u6 V/ x2 o( E. u 如上图,可见客户使用的 STM32F205 的 BID 为 0x33,是同时支持 USART,CAN 和 DFU 这 3 种方式的,因此,排除 Bootloader 版本问题的可能性。; q' J7 S5 Y% J+ a6 O0 i 在上述可能性都排除外,客户提出怀疑芯片本身或 Bootloader 烧录的代码有问题,于是找出一块STM32F4-DISCOVERY 板进行 MCU 替换,替换后的结果为 STM32F205 在放到 DISCOVERY 板上则能正常通过 Bootloader 的 DFU 方式进行固件升级,因此,这就明确排除了芯片本身问题的可能性,因此,只可能是用户板子外围电路的问题。 8 C5 v$ j* {& }$ Q4 }0 m 再次回到 AN2606 这个应用文档,在 15.2.2 节找到 Bootloader 的工作流程图,如下所示:
_+ ~) X# n( n; P! h2 H 通过上图可知,Bootloader 是依次检查 USART->CAN->DFU 的方式,怀疑 Bootloader 程序在 DFU 之前由于某种未知原因是否已经进入到 USAR 或 CAN 的方式中而一直没有出来? # U' S# W1 r: Z: [ 为了排除这种可能性,我们针对 USART1 的 RX 脚 PA10,USART3 的 RX 脚 PB11 和 PC11 拉高,同时将 CAN2 的 RX 脚 PB5 拉低进行测试,结果还是无法检测到 DFU 设备。! i) F4 d2 m M$ i, J) j. L 9 b+ q$ E; \5 e) p$ t . X0 B. n* v- q ]4 o: a 再次回到上图进行分析,如上图,若 USART 和 CAN 都没有检测到的话,Bootloader 程序会检测 USB线是否连接,然后检测外部 HSE,若 HSE 不存在,则产生系统复位,否则将会重现配置系统主频到60M。0 U+ h9 a5 S9 H9 C. L/ V+ D $ `; Y0 b5 h- Z" k1 e. A( P2 R: I , L6 b2 F2 X+ P I$ f! E7 x 由于我们是连着 USB 线且在正常运行模式下 USB 是能正常工作的,因此,这里检测 USB 线结果应该是通过的,于是按照程序流程,接下来检测外部 HSE,若检测失败则复位系统。与是用示波器查看VDD 与 NRST 脚的波形,发现系统在 VDD 上电后有 3 次复位,如此,可以得出 Bootloader 程序在检测外部 HSE 时结果为失败,如下: ! ^3 y4 N4 t. {1 `7 \4 C4 s2 j * m' c- }- s c+ u2 G' Y2 A6 p
% U) U& S( d" p 为什么会检测外部 HSE 失败? 用户使用的 HSE 是 8M 晶振,与 DISCOVERY 板一样都是 8M 外部晶振,对比用户的外部晶振电路与 DISCOVERY 的对应电路,如下图所示:( K" X( s: I5 B. Q/ U4 r * G# L' F+ q9 G4 T8 [
. x' q6 g+ Q/ S* ] 如上图,左边为客户板子的晶振电路,右边为 DISCOVERY 板的晶振电路,对比可知,用户的负载电容使用的是 33pF,且多了个 1M 的反馈电阻。7 j% Y/ P1 e6 S( I$ b5 r% N 首先将反馈电阻去掉后测试,结果还是一样。进一步将客户板子的晶振负载电容换成 20pF 后进行测试,结果可以正常检测到 DFU 设备,如此可见,正是因为这个负载电容的原因造成 Bootloader 的 DFU 无法正常工作!. g& H& E+ H: p* _ 4 总结$ [8 }8 g2 i$ R3 v& V: A( W 此问题是由于晶振负载电容过大,导致内置 Bootloader 程序在检测外部 HSE 的时间点与实际 HSE 稳定震荡所需的时间不同步造成,结果就是检测不到 HSE,进而引起系统复位,最终无法使用Bootloader 的 DFU 方式进行固件升级。 |
【经验分享】STM32语音识别的智能蓝牙音箱(源程序+原理图+PCB+设计说明书+PPT)
想找个ST芯片
[GPIO] 使用新型抽象开始C++嵌入式编程,从GPIO开始
技术手册stm32f1xx中的一个小问题
【经验分享】STM32 HAL库移植FreeModbus详细步骤
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
实战经验 | Keil工程使用NEAI库的异常问题
经验分享 | FDCAN数据段波特率增加后发送失败的问题分析
STM32几种流行开发环境的优缺点
好用软件推荐-TouchGFX Designer
微信公众号
手机版