我正在尝试使用带有GCC ARM-none-eabi编译器的C中的STM32F103蓝 {MOD}药丸板来推出我自己的USB设备,但我遇到了一些我想要了解的奇怪行为。我创建了一个结构,用于建模与USB外设相关的端点缓冲区描述符表:typedef struct _EP_BUF_DSCR { uint32_t ADDR_TX; uint32_t COUNT_TX; uint32_t ADDR_RX; uint32_t COUNT_RX;} EP_BUF_DSCR;
我已经创建了一个指向其中一个结构的指针,并将其设置为解决MCU的USB数据包存储区的开头:EP_BUF_DSCR *EP0_DSCR = (EP_BUF_DSCR *) 0x40006000;
所以现在我可以通过取消引用相应的字段并为它们分配值来设置ADDR_TX和ADDR_RX字段。但是,当我尝试使用COUNT_RX字段执行此操作时,它似乎没有任何效果:// debugger memory view shows register as set to 0 after running this:EP0_DSCR->COUNT_RX = 0x8400;
但我可以通过直接创建指针并取消引用它来更改此寄存器中的值:// debugger memory view shows register set to correct value after running:*((uint32_t *)(0x40006000 + 12)) = 0x8400;
有人可以提供一些有关为何发生这种情况的见解吗 ,是我无意中依赖于未记录的编译器行为?
正如Chris Stratton所说,你需要声明EP0_DSCR(以及任何其他指向硬件寄存器的指针)volatile。
您是否有APB1和USB外围设备已打开并正确计时?如果外围设备未运行,寄存器可能无法正确响应。特别是,USB外设需要时钟频率为48 MHz,APB1需要时钟频率≥8MHz。
你有CAN外设吗?CAN和USB共享一个内存缓冲区,因此您不能同时使用它们。
一周热门 更多>