[STM32F4] STM32F4 备份 SRAM 与 USB HID 冲突

[复制链接]
107|19
zhouyou99 发表于 2026-8-21 10:59 | 显示全部楼层 |阅读模式
我在 F4 探索板上的 USB HID 运行正常,但在完成 USB 初始化后,向备份 SRAM 和备份 RTC 保存数据时出现问题。
我编写了一段程序等待 USB 传来字符,随后将信息存入备份 SRAM 或备份 RTC。
未执行 USB 初始化时,向备份内存写入数据一切正常。可一旦在 USB 初始化完成后写入,编译器不会报程序错误,但内存中的数据不会改变,无法写入内存。
初始化代码如下:
USBD_Init (&USB_OTG_dev,
USB_OTG_FS_CORE_ID,
&USR_desc,
&USBD_HID_cb,
&USR_cb);

我调整过多种启动流程,但均无效。
试过关闭 USB 全局初始化、停止设备、断开设备连接…… 所有操作都不起作用。

classroom 发表于 2026-8-21 15:40 | 显示全部楼层
备份SRAM和USB都使用同一块电源域,USB初始化后可能改变了PWR寄存器的备份访问使能位,导致写入被硬件阻止。
cr315 发表于 2026-8-21 17:15 | 显示全部楼层
你的写入操作没有检查备份SRAM的写保护状态,USB初始化流程里可能意外锁定了备份区域的写保护,后续写入自然失败。
duo点 发表于 2026-8-21 20:28 | 显示全部楼层
备份SRAM的时钟使能在RCC里,USB初始化可能重新配置了RCC的备份接口时钟,导致写入时序不对,数据根本没传过去。
flycamelaaa 发表于 2026-8-21 22:37 | 显示全部楼层
你只说了“写入失败”,但没说明读回来的值是0还是旧数据还是随机值,这三种情况对应的硬件原因完全不同。
jcky001 发表于 2026-8-22 10:42 | 显示全部楼层
USB初始化会占用大量中断优先级,可能你的备份写入操作被中断打断后没有恢复,而库函数里的写入等待循环***超时了。
onlycook 发表于 2026-8-21 15:42 | 显示全部楼层
备份域需要先解锁PWR的备份写保护才能写入,USB初始化可能重新锁上了这个保护,而你后续写入前没有重新解锁。
powerantone 发表于 2026-8-22 12:24 | 显示全部楼层
你试过关闭USB全局初始化,但USB外设的时钟和备份域时钟可能共用同一个PLL输出,关掉USB不等于恢复时钟分配。
probedog 发表于 2026-8-22 13:58 | 显示全部楼层
RTC和备份SRAM共用同一套电源管理逻辑,USB初始化可能触发了RTC寄存器复位,连带把备份SRAM的访问状态也复位了。
solty 发表于 2026-8-22 15:16 | 显示全部楼层
你的写入代码在USB初始化前后用的是完全相同的函数,但初始化后的中断向量表可能被修改,导致写入函数实际跳到错误地址。
spicy 发表于 2026-8-22 17:47 | 显示全部楼层
探索板上的备份SRAM只有4KB,USB缓冲区可能被分配到同一块物理地址,写入备份SRAM实际写到了USB FIFO里。
stormwind123 发表于 2026-8-22 19:12 | 显示全部楼层
你提到“编译器不会报错”,这完全正常,因为这是运行时硬件行为,跟编译器没有任何关系,不能以此判断软件流程正确。
七毛钱 发表于 2026-8-22 20:59 | 显示全部楼层
停止设备和断开连接只是软件状态变化,USB内核的DMA引擎可能还在占用内部总线,此时对备份域写操作会被总线仲裁器挂起。
今天会画卧蚕吗 发表于 2026-8-22 22:45 | 显示全部楼层
备份SRAM在待机模式下才能保持数据,而USB初始化会强制退出待机模式,导致备份域电源切换,写入数据被瞬间清空。
内政奇才 发表于 2026-8-23 12:12 | 显示全部楼层
你的初始化顺序里,USBD_Init之后没有重新调用HAL_PWR_EnableBkUpAccess,而该函数在USB初始化内部可能被反向调用。
又见江南雨 发表于 2026-8-23 15:13 | 显示全部楼层
建议你直接在写入备份SRAM前读一下备份域的控制寄存器状态,而不是反复调整启动流程,用寄存器值说话比试错更有效率。
深渊之海 发表于 2026-8-21 19:39 | 显示全部楼层
检查PWR_CR2的LRDWPIE和LPWUIE位是否被禁,这可能会在USB初始化后被更改导致问题。如果被禁,请先手动开启。
彩虹彼岸 发表于 2026-8-22 13:40 | 显示全部楼层
检查PWR_CR2的LRDWPIE和LPWUIE位,确保USB初始化后没有禁用,同时确认RCC的备份接口时钟未被重新配置。
闪烁黎明 发表于 2026-8-23 10:08 | 显示全部楼层
看看PWR的Backup Access Enable(LRDWPIE)和Power-off access enable(LPWUIE)位是否在USB初始化后被关闭了,可能需要重新启用这些位才能写入。
wahahaheihei 发表于 2026-8-23 17:21 | 显示全部楼层
初始化顺序、电源 / 备份域访问锁、内存屏障、USB VBUS 供电干扰、中断抢占、链接脚本、CACHE(F4 无 D-Cache,可排除)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

196

主题

196

帖子

0

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