打印
[STM32C0]

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

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

      接下来就是在中断服务函数中处理了,中断实际上有了一个处理程序,不过我们不需要他的回调,直接处理空闲中断部分:
<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>

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

使用特权

评论回复
沙发
AdaMaYun| | 2025-6-8 23:35 | 只看该作者
USB通讯还是非常快的

使用特权

评论回复
板凳
yiyigirl2014| | 2025-6-10 11:01 | 只看该作者
单片机可以自己用USB模拟串口?

使用特权

评论回复
地板
yiyigirl2014| | 2025-6-10 11:01 | 只看该作者
看差了,原来还是要 通过烧录器 上的串口连接电脑啊。

使用特权

评论回复
5
qintian0303|  楼主 | 2025-6-10 20:19 | 只看该作者
yiyigirl2014 发表于 2025-6-10 11:01
单片机可以自己用USB模拟串口?

可以的,不过这个板子是STM32C092RC,引出来的是CAN,C071这种带USB的就可以

使用特权

评论回复
6
jackcat| | 2025-7-3 14:29 | 只看该作者
介绍了如何使用STM32CubeMX配置USB虚拟串口

使用特权

评论回复
7
backlugin| | 2025-7-3 21:29 | 只看该作者
在实际项目中使用USB虚拟串口与PC进行交互。

使用特权

评论回复
8
yorkbarney| | 2025-7-4 12:17 | 只看该作者
正确配置了USB设备描述符,包括但不限于设备类(CDC)、子类、协议等信息。

使用特权

评论回复
9
saservice| | 2025-7-4 17:47 | 只看该作者
对于开发者来说是一个重要的功能点,因为它涉及到设备的调试、数据传输和用户交互等方面。

使用特权

评论回复
10
nomomy| | 2025-7-4 19:41 | 只看该作者
对代码进行优化,提高通信效率和稳定性。

使用特权

评论回复
11
kkzz| | 2025-7-5 20:30 | 只看该作者
USB虚拟串口是一种常见的通信方式

使用特权

评论回复
12
iyoum| | 2025-7-5 22:40 | 只看该作者
对比轮询与中断+DMA方案的性能差异

使用特权

评论回复
13
backlugin| | 2025-7-6 11:50 | 只看该作者
如何配置STM32C092RC的USB虚拟串口

使用特权

评论回复
14
sheflynn| | 2025-7-6 17:35 | 只看该作者
对比传统UART与USB虚拟串口的差异

使用特权

评论回复
15
lihuami| | 2025-7-7 13:40 | 只看该作者
使用STM32CubeMX生成初始化代码

使用特权

评论回复
16
usysm| | 2025-7-10 13:50 | 只看该作者
深入探讨USB虚拟串口的工作原理、配置方法以及在实际应用中的表现

使用特权

评论回复
17
albertaabbot| | 2025-7-10 16:40 | 只看该作者
快速实现嵌入式设备与PC串口通信的开发者。

使用特权

评论回复
18
abotomson| | 2025-7-11 14:23 | 只看该作者
涵盖了从配置USB虚拟串口到实际应用的整个流程。

使用特权

评论回复
19
hearstnorman323| | 2025-7-11 16:34 | 只看该作者
如何在STM32C092RC上实现串口通信,

使用特权

评论回复
20
robincotton| | 2025-7-12 10:21 | 只看该作者
CubeMX配置呢?               

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

513

主题

2557

帖子

11

粉丝