首页 > 其他分享 >STM32 串口 DMA 接收不定长数据的一种方法

STM32 串口 DMA 接收不定长数据的一种方法

时间:2024-03-29 11:59:19浏览次数:16  
标签:DMA HAL UART RTO STM32 huart 串口 超时

1. 前言

使用串口接收不定长数据时,可以有多种方法,比如最常见的有额外使能一个定时器,在超过定时范围未收到后续的字节时,认为此帧结束;或者利用 IDLE 中断,当数据空闲时,自动产生中断;亦或每接收到一个字节后都通过应用程序进行一次处理。这次我们介绍另外一种方法,在 DMA 方式下利用硬件接收超时中断(Receiver timeout interrupt)实现不定长数据的接收。

2. 实现原理

首先,并非所有的 STM32 系列的 MCU,也并非所有的 USART/UART 外设都支持Receiver timeout (RTO)特性,具体的支持情况,可以通过对应芯片的参考手册去查询。

对于 MCU 的配置,可以通过 USART_RTOR 寄存器的 RTOEN 位使能接收超时功能,通过 RTO 位域配置超时时间,时间单位为传输一个数据位的时间(即波特率)。
接收超时在停止位设置不同的情况下,计时的起始位置不同:

  1. 如果 stop = ’ 00 '或 stop = ’ 11 ',从停止位的末尾开始。
  2. 如果 stop = ’ 10 ',则从第二个停止位的末尾开始。
  3. 如果 stop = ’ 01 ',则从停止位的起始开始。

当计数超过 RTO 位域的设定值时,且使能了 RTOIE 位,就会产生一个错误中断,此时我
们就可以认为此帧结束,进而进行处理。

3. 应用示例

HAL 库已经为我们提供了操作 RTO 相关的 API,应用开发过程,我们直接调用即可。

void HAL_UART_ReceiverTimeout_Config(UART_HandleTypeDef *huart, uint32_t 
TimeoutValue);
HAL_StatusTypeDef HAL_UART_EnableReceiverTimeout(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_UART_DisableReceiverTimeout(UART_HandleTypeDef *huart);

我们以 STM32U575ZIT6 为例,配置一个测试工程。

  1. 系统时钟配置为 160MHz
  2. 配置 USART1 为 Asynchrones,管脚配置为 PA9,PA10
  3. USART1 参数:115200bits/s,8bit,None,1Stop
  4. 使能 USART1 中断
  5. 配置 USART1_RX GPDMA

在这里插入图片描述
在这里插入图片描述
生成工程后,配置超时时间,使能接收超时功能,使能串口的 DMA 接收,处理串口的错误回调函数(接收超时后,HAL 库中经 HAL_UART_ErrorCallback()回调)。

/* USER CODE BEGIN 2 */
 HAL_UART_ReceiverTimeout_Config(&huart1, huart1.Init.BaudRate/100); //10ms BaudRate = 115200
 HAL_UART_EnableReceiverTimeout(&huart1);
 HAL_UART_Receive_DMA(&huart1, Uart_RcvBuf, MAX_UART_RCV_LEN);
 /* USER CODE END 2 */
#define MAX_UART_RCV_LEN 10 //config the max receive data length
uint8_t Uart_RcvBuf[MAX_UART_RCV_LEN];
uint16_t Uart_RcvLen;
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
	if(huart == &huart1)
	{
		/* Check if DMA mode is enabled in UART */
		 if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
		 { 
			 if((huart->ErrorCode & HAL_UART_ERROR_RTO) == HAL_UART_ERROR_RTO)
			 {
				 uint16_t nb_remaining_rx_data = (uint16_t) 
				__HAL_DMA_GET_COUNTER(huart->hdmarx);
				 Uart_RcvLen = MAX_UART_RCV_LEN - nb_remaining_rx_data;
			 }
		 	HAL_UART_Receive_DMA(&huart1, Uart_RcvBuf, MAX_UART_RCV_LEN);
		 }
	}
}

HAL_UART_ErrorCallback 是一个支持所有错误中断的回调函数,在处理 RTO 错误引起的中断响应时,可以通过 ErrorCode 增加相应的判断。

通过调用__HAL_DMA_GET_COUNTER(huart->hdmarx)可以得到 DMA 未搬移完的字节数,从而得到已搬移完成的字节数。

4. 总结

利用 RTO 方式接收不定长串口数据,相比用定时器计时,可以节省一个硬件定时器资源,同时减少了定时器每次进入中断处理的运行时间;相比 IDLE 的方式,可以更灵活的配置超时时间。但需注意的是,所选用的 MCU 以及所使用的 USART/UART 是否支持这个特性要确认好。

