[STM32C0] 【STM32C092RC 测评】串口通信:利用USB虚拟串口与PC交互

[复制链接]
 楼主| qintian0303 发表于 2025-5-2 20:38 | 显示全部楼层 |阅读模式
<
      本次我们主要测试的是串口通信功能,并通过调试器的虚拟串口实现和PC上的串口调试工具实现通信,本次我们将通过串口空闲+DMA的方式实现不定长度的数据接收处理。
      在此先了解一下串口空闲中断和DMA,串口的空闲中断是每当串口接收完一帧数据后又过了一个byte的时间没有接收到任何数据则会触发一次中断,这里讲述了两个条件:第一是需要发生数据传输;第二是一个byte的高电平。
      DMA是一种直接存储器的访问,不会影响单片机执行任何任务。串口有对应的DMA通道,一般会配置成内存地址自增,这样就把对应的外设数据连续存储了。
      所以空闲中断+DMA是接收不定长数据的首选,每接收到一组数据触发一次,避免频繁的串口中断对系统的干扰。
      现在的单片机一般都有不止一个串口,我们看一下这次使用的STM32C092的串口分布:
bc88c5757345862662df793b64c4fe4e
      一共有四个串口可以使用,对应的调试器虚拟串口如下:
59aba5b8edcc4c887090f004321dcda1
      通过对这两个引脚的配置查询,可以连接的就是USART2.
      串口我们在启动后实际修改的配置不多:
05ff8ea35a80be1a05724a4870519bd7
      初始化基本上就是我们常用的115200,添加接收端的DMA:
f6d11492c3c2ea5c2846c29fbe99edfb
      在开启中断:
999240efaa22ceb93d47b3ac2bda75b0
      接下来就是软件方面的配置,首先是初始化阶段,要使能空闲中断:
  1. <p>__HAL_UART_ENABLE_IT(&huart2,UART_IT_IDLE); </p><p>HAL_UARTEx_ReceiveToIdle_DMA(&huart2,rx_buffer,200);//开启DMA接收</p>

      接下来就是在中断服务函数中处理了,中断实际上有了一个处理程序,不过我们不需要他的回调,直接处理空闲中断部分:
  1. <p>void USART2_IRQHandler(void)</p><p>{</p><p>  /* USER CODE BEGIN USART2_IRQn 0 */</p><p>IDLE_flag =__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE); //获取IDLE标志位</p><p>    if((IDLE_flag != RESET))</p><p>    { </p><p>        __HAL_UART_CLEAR_IDLEFLAG(&huart2);//</p><p>        HAL_UART_DMAStop(&huart2); </p><p>        __HAL_UART_DISABLE_IT(&huart2, UART_IT_IDLE);</p><p>        uint16_t rx_length = sizeof(rx_buffer) - __HAL_DMA_GET_COUNTER(&hdma_usart2_rx);</p><p>        HAL_UART_Transmit(&huart2, (uint8_t *)&rx_length, 1, 0xFFFF);</p><p>        __HAL_UART_ENABLE_IT(&huart2,UART_IT_IDLE); </p><p>        HAL_UARTEx_ReceiveToIdle_DMA(&huart2,rx_buffer,200);//再次开启DMA接收</p><p>    }</p><p>  /* USER CODE END USART2_IRQn 0 */</p><p>  HAL_UART_IRQHandler(&huart2);</p><p>  /* USER CODE BEGIN USART2_IRQn 1 */</p><p>  /* USER CODE END USART2_IRQn 1 */</p><p>}</p>

      效果如下,可以计算收到的数据大小,然后回传:
a6d99af467bd496a82d272f6d3b50283

AdaMaYun 发表于 2025-6-8 23:35 | 显示全部楼层
USB通讯还是非常快的
yiyigirl2014 发表于 2025-6-10 11:01 | 显示全部楼层
单片机可以自己用USB模拟串口?
yiyigirl2014 发表于 2025-6-10 11:01 | 显示全部楼层
看差了,原来还是要 通过烧录器 上的串口连接电脑啊。
 楼主| qintian0303 发表于 2025-6-10 20:19 | 显示全部楼层
yiyigirl2014 发表于 2025-6-10 11:01
单片机可以自己用USB模拟串口?

可以的,不过这个板子是STM32C092RC,引出来的是CAN,C071这种带USB的就可以
jackcat 发表于 2025-7-3 14:29 | 显示全部楼层
介绍了如何使用STM32CubeMX配置USB虚拟串口
backlugin 发表于 2025-7-3 21:29 | 显示全部楼层
在实际项目中使用USB虚拟串口与PC进行交互。
yorkbarney 发表于 2025-7-4 12:17 | 显示全部楼层
正确配置了USB设备描述符,包括但不限于设备类(CDC)、子类、协议等信息。
saservice 发表于 2025-7-4 17:47 | 显示全部楼层
对于开发者来说是一个重要的功能点,因为它涉及到设备的调试、数据传输和用户交互等方面。
nomomy 发表于 2025-7-4 19:41 | 显示全部楼层
对代码进行优化,提高通信效率和稳定性。
kkzz 发表于 2025-7-5 20:30 | 显示全部楼层
USB虚拟串口是一种常见的通信方式
iyoum 发表于 2025-7-5 22:40 | 显示全部楼层
对比轮询与中断+DMA方案的性能差异
backlugin 发表于 2025-7-6 11:50 | 显示全部楼层
如何配置STM32C092RC的USB虚拟串口
sheflynn 发表于 2025-7-6 17:35 | 显示全部楼层
对比传统UART与USB虚拟串口的差异
lihuami 发表于 2025-7-7 13:40 | 显示全部楼层
使用STM32CubeMX生成初始化代码
usysm 发表于 2025-7-10 13:50 | 显示全部楼层
深入探讨USB虚拟串口的工作原理、配置方法以及在实际应用中的表现
albertaabbot 发表于 2025-7-10 16:40 | 显示全部楼层
快速实现嵌入式设备与PC串口通信的开发者。
abotomson 发表于 2025-7-11 14:23 | 显示全部楼层
涵盖了从配置USB虚拟串口到实际应用的整个流程。
hearstnorman323 发表于 2025-7-11 16:34 | 显示全部楼层
如何在STM32C092RC上实现串口通信,
robincotton 发表于 2025-7-12 10:21 | 显示全部楼层
CubeMX配置呢?               
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:硬件工程师
简介:有着多年硬件开发经验的专业人员,专注于医疗电子领域,热衷于对新鲜事物的探索,喜欢DIY!

556

主题

2720

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部