打印
[STM32L5]

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

[复制链接]
135|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 Bymyself 于 2025-3-23 00:20 编辑

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

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

        HAL_UART_DMAStop(&huart1);
        __HAL_UART_DISABLE_IT(&huart1, UART_IT_IDLE);
        uint16_t rx_length = sizeof(rx_buffer) - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
        HAL_UART_Transmit(&huart1, (uint8_t *)&rx_length, 1, 0xFFFF);
        __HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
        HAL_UARTEx_ReceiveToIdle_DMA(&huart1,rx_buffer,200);
    }
  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */

  /* USER CODE END USART1_IRQn 1 */
}

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

使用特权

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

本版积分规则

7

主题

212

帖子

0

粉丝