
在完成基本模块测试后,我们聚焦于本次极具兴趣的功能——USB。USB作为一个功能,在实际应用中常展现出相对复杂性。以往,其使用要求用户对各种协议栈具备基础认知。现今STM32CubeMX已将这些复杂性集成,仅需通过基本配置即可实现USB通信。本次测试旨在将USB设备模拟为鼠标进行操作。 咱们这次要在工程里加上USB功能。说实话,那个USB的枚举过程可真够复杂的,一环扣一环,哪个环节不对劲儿都可能让通信出问题。什么枚举啊、名称啊,还有USB通道,要配置的信息一大堆。不过还好,这次咱们用STM32CubeMX来配置,那可就简单多了。9 L) C* `! e+ |7 l6 P 首先看一下时钟,虽然我们配置的主时钟是24MHz,不过不影响USB的时钟依然是48MHz:5 C5 W- j6 I1 N. l" b ![]() USB时钟使用的是固定值48MHz,以前遇到的开发板是可以配置成PLL提供的,不过也要注意计算能够分频到48MHz,本开发板使用的是HSI48 RC给USB提供基准时钟,本开发板的最大系统时钟也只能到48Mhz。 开启USB模块: ![]() 打开USB功能项,我们前面配置的是设备,此处也要将其定义为设备,注意基本参数使用默认参数就可以,USB对应的引脚是PA11、PA12. 接下来是对USBX的具体配置,对于鼠标来说或者大多是USB来说配置的都是HID,也就是人机接口设备:- @! m T0 e$ G( x6 @! \ ![]() 其中有很多的描述符,这里面就有设备描述符,其内容就是主机识别它的基本信息(设备名称,PID,VID等等): ![]() 记住这里这个我们会和后面的设备内容进行一下对比; 接下来,我们将着手配置ThreadX,借助实时操作系统的强大功能,将极大简化对各模块的响应管理。值得一提的是,ThreadX针对USBx设有专门的处理栈,使得处理更为高效便捷:2 w% \$ d3 |& H) k+ m- R; o' J* a ![]() 请注意,我们的USB初始化流程采用threadx线程来管理。因此,在工程配置阶段,请避免自动执行初始化操作: ![]() 我们不能使用滴答定时器作为系统时钟,需要修改: ![]() 接下来,我们着手分析初始化代码。在`main`函数中,特别注意到新增的`MX_ThreadX_Init();`调用。为了深入理解其机制,我们将逐步展开探索。首先,进入_tx_initialize_kernel_enter`函数内部,随后定位到`tx_application_define()`的入口。整个初始化流程均在此处展开,其中尤为重要的是对`MX_USBX_Device_Init(VOID *memory_ptr)`的调用。得益于ThreadX操作系统的采用,USB初始化过程中的这一关键细节得以明确体现:3 [, X, @3 f" C ![]() 编译下载后电脑的设备中可以看到: ![]() 通过调试工具可以正常发现USB设备了,其PID以及VID与设置相符:7 H+ v% {% }7 p, \4 I: c ![]() 到这里枚举成功了,实现STM32C071开发板的USB HID Mouse枚举部分。# L. a a7 u; \" c ' U8 N) F7 Q1 i+ r. u) I + y' U2 J* y$ Y. t& ] 5 q/ |: S- ^& h/ J E% { " J% n4 c$ \( b7 p6 P- |7 A# _ Y , D7 s9 |: m$ c4 j |
【STM32C0评测】C071:IIC的使用
NUCLEO-C071RB评测6_四种工作模式的功耗测试
【STM32C0评测】GPIO测试:使用外部中断控制小灯点亮熄灭
【STM32C0评测】+NUCLEO-C071 UART测试
NUCLEO-C071RB评测5_I2C通讯测试
【STM32C0评测】C071:加个PWM
NUCLEO-C071RB评测1_GPIO测试
【STM32C0评测】C071:GPIO+定时器+串口
STM32C0评测】C071开箱
NUCLEO-C071RB评测4_模拟和硬件SPI驱动3.5寸TFT彩屏