现象
在Mbed OS上导出的USBSerial工程,其USB堆栈是第三方开发者通过合并STM32CubeMX生成的HAL驱动而形成的。一直以来,发现该驱动在插入到Windows/Linux操作系统时会出现没有输出的现象:
- 某些PCBA Windows/Ubuntu没有任何输出。
- 某些PCBA 堵塞很长时间后突然输出。
- 在不同版本操作系统中,比如低版本Linux中没有输出,高版本Linux中有输出
- STM32F103C8的板子在USB需要弱上拉,修改了电阻后,并没有明显改善。
- Mbed OS合并的和STM32CubeMX生成代码,后者更加稳定,但是需要增加Stream/格式化输出。
所以,这件事情大大阻碍了我在其上开发IOT工程,实现标准化开发流程和手段的推广。但是无论如何,这件事情需要更新的是固件,而非软件。
合并代码
在研究过Mbed的代码后,发现两种代码会有不同的现象:
USBSerial usbSerial(0x1f00, 0x2012, 0x0001, false);
getUID96(uid); // read STM32 UID
bin2Hex(uid, hex, 12); // Convert binary into hexdecimal
while(1){
usbSerial.writeBlock((uint8_t*)hex, 24); // output UID/HEX
usbSerial.printf("Hello World\r\n"); // format printf
}
发现无论如何,writeBlock()都有输出,而printf()只在某些情况下输出。
何谓某些情况?
通过反复版本对比,发现并没有任何修改问题。也可以retarget无关,而是USB枚举后,必须配置一次虚拟串口的波特率,printf()才有输出。
目前在Windows 10/Ubuntu 18.04上,只要配置过串口,printf()就可以工作,而writeBlock()一直可以工作。所以这里有两个可能:
- 通过EP CTRL可能激活EP OUT/EP IN,因为配置波特率会激活输出;
- Stream类存在某种Bug,因为writeBlock()一直可以工作。
下一步
下一步会测试gets()函数,构建若干实用协议以支持数据和控制目的。同时增加cmdline和debug测试支持。
在这些基础上,增加USB转SPI/UART/I2C/ADC/PWM的转接。同时增加对于各类传感器、RFIC和蜂窝数据的支持。
希望以硬件开源的方式来实现推广。