[STM32F1] 未启用缓存,USB CDC 打开失败?

[复制链接]
810|18
 楼主| 唐纳德d 发表于 2025-5-27 22:53 | 显示全部楼层 |阅读模式
我已经用 STM32cubeIDE 创建了一个usb CDC 项目。
如果未启用缓存,通过固件访问位于 ox20005604 的特定变量,会导致从 PC 打开串行端口返回错误(代码 87)。
很奇怪的现象

公羊子丹 发表于 2025-5-28 07:27 | 显示全部楼层
你说的地址 0x20005604 看着像是 RAM 的尾部,是不是跟 USB 缓冲区有冲突了?
周半梅 发表于 2025-5-28 07:28 | 显示全部楼层
有没有试过把那个变量放到 __attribute__((section(".noinit"))) 或者干脆挪个地址试试?
帛灿灿 发表于 2025-5-28 07:29 | 显示全部楼层
错误代码 87 好像是 Windows 那边报的,意思是参数错误,可能是 USB 堆栈没准备好?
童雨竹 发表于 2025-5-28 07:29 | 显示全部楼层
你是不是用了 DMA 模式?STM32 的 USB 有时候读写非 32 字节对齐的变量会出事。
万图 发表于 2025-5-28 07:31 | 显示全部楼层
不启用 CPU cache(虽然 F1 本来也没 cache)应该无关吧,会不会是访问时序的问题?
Wordsworth 发表于 2025-5-28 07:31 | 显示全部楼层
我以前遇到过类似的,最终发现是 USB 缓冲区和其他变量共享了内存,换个地址就好了。
Bblythe 发表于 2025-5-28 07:32 | 显示全部楼层
建议把 USB 缓冲区和普通变量物理上隔远一点,有时连 .ld 链接脚本都得手动调。
Pulitzer 发表于 2025-5-28 07:33 | 显示全部楼层
变量是 volatile 吗?USB 中断和主循环同时访问不加同步可能也出问题。
Uriah 发表于 2025-5-28 07:34 | 显示全部楼层
有可能是 PC 端没握手成功,可以试试用串口工具打开 CDC,看下握手有没有问题。
Clyde011 发表于 2025-5-28 07:35 | 显示全部楼层
有没有用 USB_CDC_Transmit_FS 的返回值判断状态?可能 USB 处于 busy 状态导致卡住。
flycamelaaa 发表于 2025-5-28 15:45 | 显示全部楼层
建议启用缓存并使用volatile关键字。
powerantone 发表于 2025-5-28 15:46 | 显示全部楼层
STM32的内存通常位于SRAM区域,未启用缓存时,直接通过指针访问可能因硬件优化导致数据不一致或总线错误。错误代码87可能对应工具链的编译或链接错误,但实际可能是硬件访问异常触发。
stormwind123 发表于 2025-5-28 15:48 | 显示全部楼层
检查内存对齐,变量地址对齐到4字节。
jcky001 发表于 2025-5-28 15:51 | 显示全部楼层
将变量访问移至主循环或任务调度中,中断内仅设置标志位,避免直接操作。
elephant00 发表于 2025-5-28 15:53 | 显示全部楼层
降低优化级别。
stormwind123 发表于 2025-5-28 16:20 | 显示全部楼层
建议启用D-Cache。
probedog 发表于 2025-5-28 17:00 | 显示全部楼层
若变量需实时更新,在定义时添加volatile,防止编译器优化导致访问延迟。
cr315 发表于 2025-5-28 17:20 | 显示全部楼层
检查USB缓冲区,CDC_Receive_FS和CDC_Transmit_FS函数中有无未因变量访问导致缓冲区溢出或死锁。
classroom 发表于 2025-5-28 18:00 | 显示全部楼层
在STM32CubeMX中调整USB中断优先级,要高于其他非关键中断。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

54

主题

54

帖子

0

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