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 = 115200HAL_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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud实用篇(一)

1.SpringCloud SpringCloud是目前国内使用最广泛的微服务框架。官网地址:Spring Cloud SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验: SpringCloud与SpringBoo…

Win10环境下使用Ollama搭建本地AI

前言: 1、Ollama需要安装0.1.27版本,高于这个版本在执行Ollama run 指令时会频繁触发一些奇奇怪怪的问题。 2、4.3篇章是重点,若你需要使用web访问的话,莫要忘记! 3、本文章适合新手。 4、篇章5中会介绍如何在vscode中…

探索PLC远程监控的未来:节约成本与提高效率的双赢之道

描述:随着工业自动化技术的飞速发展,PLC远程监控及程序上下载功能成为了行业的新宠,为企业节约成本,减少人员出差带来了革命性的改变。本文深入探讨了这一变革给自动化公司、客户和工程师带来的好处,以及谁是最大的受益…

基于TSINGSEE青犀AI视频智能分析技术的山区林区烟火检测方案

随着清明节的临近,山区、林区防火迫在眉睫,TSINGSEE青犀AI智能分析网关V4烟火检测算法利用物联网、人工智能、图像识别技术,有效监测和管理烟火活动,并在火灾发生的同时发出告警,通知护林员与管理人员。 将山区林区的视…

Leetcode 第 126 场双周赛题解

Leetcode 第 126 场双周赛题解 Leetcode 第 126 场双周赛题解题目1:3079. 求出加密整数的和思路代码复杂度分析 题目2:3080. 执行操作标记数组中的元素思路代码复杂度分析 题目3:3081. 替换字符串中的问号使分数最小思路代码复杂度分析 题目4…

[LeetCode]516. 最长回文子序列[记忆化搜索解法详解]

最长回文子序列 LeetCode 原题链接 题目 给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。 子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。 示例 1&#xff1a…

Day46:WEB攻防-注入工具SQLMAPTamper编写指纹修改高权限操作目录架构

目录 数据猜解-库表列数据&字典 权限操作-文件&命令&交互式 提交方法-POST&HEAD&JSON 绕过模块-Tamper脚本-使用&开发 分析拓展-代理&调试&指纹&风险&等级 知识点: 1、注入工具-SQLMAP-常规猜解&字典配置 2、注入…

【有芯职说】数字芯片BES工程师

一、 数字芯片BES工程师简介 今天来聊聊数字芯片BES工程师,其中BES是Back End Support的缩写,就是后端支持的意思。其实这个岗位是数字IC前端设计和数字IC后端设计之间的一座桥,完成从寄存器传输级设计到具体工艺的mapping和实现。这个岗位在…

牛客小白月赛89(A,B,C,D,E,F)

比赛链接 官方视频讲解(个人觉得讲的还是不错的) 这把BC偏难,差点就不想做了,对小白杀伤力比较大。后面的题还算正常点。 A 伊甸之花 思路: 发现如果这个序列中最大值不为 k k k,我们可以把序列所有数…

Linux——信号的保存与处理

目录 前言 一、信号的常见概念 1.信号递达 2.信号未决 3.信号阻塞 二、Linux中的递达未决阻塞 三、信号集 四、信号集的处理 1.sig相关函数 2.sigprocmask()函数 3.sigpending()函数 五、信号的处理时机 六、信号处理函数 前言 在之前,我们学习了信号…

学习JavaEE的日子 Day32 线程池

Day32 线程池 1.引入 一个线程完成一项任务所需时间为: 创建线程时间 - Time1线程中执行任务的时间 - Time2销毁线程时间 - Time3 2.为什么需要线程池(重要) 线程池技术正是关注如何缩短或调整Time1和Time3的时间,从而提高程序的性能。项目中可以把Time…

如何使用Windows电脑部署Lychee私有图床网站并实现无公网IP远程管理本地图片

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-MSVdVLkQMnY9Y2HW {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

NB-IOT——浅谈NB-IOT及模块测试

浅谈NB-IOT及模块基本使用测试 介绍什么是NB-IOT?NB-IOT的特点 使用准备基本使用 总结 介绍 什么是NB-IOT? NB-IoT,即窄带物联网(Narrowband Internet of Things),是一种低功耗广域物联网(LPW…

MongoDB Atlas维护指南:常见类型、注意事项与窗口设置

为了给Atlas用户更好的产品体验,MongoDB产品团队会进行定期维护。 本文将会介绍: 常见维护项目种类及频率,注意事项维护期间的影响及建议维护窗口设置说明维护告警设置和邮件通知范例 维护窗口常见项目 定期SSL证书轮换软件升级&#xff…

Golang生成UUID

安装依赖 go get -u github.com/google/uuid示例 函数签名func NewV7() ( UUID ,错误) uid : uuid.NewV7()

Java八股文(数据结构)

Java八股文の数据结构 数据结构 数据结构 请解释以下数据结构的概念:链表、栈、队列和树。 链表是一种线性数据结构,由节点组成,每个节点包含了指向下一个节点的指针; 栈是一种后进先出(LIFO)的数据结构&a…

Mac添加和关闭开机应用

文章目录 mac添加和关闭开机应用添加开机应用删除/查看 mac添加和关闭开机应用 添加开机应用 删除/查看 打开:系统设置–》通用–》登录项–》查看登录时打开列表 选中打开项目,点击“-”符号

华为防火墙配置指引超详细(包含安全配置部分)以USG6320为例

华为防火墙USG6320 华为防火墙USG6320是一款高性能、高可靠的下一代防火墙,适用于中小型企业、分支机构等场景。该防火墙支持多种安全功能,可以有效抵御网络攻击,保护网络安全。 目录 华为防火墙USG6320 1. 初始配置 2. 安全策略配置 3. 防火墙功能配置 4. 高可用性配…

论文笔记:分层问题-图像共注意力问答

整理了2017 Hierarchical Question-Image Co-Attention for Visual Question Answering)论文的阅读笔记 背景模型问题定义模型结构平行共注意力交替共注意力 实验可视化 背景 视觉问答(VQA)的注意力模型在此之前已经有了很多工作,这种模型生成了突出显示…

词令关键词口令直达工具:打开「词令」输入关键词直达口令怎么使用?

词令是一款关键词口令直达工具;使用词令关键词口令直达工具,输入指定的词令关键词直达口令,搜索直达该词令关联的网站、页面、程序、应用、服务或功能等等,实现一键直达目标,避免繁琐的查找点击行为,提高用…