[STM32F0] STM32F072 DFU 引导程序与复位

[复制链接]
117|10
地瓜patch 发表于 2026-8-28 18:58 | 显示全部楼层 |阅读模式
我的STM32F072V8 工作电压 3.3V。产品内置 USB 接口,该接口仅用于通过 DFU 烧录单片机程序。

BOOT0 引脚通过电阻分压电路连接到 USB 的 VBUS:接入 USB 时,BOOT0 引脚电平为 3.3V;未接入 USB 时,BOOT0 引脚接地。

进入 DFU 模式的操作流程为,设备不上电时,将 USB 连接至主机。给设备上电

我本以为在上电之前 BOOT0 引脚已经是高电平,单片机会进入 DFU 模式。

但实际并未进入 DFU 模式,在  dmesg 中可以看到如下日志:
[28936069] usb 3-13: new full-speed USB device number 49 using xhci_hcd
[28064068] usb 3-13: device descriptor read/64, error -71
[28300075] usb 3-13: device descriptor read/64, error -71
[28536067] usb 3-13: new full-speed USB device number 50 using xhci_hcd
[28664084] usb 3-13: device descriptor read/64, error -71
[28900059] usb 3-13: device descriptor read/64, error -71
[28008079] usb usb3-port13: attempt power cycle
[28660084] usb 3-13: new full-speed USB device number 51 using xhci_hcd
[28660186] usb 3-13: Device not responding to setup address.
[28868143] usb 3-13: Device not responding to setup address.
[28076066] usb 3-13: device not accepting address 51, error -71
[28204078] usb 3-13: new full-speed USB device number 52 using xhci_hcd
[28204178] usb 3-13: Device not responding to setup address.
[28412188] usb 3-13: Device not responding to setup address.
[28620100] usb 3-13: device not accepting address 52, error -71
[28620142] usb usb3-port13: unable to enumerate USB device
此时如果手动拉低 NRST 引脚,单片机复位后 DFU 就能正常启动。

我在 NRST 引脚使用 1μF 电容替代常规的 100nF 电容,延长复位保持时间,但问题依旧存在。

我查到一些资料提到 USB 的 DP 引脚需要上拉电阻,但我的硬件设计中没有添加。不过数据手册和引导程序应用笔记都说明不需要外部上拉电阻。有意思的是,STM32F072-DISCO 评估板上却焊了上拉电阻,而这块评估板进入 DFU 模式完全正常。


