[STM32L5] 【STM32L562 DK试用】5、串口+DMA的妙用

[复制链接]
1800|0
 楼主| Bymyself 发表于 2025-3-23 00:18 | 显示全部楼层 |阅读模式
本帖最后由 Bymyself 于 2025-3-23 00:20 编辑

       对于通信接口来说有很多种,分为串行接口和并行接口,一般是用于数据传输的,我们常用的有USART、SPI、I2C、USB、CAN这些,今天我们就来聊一聊串口。
       串口作为一种广泛应用的通讯接口,以其低成本、易用性和简洁的通信线路著称,能够实现设备间的双向通信。通过单片机的串口,不仅可实现单片机之间的互联,还能通过接口芯片实现单片机与电脑、各类模块的通信,从而显著扩展单片机的应用领域,并大幅提升单片机系统的硬件性能。双向串口通信有两根通信线(发送端TX和接收端RX),并且TX与RX要交叉连接,当只需单向的数据传输时,可以只接一根通信线。
现在的单片机一般都有不止一个串口,我们看一下这次使用的STM32L562的串口分布:
32fd4cea499e16c963c21d1ab0a6d9fc
       可以看到这里面就有5个串口,有的变为UART,有的是USART,UART使用的是异步的通讯方式,USART则是在UART的基础上增加了时钟。
       串口通讯的基本参数:
              ·波特率:串口通讯的速率
              ·起始位:标志一个数据帧的开始,且固定是低电平
              ·数据位:数据帧的有效载荷,1为高电平,0为低电平
              ·校验位:   用于数据验证,根据数据位计算而来(奇偶校验)
              ·停止位:用于数据帧间隔,固定为高电平
       我们本次要使用的是USART1,主要原因如下:
988103374cdfe7faa0a9d704996df5ab
       STlink的接口连接的是PA9和PA10,对应的就是USART1;
8b46b273c552aad86d0ff31537d45297
       这里需要注意,默认开启的引脚不是PA9和PA10,我们需要找到引脚修改一下,串口的默认参数是115200,8位,1停止位,无校验位,咱们可以柑橘需要修改;
接下来打开DMA和中断,我们这里通过串口空闲中断和DMA传输的方式进行接受,通过轮询的方式进行发送,空闲中断是在一组数据接收完成后产生的,也就是说可以接受不定长的数据,其他时候不触发中断,这个时候可以有效实现系统资源的优化利用。
       接下来我们看一下软件方面的配置,首先是初始化阶段,要使能空闲中断:
  1. __HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
  2. HAL_UARTEx_ReceiveToIdle_DMA(&huart1,rx_buffer,200);

       接下来就是在中断服务函数中处理了:
  1. void USART1_IRQHandler(void)
  2. {
  3.   /* USER CODE BEGIN USART1_IRQn 0 */
  4.     IDLE_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE);
  5.     if((IDLE_flag != RESET))
  6.     {
  7.         __HAL_UART_CLEAR_IDLEFLAG(&huart1);

  8.         HAL_UART_DMAStop(&huart1);
  9.         __HAL_UART_DISABLE_IT(&huart1, UART_IT_IDLE);
  10.         uint16_t rx_length = sizeof(rx_buffer) - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
  11.         HAL_UART_Transmit(&huart1, (uint8_t *)&rx_length, 1, 0xFFFF);
  12.         __HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
  13.         HAL_UARTEx_ReceiveToIdle_DMA(&huart1,rx_buffer,200);
  14.     }
  15.   /* USER CODE END USART1_IRQn 0 */
  16.   HAL_UART_IRQHandler(&huart1);
  17.   /* USER CODE BEGIN USART1_IRQn 1 */

  18.   /* USER CODE END USART1_IRQn 1 */
  19. }

       注意空闲中断没有中断回调函数,我们只能在中断中直接处理,实现的基本功能是收到不定长的数据后,返回长度,效果如下:
000d4d8e8594f1336c3dfafd1d90a346

您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

218

帖子

0

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