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

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是否支持这个特性要确认好。

登录大大通,了解更多详情,解锁1500+完整应用方案,更有大联大700+FAE在线答疑解惑! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/517550.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一文了解:工业互联网的技术构成,代表性平台。

一、什么是工业互联网 工业互联网是指将传统工业领域与互联网技术相结合,实现设备、系统和人员之间的信息传递和协同工作,以提高生产效率、降低成本和改善产品质量。 二、工业互联网构成 它的构成主要包括以下几个方面: 传感器和物联网设备…

【Linux】网络基础常识{OSI七层模型/ TCP/IP / 端口号 /各种协议}

文章目录 1.网络常识1.0DHCP协议1. 1IP地址/MAC地址/ARP协议是什么?IP/MACARP:IP ⇒ MAC 1.2手机连接wifi的原理 SSID与BSSID手机连接wifiSSID与BSSID 1.3手机如何通过“数据/流量”上网?1.4电脑连接wifi的原理?电脑通过热点上网…

npm install node-sass报错

前言 在使用 node-sass 时,你可能会遇到安装 node-sass 时出现各种错误的情况。在本文中,我们将探讨一些常见的 node-sass 安装错误,以及如何解决它们。 无论你是初学者还是有经验的开发者,本文都将为你提供有用的信息和技巧&…

基于DSP28335的直流伺服电机转速控制

目录 一、设计任务 1.1、任务 1.2系统参数 二、总体设计思路 2.1硬件结构 三、转速或位置测量的计算方法 3.1转速测量方法 3.2具体参数计算 控制算法的选择 4.1PID算法(位置式与增量式) 4.1.1位置式PID算法 4.1.2增量式PID算法 4.2专家PID算法 五、系统工…

一站式知识库服务平台真的有那么好用吗?看完你就懂了

在快速发展的信息化社会,我们经常会听到“知识就是力量”的这句话,而一个一站式的知识库服务平台就是这样一把“开启力量之门”的钥匙。那么,这把钥匙真的有那么好用吗?让我们一起探讨一下。 首先,“一站式”可能已经解…

计算机服务器中了helper勒索病毒怎么办,helper勒索病毒解密流程步骤

随着网络技术在企业中的不断应用,越来越多的企业离不开网络,网络为企业提供了极大便利,大大提升了生产运营效率,由此而产生的网络数据安全问题也成为了企业关心的主要话题。近期,云天数据恢复中心接到多家企业的求助&a…

Github 2024-04-05Java开源项目日报Top9

根据Github Trendings的统计,今日(2024-04-05统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目9TypeScript项目1OpenAPI 生成器:基于规范自动生成API工具 创建周期:2155 天开发语言:Java协议类型:Apache License 2.0Star数量:1…

Kafka参数介绍

官网参数介绍:Apache KafkaApache Kafka: A Distributed Streaming Platform.https://kafka.apache.org/documentation/#configuration

第14章 数据结构与集合源码

一 数据结构剖析 我们举一个形象的例子来理解数据结构的作用: 战场:程序运行所需的软件、硬件环境 战术和策略:数据结构 敌人:项目或模块的功能需求 指挥官:编写程序的程序员 士兵和装备:一行一行的代码 …

Docker 容器编排技术解析与实践

探索了容器编排技术的核心概念、工具和高级应用,包括 Docker Compose、Kubernetes 等主要平台及其高级功能如网络和存储管理、监控、安全等。此外,文章还探讨了这些技术在实际应用中的案例,提供了对未来趋势的洞见。 一、容器编排介绍 容器编…

各种滤波算法

各种滤波算法 1. 半径离群点去除(Radius Outlier Removal,半径滤波)2. 统计离群点剔除(Statistical Outlier Removal, 统计滤波)3. 体素网格将采样(voxel grid downsampling)4. 最远点采样(Farthest Point Sampling, FPS)5. 正态空间将采样(Normal Space Sampling, …

最优算法100例之30-表示数值的字符串

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如&a…

【35分钟掌握金融风控策略3】场景概述3

目录 ​编辑 场景概述 贷前、贷中、贷后的划分及对应的风控场景 贷前风控场景简介 预授信 授信审批 定额 定价 人工审核 场景概述 贷前、贷中、贷后的划分及对应的风控场景 在金融风控全生命周期中,贷前主要是指授信成功及之前的阶段、贷中主要是指授信成…

链表的应用

⽬录 1. 单链表经典算法OJ题⽬ 1.1 单链表相关经典算法OJ题1:移除链表元素 203. 移除链表元素 - 力扣(LeetCode) /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ typedef …

基于opencv的猫脸识别模型

opencv介绍 OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库。OpenCV是由英特尔公司发起并参与开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用。OpenCV可用于开发实时的图像处理、计算机视觉以及…

ctf刷题记录2(更新中)

因为csdn上内容过多编辑的时候会很卡&#xff0c;因此重开一篇&#xff0c;继续刷题之旅。 NewStarCTF 2023 WEEK3 Include &#x1f350; <?phperror_reporting(0);if(isset($_GET[file])) {$file $_GET[file];if(preg_match(/flag|log|session|filter|input|data/i, $…

解锁金融数据中心场景,实现国产化AD替代,宁盾身份域管为信创电脑、应用提供统一管理

随着信创国产化改造持续推进&#xff0c;越来越多的金融机构不断采购信创服务器、PC、办公软件等&#xff0c;其 IT 基础设施逐渐迁移至国产化 IT 架构下。为支撑国产化 IT 基础设施的正常使用和集中管理运维&#xff0c;某金融机构数据中心的微软Active Directory&#xff08;…

二、GitLab相关操作

GitLab相关操作 一、组、用户、项目管理1.创建组2.创建项目3.创建用户并分配组3.1 创建用户3.2 设置密码3.3 给用户分配组 二、拉取/推送代码1.配置ssh(第一次需要)1.1 创建一个空文件夹1.2 配置本地仓账号和邮箱1.3 生成ssh公钥密钥1.4 gitlab配置公钥 2.拉取代码3.推送代码3.…

FastAPI Web框架教程 第10章 APIRouter

10-1 APIRouter基本使用 需求场景 如果我们写一个网站&#xff0c;或者写一个APP&#xff0c;那整个项目应该是比较复杂的&#xff0c;此时不应该把所有代码放在一个文件中。 前几节课&#xff0c;我们通过把代码拆分到不同文件的方式&#xff0c;可以解决一些代码混乱的问题…

SD-WAN帮助企业实现对分布式网络的集中管理和控制

在当今数字化时代&#xff0c;企业网络越来越分散和复杂&#xff0c;分布在全球不同地点的分支机构和远程办公地点需要高效的网络连接来支持业务运营。传统的广域网&#xff08;WAN&#xff09;架构已经无法满足企业对网络灵活性、可靠性和安全性的需求。而SD-WAN的出现为解决这…