最近在研究基于STM32F103CBT6单片机的USB HID鼠标设备实现,电路部分主要抄自各开源实现,今天要记录的主要是单片机软件方面的问题:测试阶段发现如果在开机前先插好USB鼠标,再开机,有一定概率出现鼠标操作没反应的情况!并且这个现象在我的笔记本(联想thinkbook 14+,支持关机USB充电)上要比台式机(技嘉X570+5700x,前置USB)上出现几率高不少,基本上开3次就能有1次出现这种情况。
先说明下,MCU软件部分主要基于ST的“STM32F10x, STM32L1xx and STM32F3xx USB full speed device library (UM0424)” https://www.st.com/en/embedded-software/stsw-stm32121.html USB库实现,里面有HID实现的例子,基本都是照抄的,改了下Joystick例子的USB描述符,报文相关参数(3按键+1滚轮+XY移动,1ms轮询)。电路部分,一开始实验的时候用的是合宙的AIR32F103,对比STM32F103,支持USB DP的内部1.5k上拉,自己画板制作的时候由于STM32F103没有内部DP上拉,于是简单做了个固定1.5k到3.3v的上拉,做这个设计的过程中已经查到过有些资料参考ST-LINK的设计,应该使用一个GPIO口,通过加NPN开关三极管方式驱动这个1.5k上拉,用于遵守USB 2.0规范约定的设备可枚举信号,同时也根据这个wiki的描述:https://stm32world.com/wiki/STM32_USB_Device_Renumeration ,实测这种通过将DP端口改为PP输出,并拉低50ms左右的非标准做法,也可以实现控制枚举、软件重枚举的功能。于是就没做类似ST-LINK的设计,所以一开始发现标题问题时,以为是这种非标准的USB枚举初始化导致,但是后来通过观察出现问题时的串口日志发现USB初始化枚举都正常,只是在等待轮询取上报数据时出现了问题!
研究了一番后,找到了一个简单的解决方法,加了个超时重置标识变量的方法,如下:
Continue reading…