未启用缓存,USB CDC 打开失败?
我已经用 STM32cubeIDE 创建了一个usb CDC 项目。如果未启用缓存,通过固件访问位于 ox20005604 的特定变量,会导致从 PC 打开串行端口返回错误(代码 87)。很奇怪的现象你说的地址 0x20005604 看着像是 RAM 的尾部,是不是跟 USB 缓冲区有冲突了? 有没有试过把那个变量放到 __attribute__((section(".noinit"))) 或者干脆挪个地址试试? 错误代码 87 好像是 Windows 那边报的,意思是参数错误,可能是 USB 堆栈没准备好? 你是不是用了 DMA 模式?STM32 的 USB 有时候读写非 32 字节对齐的变量会出事。 不启用 CPU cache(虽然 F1 本来也没 cache)应该无关吧,会不会是访问时序的问题? 我以前遇到过类似的,最终发现是 USB 缓冲区和其他变量共享了内存,换个地址就好了。 建议把 USB 缓冲区和普通变量物理上隔远一点,有时连 .ld 链接脚本都得手动调。 变量是 volatile 吗?USB 中断和主循环同时访问不加同步可能也出问题。 有可能是 PC 端没握手成功,可以试试用串口工具打开 CDC,看下握手有没有问题。 有没有用 USB_CDC_Transmit_FS 的返回值判断状态?可能 USB 处于 busy 状态导致卡住。 建议启用缓存并使用volatile关键字。 STM32的内存通常位于SRAM区域,未启用缓存时,直接通过指针访问可能因硬件优化导致数据不一致或总线错误。错误代码87可能对应工具链的编译或链接错误,但实际可能是硬件访问异常触发。 检查内存对齐,变量地址对齐到4字节。 将变量访问移至主循环或任务调度中,中断内仅设置标志位,避免直接操作。 降低优化级别。 建议启用D-Cache。 若变量需实时更新,在定义时添加volatile,防止编译器优化导致访问延迟。 检查USB缓冲区,CDC_Receive_FS和CDC_Transmit_FS函数中有无未因变量访问导致缓冲区溢出或死锁。 在STM32CubeMX中调整USB中断优先级,要高于其他非关键中断。
页:
[1]