如何配置Keil uVision5以通过MCU的USB接口将STM32F4xx的printf输出重定向?然后,USB将连接到Windows计算机,虚拟端口驱动程序和终端程序。
我找不到一个示例uVision5项目,它将printf配置为通过STM32F4xx MCU的USB接口输出。
答案 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