在这里插入图片描述


本文档参考ST官方的《【应用笔记】LAT1315+串口DMA接收不定长数据的一种方法》文档。
参考下载地址:https://download.csdn.net/download/u014319604/89044851

标签:DMA,HAL,UART,RTO,STM32,huart,串口,超时
From: https://blog.csdn.net/u014319604/article/details/137106392

相关文章

  • stm32实现舵机速度控制
    一、舵机介绍舵机是一种常用的器件,可以用于机械臂,云台等项目中,通过pwm的占空比来调节实现舵机的旋转角度,所以首先你得会stm32输出pwm波。常用的舵机有90度舵机,180度舵机,270度舵机和360度舵机,根据你的需求来选择舵机的种类,注意一点就是360度舵机控制不了旋转角度。同时如果想要......
  • stm32f103c8t6学习笔记(学习B站up江科大自化协)-DMA
    DMA简介    ·DMA主要用于协助CPU完成数据转运的工作    ·DMA,英文全称DirectMemoryAccess,DMA这个外设是可以直接访问STM32内部存储器的,包括运行内存SRAM,程序存储器flash和寄存器等等,DMA都有权限访问,所以DMA能完成数据转运的工作    ·第二行的外......
  • STM32收发HEX数据包
            在实际应用中,STM32的串口通信都是以数据包格式进行收发,这个数据包一般都包含包头和包尾,表示一个数据包。源代码在文末给出数据包格式:固定长度,含包头包尾可变包长,含包头包尾问题1:当数据包传输时,里面有数据与包头包尾重复怎么办?1:设置限幅,包头包尾设置为数......
  • 02-基于STM32F407MAC与DP83848实现以太网通讯六(IPerf网络速度测试)
    一、IPerf2网络测试工具Iperf2是一个用于测试网络带宽的工具。它是Iperf的旧版本,专注于提供基本的带宽测量功能。通过在客户端和服务器之间发送测试数据流并测量其性能,用户可以评估网络连接的速度和稳定性。Iperf2提供了一种简单而有效的方式来评估网络性能。IPerf3已经发布了,但......
  • 【STM32】Gpio通用输入输出功能应用笔记
    文章目录一、前言1.1开发环境1.2GPIO电路原理1.3板卡电路原理1.3.1按键电路原理1.3.2Led电路原理1.3.3Beep电路原理二、功能实现2.1配置STM32Cubemx工程2.2KeilMDK工程编码2.2.1按键功能代码2.2.2LED灯功能代码2.2.3Beep功能代码2.2.4Main函数代码2.2.5K......
  • QT串口通信原理加实例
    串口通信原理:一、串口通信的基本原理串口的本质功能是作为CPU和串行设备间的编码转换器。当数据从CPU经过串行端口发送出去时,字节数据转换为串行的位(bit);在接收数据时,串行的位被转换为字节数据。应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开......
  • FPGA入门笔记010——UART串口接收模块设计
    1、串口接收模块原理​当对于数据线Rs232_Rx上的每一位进行采样时,一般情况下认为每一位数据的中间点是最稳定的。因此一般应用中,采集中间时刻时的电平即认为是此位数据的电平,如图1所示。图1——串口接收时序图(图中BPS_CLK为采样时钟)​但是在实际工业应......
  • 基于STM32的ModBus实现(二)移植FreeMODBUS TCP
    一、ModBusTCPModbusTCP是一种基于TCP/IP协议的Modbus通信协议的变种。它允许Modbus协议在以太网上进行通信,提供了一种简单而有效的方式来连接不同类型的设备,如传感器、执行器、PLC等。ModbusTCP使用标准的TCP/IP协议栈,因此可以在现有的以太网基础设施上运行,而无需额外的硬......
  • 基于STM32的ModBus实现(一)移植FreeMODBUS RTU
    一、FreeMODBUSFreeModbus是一个开源的Modbus通信协议栈实现。它允许开发者在各种平台上轻松地实现Modbus通信功能,包括串口和以太网。FreeMODBUS提供了用于从设备和主站通信的功能,支持ModbusRTU和ModbusTCP协议。在工业控制和自动化领域广泛应用。FreeModBus可通过官......
  • 串口通信
    串口通信 在对串口进行编程时候,我们要向串口发送指令,然后我们解析串口返回的指令。从.NETFramework2.0开始,C#提供了SerialPort类用于实现串口控制。命名空间:System.IO.Ports。1、常用的字段:PortName:获取或设置通信端口BaudRate:获取或设置串行波特率Parity:获取或设置奇偶......