STM32F103C8 USBSerial 无输出的解决方式之一

现象

在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()一直可以工作。所以这里有两个可能:

  1. 通过EP CTRL可能激活EP OUT/EP IN,因为配置波特率会激活输出;
  2. Stream类存在某种Bug,因为writeBlock()一直可以工作。

下一步

下一步会测试gets()函数,构建若干实用协议以支持数据和控制目的。同时增加cmdline和debug测试支持。

在这些基础上,增加USB转SPI/UART/I2C/ADC/PWM的转接。同时增加对于各类传感器、RFIC和蜂窝数据的支持。

希望以硬件开源的方式来实现推广。

你可能感兴趣的:(STM32F103C8 USBSerial 无输出的解决方式之一)