STM32

基于STM32F1系列MCU实现USB HID鼠标时的开机概率无反应问题

最近在研究基于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…

合宙AIR32使用Keil的Event Recorder实现日志查看功能

之前曾经写过一篇 魔改国产ST-LINK V2仿真器,增加SWO支持 的博文,记录了给山寨ST-LINK V2增加SWO引脚引出的方法,而今天要说的是,这个方法在合宙的AIR32系列MCU上实测并不不好用,原因在于:https://wiki.luatos.com/chips/air32f103/switchFromSxx.html#debug-sw-jtag ,这里合宙官方的文档上描述了AIR32与STM32的JTAG关断差异,简单说就是SWD和JTAG同气连枝,要开都开,要关都关,而后面又有关于SWO的描述:https://wiki.luatos.com/chips/air32f103/switchFromSxx.html#traceswo-printf,要使用SWO则必须关掉JTAG但保留SWD(这个目前我理解是SWO的printf输出依赖SWD调试),但是尴尬的是:https://wiki.luatos.com/chips/air32f103/switchFromSxx.html#jtag-jtrst,调试状态关JTAG会导致程序复位,这几个情况叠加在一起就造成了我试验时的现象:接上魔改的ST-LINK V2的SWO,一通配置Keil调试设置和代码设置(具体不写了,百度一搜一大堆),然后调试启动后确实能看到SWO的输出,但是过一小会儿,程序就重置了。。。😂于是,我又开始寻找其它方案(其实最后还是换了带串口的DAP-LINK,走UART打log了,这里记录的是研究过程),最终使用Keil的中间件(应该是这么叫吧)Event Recorder实现了既不依赖SWO,也不用串口,就SWD那几根儿线打log的功能:

Continue reading…

魔改国产ST-LINK V2仿真器,增加SWO支持

最近同事提到合宙商城在搞AIR32F103的BluePill开发板(https://wiki.luatos.com/_static/bom/BluePill.html)促销活动,9.9一个开发板还额外赠送一片AIR32F103CCT6,之前从来没接触过STM32系的MCU,于是入了一片研究,至少可以收藏。

到手后在合宙官网快速学习了一下,又从搜索引擎上查找了一些STM32的入门资料学习(互联网时代各行各业的入门知识都很廉价),了解到了各种上传程序的方法,由于之前购买过ST-LINK V2(本来是打算留着给文宇WY815P焊台刷固件用的),于是选择了ST-LINK SWD方式测试,焊好排针,按丝印指示接好线,电脑装上STM32 ST-LINK Utility,插上调试器,顺利识别,随后又装了研究版的Keil(买ST-LINK时送的网盘5.23版),按合宙wiki里的教程装好AIR32的软件库,学了下GPIO的调用方法,顺利点亮了板子上的小灯(到这一步就已经能够感觉到Arduino对比起来有多简单了😂),而且也能成功使用Keil进行断点调试,但是紧跟着问题就来了,用Arduino Nano时,虽然无法断点调试,但是可以很容易的使用IDE自带的串口通讯工具查看log以及完成命令行形式的交互,现在这套配置并不能实现简单的看printf功能,于是又花了一些时间搜索调研…

Continue reading…