本帖最后由 正点原子运营 于 2024-5-28 17:04 编辑
1)实验平台:正点原子 M144Z-M3 STM32F103最小系统板
2) 章节摘自【正点原子】M144Z-M3最小系统板使用指南——STM32F103版
6)正点原子STM32技术交流QQ群:725095144
本章将介绍使用STM32F103作为USB从设备,虚拟出串口与PC进行通信。通过本章的学习,读者将学习到STM32F103作为USB从设备虚拟出串口的使用。 本章分为如下几个小节: 56.1 硬件设计 56.2 程序设计 56.3 下载验证
56.1 硬件设计 56.1.1 例程功能 1. 回显虚拟串口接收到的数据 2. 每间隔一定时间,虚拟串口发送一段提示信息 3. LED0闪烁,提示程序正在运行
56.1.2硬件资源 1. LED LED0 - PB5 2. 正点原子2.8/3.5/4.3/7/10寸TFTLCD模块 3. USB USB_DM - PA11 USB_DP - PA12
56.1.3 原理图 请见第60.1.3小节中USB接口与MCU的连接原理图的相关内容。
56.2 程序设计 56.2.1 ST的USB设备驱动库 请见第60.2.1小节中ST的USB设备驱动库的相关内容。
56.2.2 实验应用代码 本章实验的应用代码,如下所示: - int main(void)
- {
- /* 仅保留关键代码,其余代码省略 */
-
- /*初始化USB */
- USBD_Init(&USBD_Device, &VCP_Desc, 0);
- /* 添加类 */
- USBD_RegisterClass(&USBD_Device, USBD_CDC_CLASS);
- /* 为CDC类添加回调函数 */
- USBD_CDC_RegisterInterface(&USBD_Device, &USBD_CDC_fops);
- /* 开启USB */
- USBD_Start(&USBD_Device);
-
- while(1)
- {
- /* 连接状态改变 */
- if (device_sta != g_device_state)
- {
- if (device_sta == 1)
- {
- lcd_show_string(30, 110, 200, 16, 16, "USB Connected ", RED);
- LED1(0);
- }
- else
- {
- lcd_show_string(30, 110, 200, 16, 16, "USB Disconnected ", RED);
- LED1(1);
- }
- device_sta = g_device_state;
- }
-
- /* 接收到数据 */
- if (g_usb_usart_rx_sta & 0x8000)
- {
- len = g_usb_usart_rx_sta & 0x3FFF;
- usb_printf("\r\n您发送的消息为:\r\n");
- cdc_vcp_data_tx(g_usb_usart_rx_buffer, len);
- usb_printf("\r\n\r\n");
- g_usb_usart_rx_sta = 0;
- }
- else
- {
- if ((times % 5000) == 0)
- {
- usb_printf("\r\n正点原子 \
- M144Z-M3最小系统板STM32F103版 \
- USB虚拟串口实验\r\n");
- usb_printf("正点原子@ALIENTEK\r\n\r\n\r\n");
- }
- if ((times % 200) == 0)
- {
- usb_printf("请输入数据,以回车键结束\r\n");
- }
- if ((times % 30) == 0)
- {
- LED0_TOGGLE();
- }
- times++;
- }
-
- delay_ms(10);
- }
- }
复制代码从上面的代码中可以看出,在调用完USB设备驱动库中相关的初始化函数后便等待USB虚拟串口接收数据,若接收到数据变通过函数usb_printf()将数据发送出去,usb_printf()的实现如下所示: - /**
- *@brief 通过 USB 格式化输出函数
- *@note 通过USB VCP实现printf输出
- * 确保一次发送数据长度不超USB_USART_REC_LEN字节
- *@param 格式化输出
- *@retval 无
- */
- void usb_printf(char *fmt, ...)
- {
- uint16_t i;
- va_list ap;
- va_start(ap, fmt);
- vsprintf((char *)g_usb_usart_printf_buffer, fmt, ap);
- va_end(ap);
- i = strlen((const char *)g_usb_usart_printf_buffer); /* 此次发送数据的长度 */
- cdc_vcp_data_tx(g_usb_usart_printf_buffer, i); /* 发送数据 */
- }
复制代码56.3 下载验证 在完成编译和烧录操作后,可以看到LCD上显示了本实验的相关实验信息,此时可以将开发板通过USB接口与PC进行连接,待PC自动完成驱动安装后,便可看到PC上多出了一个端口设备,此时可以通过串口调试助手与该端口进行通信,可以看到无论串口调试助手发送任何数据,都会在串口调试助手的接受区看到发送出去的数据,这是因为STM32F103将虚拟串口接收到的数据通过虚拟串口发送回去,实现了“回显”的效果。 |