完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我正在尝试使用带有GCC arm-none-eabi编译器的C中的STM32F103蓝色药丸板来推出我自己的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; 有人可以提供一些有关为何发生这种情况的见解吗 ,是我无意中依赖于未记录的编译器行为?
|
|
相关推荐
4个回答
|
|
通常,内存映射的硬件特殊功能寄存器必须声明为volatile,以便硬件知道某些东西可能需要或改变其状态超出本地执行线程 - 否则可以自由地将值缓存在寄存器中或忽略甚至计算显然未使用的值。
在STM32上,某些SFR也可能被限制在特定的访问宽度。 如果您尝试做的是合法的,那么在供应商(或备用)驱动程序或HAL文件中可能已经存在合适的定义。即使没有,你也可以通过阅读那些来学习很多东西,看看像GPIO块一样简单的东西。 当然,您尝试执行的特定操作也可能存在特定的错误 - 例如,可能无法写入,或者只有在硬件处于特定状态时才有意义地写入,调试器运气好在你的程序通常没有实现时实现。 |
|
|
|
声明它不稳定似乎已经成功了。谢谢!
|
|
|
|
为什么不使用CMSIS - 你已经全部申报了。没有必要重新发明轮子。没有CMSIS不是HAL所以你可以进行裸寄存器编程。
|
|
|
|
这里有几件事情可以发生:
正如Chris Stratton所说,你需要声明EP0_DSCR(以及任何其他指向硬件寄存器的指针)volatile。 您是否有APB1和USB外围设备已打开并正确计时?如果外围设备未运行,寄存器可能无法正确响应。特别是,USB外设需要时钟频率为48 MHz,APB1需要时钟频率≥8MHz。 你有CAN外设吗?CAN和USB共享一个内存缓冲区,因此您不能同时使用它们。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
2101 浏览 0 评论
STM32配合可编程加密芯片SMEC88ST的防抄板加密方案设计
1219 浏览 0 评论
2857 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
2619 浏览 3 评论
5305 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-14 10:46 , Processed in 0.553012 second(s), Total 44, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号