唐纳德d 发表于 2025-5-27 22:53

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

我已经用 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中断优先级,要高于其他非关键中断。
页: [1]
查看完整版本: 未启用缓存,USB CDC 打开失败?