STM32H743-ARM例程25-USB_VCP
目录
- 实验平台
- USB虚拟串口简介
- USB CDC协议简介
- 实验程序
- 实验现象
实验平台
硬件:银杏科技GT7000双核心开发板-ARM-STM32H743XIH6,银杏科技iToolXE仿真器
软件:最新版本STM32CubeH7固件库,STM32CubeMX v6.10.0,开发板环境MDK v5.35,串口工具UartAssit
USB虚拟串口简介
USB虚拟串口,简称VCP,是VirtualCOMPort的简写,它是利用USB的CDC类来实现的一种通信接口。
USB虚拟串口属于USB通信设备类。在物理层通过USB总线,采用虚拟串口的方式为主机提供一个物理串口。在系统内部,USB控制器提供了一个批量传输IN端点和一个批量传输的OUT端点,用于数据的接收和发送,模拟串口的RX和TX线。另外USB控制器还提供中断IN端点,发送当前串口的状态,实现对串口传输的控制。串口设备的数据,由系统的串口采集,在芯片内完成USB包的封装,通过USB总线上传至主机,再由相应的串口应用程序进行处理。对用户来说,看到的是基于串口的数据采集和传输,而实际上实现的是基于USB协议包的数据传输。
我们可以利用STM32自带的USB功能,来实现一个USB虚拟串口,从而通过USB,实现电脑与STM32的数据互传。上位机无需编写专门的USB程序,只需要一个串口调试助手即可调试,非常实用。
本实验利用STM32自带的USB功能,连接电脑USB,虚拟出一个USB串口,实现电脑和开发板的数据通信。
USB CDC协议简介
在前面章节STM32H743-ARM例程22-USB_CDC我们详细介绍过CDC通信协议,有兴趣的读者可以阅读前面章节
本小节我们来介绍下实验流程
主要修改usbd_cdc_if.c和main.c,会使用这四个函数,就可以用单片机与PC进行USB基本通信:
(1) CDC_Control_FS()
来自主机请求的回调函数;CDC控制命令处理,列举了主机有可能向设备发送的一些命令。没有具体的处理过程,需要用户自己编写。其中包括串口参数的设置,要做串口转USB通信的话需要修改这里。只是为了用USB与PC通信则不用管这里。每个命令具体的意思需要查询CDC类手册。
(2) CDC_Receive_FS()
接收数据回调函数;Buf为接收缓存。这个缓存实际上就是CDC_Init_FS()中设置的UserRxBufferFS[]数组。这个全局数组的定义在usbd_cdc_if.c文件中。Len为接收到数据的长度。这个变量不是全局的,需要用户声明变量把这个传出去。
(3) CDC_Transmit_FS()
用来发送数据。
(4)CDC_TransmitCplt_FS()
回调函数。
实验程序
1. 主函数
int main(void)
{MPU_Config();SystemClock_Config();MX_GPIO_Init();MX_USB_DEVICE_Init();while (1){len=sprintf(USB_TxBuf,"Hello! I am GT7000!\r\n");CDC_Transmit_HS((uint8_t*)USB_TxBuf,len); //用来发送数据HAL_Delay(1000);}
}
2. CDC_Control_FS()函数
static int8_t CDC_TransmitCplt_HS(uint8_t *Buf, uint32_t *Len, uint8_t epnum)
{uint8_t result = USBD_OK;UNUSED(Buf);UNUSED(Len);UNUSED(epnum);return result;
}
3. USB_printf函数,方便直接输出字符串
#include <stdarg.h>
void usb_printf(const char *format, ...)
{va_list args;uint32_t length;va_start(args, format);length = vsnprintf((char *)UserTxBufferHS, APP_TX_DATA_SIZE, (char *)format, args);va_end(args);CDC_Transmit_HS(UserTxBufferHS, length);
}