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

2019-06-08  本文已影响0人  小鱼儿他老汉

现象

在Mbed OS上导出的USBSerial工程,其USB堆栈是第三方开发者通过合并STM32CubeMX生成的HAL驱动而形成的。一直以来,发现该驱动在插入到Windows/Linux操作系统时会出现没有输出的现象:

所以,这件事情大大阻碍了我在其上开发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和蜂窝数据的支持。

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

上一篇 下一篇

猜你喜欢

热点阅读