通过GCC中的结构访问stm32寄存器

2019-07-14 17:17发布

我正在尝试使用带有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;  有人可以提供一些有关为何发生这种情况的见解吗 ,是我无意中依赖于未记录的编译器行为?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
ggfx
1楼-- · 2019-07-15 03:07
声明它不稳定似乎已经成功了。谢谢!
jhhfhgj
2楼-- · 2019-07-15 03:37
为什么不使用CMSIS - 你已经全部申报了。没有必要重新发明轮子。没有CMSIS不是HAL所以你可以进行裸寄存器编程。
jenny042
3楼-- · 2019-07-15 07:02
这里有几件事情可以发生:

正如Chris Stratton所说,你需要声明EP0_DSCR(以及任何其他指向硬件寄存器的指针)volatile。

您是否有APB1和USB外围设备已打开并正确计时?如果外围设备未运行,寄存器可能无法正确响应。特别是,USB外设需要时钟频率为48 MHz,APB1需要时钟频率≥8MHz。

你有CAN外设吗?CAN和USB共享一个内存缓冲区,因此您不能同时使用它们。

一周热门 更多>