xiaoqizi 发表于 2026-9-6 11:21 | 显示全部楼层
当你在设备上电后,手动拉低 NRST 引脚再释放,实际上是对 MCU 进行了一次硬复位
木木guainv 发表于 2026-9-6 13:43 | 显示全部楼层
MCU 上电后,内部逻辑会去采样 BOOT0 引脚。一旦采样完成,如果 BOOT0 是高电平,它就会尝试去初始化 USB 接口,试图和主机建立 DFU 连接
Jiangxiaopi 发表于 2026-9-6 16:11 | 显示全部楼层
手动复位强制 MCU 重新执行上电流程
t61000 发表于 2026-9-6 15:33 | 显示全部楼层
这个现象太典型了,大概率是USB上电时序的问题。STM32F0的USB外设对VBUS和复位信号的时序很敏感,如果VBUS上升太慢,或者芯片内部复位还没完成VBUS就到了高电平,USB PHY就会进入一种半死不活的状态。建议在VBUS检测电路后面加个简单的RC延时,或者在软件里检测到VBUS后延时几百毫秒再初始化USB
kqh11a 发表于 2026-9-7 08:34 | 显示全部楼层
日志里全是error -71,这是主机端报的协议错误,说明从机(你的板子)根本没按USB规范响应枚举请求。BOOT0引脚虽然决定了启动模式,但进入DFU后USBPHY能不能正常工作是另一回事。检查一下你的3.3V电源在插入USB瞬间有没有被拉低,F072的USB模块对电源纹波很挑剔,哪怕掉到3.0V以下都可能挂起
wailian1265k 发表于 2026-9-9 11:34 | 显示全部楼层
关于BOOT0的分压电路,阻值选得太大会有问题。USB VBUS通过分压给BOOT0供电,如果分压电阻是几百K甚至M级别的,BOOT0引脚的输入阻抗加上PCB漏电流,可能导致实际电压达不到高电平阈值。建议把分压电阻改小点,比如10K和20K,确保高电平足够“硬”
caoyunhj2301 发表于 2026-9-11 09:35 | 显示全部楼层
楼主提到NRST脚接了1uF电容,这个容量有点偏大。虽然能延长复位时间,但也可能导致复位释放后的上升沿太缓,触发内部的POR/PDR复位电路反复震荡。对于STM32F0,通常100nF就足够了。你可以试着把电容换成100nF,看看枚举成功率会不会提高
xiyaoko2365 发表于 2026-9-10 11:35 | 显示全部楼层
USB D+的上拉电阻。F072内部虽然有上拉,但有些批次或者特定温度下内阻不稳定。既然评估板加了外部上拉能正常工作,你也试着在D+引脚对3.3V加个1.5K电阻看看。很多时候硬件手册说“不需要”,但实际上加了更稳,特别是长线传输或者干扰大的环境
grfqq325 发表于 2026-9-12 08:36 | 显示全部楼层
日志里反复出现new full-speed USB device number XX,说明主机一直在尝试重置总线。这通常是因为设备在收到SET_ADDRESS指令后没有在规定时间内响应。检查一下你的晶振起振时间,如果晶振起振太慢,USB时钟没稳定就开始通信,肯定会失败。可以在软件里等晶振稳定标志位置位后再初始化USB
在水一方00 发表于 2026-9-13 15:37 | 显示全部楼层
这种问题有时候跟软件里的USB库版本有关。早期的STM32_USB_Device_Library在处理F0系列时有个Bug,就是在复位中断里清除标志位的顺序不对,导致偶尔会漏掉复位事件。建议去ST官网下最新的CubeF0包,把USB中间件更新一下,别用老版本的库
刮台风就会有人g 发表于 2026-9-14 09:38 | 显示全部楼层
你提到未接入USB时BOOT0接地,接入时通过分压变高。这里有个风险:如果分压电路设计得不好,BOOT0电压可能在高低电平阈值之间徘徊。STM32的BOOT0采样是在复位释放瞬间完成的,如果那时候电压刚好在中间,芯片可能进入未定义状态。最好加个施密特触发器缓冲一下,或者用比较器做电平转
合同圣诞节fy 发表于 2026-9-15 10:02 | 显示全部楼层
排查这个问题可以用个笨办法:在代码最开始的地方(SystemInit之前)加个延时循环,比如空跑几百万次。这样能让VBUS和电源充分稳定后再执行后续逻辑。如果加了延时就能正常枚举,那就实锤是上电时序问题了,后面再优化硬件或软件延时策略
很过分好的suj 发表于 2026-9-16 10:39 | 显示全部楼层
关于那个-71错误,还可以从主机侧找找线索。在Linux下可以用lsusb -v看看设备描述符到底读到了什么,或者用Wireshark抓一下USB包。有时候设备其实响应了,但因为信号质量差导致数据包CRC校验失败,主机也会报这个错。示波器量一下D+ D-的波形,看看眼图好不好
发货后已经wi 发表于 2026-9-17 10:00 | 显示全部楼层
你的DFU固件本身有问题。如果App代码里没正确处理USB复位,或者中断向量表没对齐,进入DFU模式后虽然能看到设备,但一通信就死。试着烧录一个最简单的官方DFU示例程序,排除是不是你自己写的引导程序有Bug
哈根达斯uz 发表于 2026-9-17 11:41 | 显示全部楼层
注意检查PCB布局,USB差分线有没有走直角或者跨越分割平面。F0的USB PHY驱动能力不强,如果走线阻抗不连续,反射信号会干扰枚举。特别是BOOT0那根线,如果离USB数据线太近,上电瞬间的电平跳变可能会耦合干扰到USB信号
广告商宝宝xx 发表于 2026-9-17 10:11 | 显示全部楼层
既然评估板能工作,对比一下两者的原理图差异是最直接的。除了上拉电阻,再看看VBUS入口有没有ESD保护器件,有些廉价的TVS管结电容太大,会把USB信号滤得一塌糊涂。试着把保护器件拆了直连试试,排除外围器件的影响
更多更合适ii 发表于 2026-9-18 11:12 | 显示全部楼层
软件层面,可以在USB初始化前手动复位一下USB外设寄存器。有时候芯片刚从其他模式切换过来,USB寄存器里残留着脏数据。写代码把RCC_APB1ENR里的USBEN位清零再置一,强制复位USB模块,能解决很多玄学问题
根特皇宫w 发表于 2026-9-19 10:38 | 显示全部楼层
STM32F0的USB不支持电池充电检测(BCD),如果你的USB口是那种带充电功能的Hub,可能会因为识别不到设备类型而不给足电流或者不传数据。试着换个电脑主板后置USB口或者普通Hub试试,排除主机兼容性问题
荣陶陶 发表于 2026-9-7 12:15 | 显示全部楼层
STM32F0 的复位时间虽然可以通过外部电容调整,但 MCU 内部有一个固定的上电复位序列。当 NRST 引脚释放后,MCU 核心开始运行,第一件事就是检查 BOOT0
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:出一块TI-PLABS-AMP-EVM

3038

主题

18147

帖子

31

粉丝
快速回复 在线客服 返回列表 返回顶部
0