如何将Keil printf通过STM32F4xx USB重定向到连接的Windows计算机

问题描述:

如何配置Keil uVision5通过MCU的USB接口重定向来自STM32F4xx的printf输出?然后,USB将连接到Windows计算机,虚拟端口驱动程序和终端程序。如何将Keil printf通过STM32F4xx USB重定向到连接的Windows计算机

我找不到配置printf通过STM32F4xx MCU的USB接口输出的示例uVision5项目。

的STM32F4xx MCU的USB必须实现在主机模式(USB OTG)在其固件USB CDC作为设备类接口类https://en.wikipedia.org/wiki/USB_communications_device_class)和。在PC的USB上必须创建一个虚拟COM端口(驱动程序)来处理STM32F4通过USB CDC(主机模式)发送的RS232协议。当STM32F4上的CDC固件工作正常时,在Linux上,STM32F4出现,即/dev/ttyACM0,这可以通过标准RS232终端程序访问。

基本 - >http://www.keil.com/support/man/docs/rlarm/rlarm_usb_create_cdc_acm.htm

这是一个基本的例子如何通过USB发送串行数据CDC(即PC上的USB显示为一个虚拟COM口即/dev/ttyACM0):http://visualgdb.com/tutorials/arm/stm32/usb/

另请参阅此http://stm32f4-discovery.net/2014/08/library-24-virtual-com-port-vcp-stm32f4xx/

关注或修改上面的教程到linux(http://visualgdb.com/tutorials/arm/stm32/usb/)。

要将printf()重定向到USB CDC ,请重写标准I/O例程,如下所示。的printf() ARM版本调用这些例程,然后,看到这个https://mcuoneclipse.com/2014/07/11/printf-and-scanf-with-gnu-arm-libraries/的printf的ARM版本()的printf()的在x86/x64版非常不同):

#include<sys/stat.h> 

extern"C" 
{ 
    int _fstat (int fd, struct stat *pStat) 
    { 
     pStat->st_mode = S_IFCHR; 
     return 0; 
    } 

    int _close(int) 
    { 
     return -1; 
    } 

    int _write (int fd, char *pBuffer, int size) 
    { 
     return VCP_write(pBuffer, size); 
    } 

    int _isatty (int fd) 
    { 
     return 1; 
    } 

    int _lseek(int, int, int) 
    { 
     return -1; 
    } 

    int _read (int fd, char *pBuffer, int size) 
    { 
     for (;;) 
     { 
      int done = VCP_read(pBuffer, size); 
      if (done) 
       return done; 
     } 
    } 
} 

或者使用ARM半主机界面http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0471c/Bgbjhiea.html)。它会自动提供功能printf()重定向到USB CDC

的更多信息:

这是一个例子,如何实现a USB-RS232适配器http://www.wolinlabs.com/blog/stm32f4.virtual.com.port.html

git还包含许多有趣的文件git clone https://github.com/rowol/stm32_discovery_arm_gcc