前言0 D8 |- ]5 V/ b. p4 C 众所周知,STM32 所有的 MCU 中包含 Bootloader 代码,可以通过对 boot 引脚(boot0,boot1)的配置从 bootloader 启动,通过 spi/i2c/usb 等升级片内 FLASH,从而实现版本升级的目的。但是通过 USB 升级的时候,在低温(零下 10 摄氏度以下)的情况下,出现升级失败的情况,很容易出现。" N2 \7 S/ F4 R! |1 M* W8 q1 j 问题现象3 q+ D- C/ B0 v7 h2 ] 通过 bootloader usb 升级时,在温度低的情况下,发现有一部分芯片升级失败,而且重新尝试,仍然升级失败。 & u0 S2 {4 I: E+ B; i0 `1 R 原因分析 考虑到用户的量很大,而且问题都是出现在低温的环境下,所以基本排除用户单板设计,布线等问题,但是 bootloader 代码也非常的成熟,大量的被用户使用,所以软件问题也被排除,所以将问题的原因定位在环境温度低造成的,而温度低会对哪些外设 产生影响呢,查阅任何一款 MCU 的数据手册 HIS部分的参数,都可以发现: : \+ Q& s. V- v 从这张表中可以看出,当温度低于-10℃时,HSI 的准确性会降低很多,误差变得相当大,2 N5 a5 a$ e5 L! ?) B: o3 X* t* l1 j 而熟悉 STM32 的工程师可能会有疑问,STM32 的 USB 模块需要非常精准的 48MHz 时钟,所以一般时钟 HSE 作为其时钟源进行倍频和分频,为什么 HSI 低温时误差大会对其造成影响呢? 这里就要重新回到 bootloader 中来,虽然这一部分代码并非开源的,是芯片出厂后就固化到 MCU 里面的,但我们可以从下面的流程中了解到原因: ?+ j8 ^2 x* R* w% s+ {! C 如上描述,使用 usb 模块,一般情况下是必须用 HSE(有 CRS 功能的除外)的,但是作为 bootloader而言,它本身是并不知道外接 HSE 的频率的,所以它就需要通过 HSI 去测算 HSE 的频率值,这个算法比较简单,通过简单的枚举即可,但是这样做就带来了一个问题,那就是当 HSI 偏差过大时,估测出来的 HSE 产生了偏差,这就最终导致了 USB 的 48M 时钟不准,产生了 usb 升级失败的问题!' g& N8 a( V2 v% t 总结 在使用 bootloader 进行升级时,同样需要考虑到时钟可能带来的误差。% {$ x6 S7 T" y: X# O, t" q |
STM32固件库分享,超全系列整理
STM32G030F6P6基于HAL库模拟SPI驱动1.8寸TFT LCD屏幕
STM32的CAN FD位定时设置注意事项
基于STM32将移植 SBSFU 到 STM32G070过程分享
基于STM32G030 RAM不够用经验分享
STM32G070在OLED上移植U8G2单色GUI
【经验分享】STM32 IAP+Ymodem功能实现(参考官方代码)
【经验分享】STM32的SPI问题
【经验分享】STM32 的加密实现
STM32G070—使用platformio+arduino