如何将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
的更多信息:
- http://www.keil.com/forum/60565/(usbd_STM32F4xx_FS.c)
- http://www.beyondlogic.org/usbnutshell/usb1.shtml
这是一个例子,如何实现a USB-RS232适配器:http://www.wolinlabs.com/blog/stm32f4.virtual.com.port.html
git还包含许多有趣的文件git clone https://github.com/rowol/stm32_discovery_arm_gcc