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

时间:2016-05-13 02:19:29

标签: windows usb printf keil

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

我找不到一个示例uVision5项目,它将printf配置为通过STM32F4xx MCU的USB接口输出。

1 个答案:

答案 0 :(得分:0)

STM32F4xx MCU的USB必须将 USB CDC 实现为设备类接口类https://en.wikipedia.org/wiki/USB_communications_device_class)和固件中的主机模式(USB OTG)。在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例程,如下所示。 ARM版本的printf()然后调用这些例程,请参阅此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

更多信息:

这是如何实施 USB-RS232适配器的示例: http://www.wolinlabs.com/blog/stm32f4.virtual.com.port.html

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