【STM32C092RC 测评】串口通信:利用USB虚拟串口与PC交互
本次我们主要测试的是串口通信功能,并通过调试器的虚拟串口实现和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>
效果如下,可以计算收到的数据大小,然后回传:
页:
[1]