STM32串口DMA+空闲中断接收数据-基于CubeMX创建

news2025/1/10 23:59:39

串口空闲中断(UART_IT_IDLE):串口接收数据,超过一个字节的时间内没有再接收到数据的时候发生的

好处:与传统的判断'\r','\n'为结束位相比,空闲中断判断串口数据接收完毕准确且迅速

缺点:串口持续不断的发送数据时,无法进入空闲中断。因此需要间隔一个字节以上的时间,间歇式的发送数据。这个缺点在正常使用中,根本不是问题

下面进入主题


打开STM32CubeMX,配置如下:

程序中配置:

usart.c文件中创建接收数组和处理函数:

#define USART1_RX_MAX 2148

uint8_t Rxbuf[USART1_RX_MAX];

uint16_t Rxlen=0;

void Usart_Receive_Data(UART_HandleTypeDef *huart)
{
    if(RESET != __HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE))   //判断是否是空闲中断
    {
         //清除空闲中断标志(否则会一直不断进入中断)
         __HAL_UART_CLEAR_IDLEFLAG(huart);                     
         //计算接收到的数据量
         Rxlen = (USART1_RX_MAX) - (__HAL_DMA_GET_COUNTER(&hdma_usart1_rx));
         //停止接收
         HAL_UART_DMAStop(huart);

    }
}

这里需要注意添加: HAL_UART_DMAStop(huart);//停止接收

不添加的话,DMA接收不会停止,重新开启DMA接收,RX缓存将不会从0开始接收数据

stm32f1xx_it.c文件中调用Usart_Receive_Data()

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */

  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */
  Usart_Receive_Data(&huart1);//调用函数
  /* USER CODE END USART1_IRQn 1 */
}

main.c文件中的main()函数中开启空闲中断启动DMA

main()函数中,判断Rxlen大于0,则开始处理串口数据:

int main(void)
{
    //初始化
    __HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);//开启空闲中断
    HAL_UART_Receive_DMA(&huart1,Rxbuf,USART1_RX_MAX);    //启动DMA接收
    while(1)
    {
        if(Rxlen>0){
            //处理串口数据
            //清空串口缓存并Rxlen=0
            memset(Rxbuf,0,USART1_RX_MAX);
            Rxlen=0;
            //重新开启DMA接收   
            HAL_UART_Receive_DMA(&huart1,Rxbuf,USART1_RX_MAX);    //启动DMA接收     
        }    
    }
}

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

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

相关文章

分布式系统常用的模式

分布式系统常用的模式 Ambassador 名称:“大使”模式 介绍:作为应用程序和其他服务的“中间人”,负责应用程序和其他服务之间的通信,包括日志、监控或重试处理等任务。 举例:K8S使用Envoy作为一个“大使”来简化服务…

[C语言] 结构体

结构体类型的声明 结构体初始化 结构体成员访问 结构体传参 目录 1. 结构体的声明 1.1 结构的基础知识 1.2 结构的声明 1.3 结构成员的类型 1.4 结构体变量的定义和初始化 2. 结构体成员的访问 3. 结构体传参 1. 结构体的声明 1.1 结构的基础知识 结构是一些值的集…

Windows系统管理一:操作系统概述

计算机系统的层次结构 五大基本功能 处理器管理 其工作主要是进程调度,在单用户单任务的情况下,必处理器仅为一个用户的一个任务所独占,进程管理的工作十分简单。但在多道程序或多用户的情况下,组织多个作业或任务时&#xff0c…

归并排序的递归和非递归实现

归并排序 平均时间复杂度O(n*logn),空间复杂度O(n) 递归实现 思路: 分治法 即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序是一种稳定的排序方法 code: //递归版public st…

Linux 安装 JDK

要在Linux上安装JDK 1,按照以下步骤进行操作: 1. 下载JDK安装文件:首先,你需要找到适用于你操作系统的JDK安装文件(tar.gz或tar.bz2格式)。你可以从Oracle官方网站或其他可信的来源下载该文件。 2. 解压…

Unity 自制转表插件,高效便捷,无反射代码

XlsxTransverter Unity 高效转表工具 剔除了上一版本的反射用法 使用代码生成的 Decode方法来自解析 并与内存stream流保持一一对应 极大的提高了读表的访问速度 字段和字节流 保持一一对应 程序自动生成 decode方法 内存布局 Unity读表插件 https://github.com/badApple001/…

conda环境安装opencv带cuda版本

主要是cmake编译选项需要修改 以下两个选项按照自己情况修改 -D OPENCV_EXTRA_MODULES_PATH../opencv_contrib/modules \ -D CUDA_TOOLKIT_ROOT_DIR/usr/local/cuda-12.2 \ 其中/home/lixin/anaconda3/envs/stereo 改成你自己的conda环境 cmake -D CMAKE_BUILD_TYPER…

BUUCTF-WEB-[ACTF2020 新生赛]Includel

打开靶机 点击tips 利用Burp抓包,未见异常 但发现了响应头是 PHP/7.3.13 想到了"php://input"伪协议POST发送PHP代码 构建Payload:?filephp://filter/readconvert.base64-encode/resourceflag.php 这里需要注意的是使用php://filter伪协议…

PHP对接阿里云虚拟号的实现(号码隐私保护)

fastadmin 封装框架 实现功能:AXN隐私号绑定、解绑; 场景:为店铺手机号开通虚拟号,用户联系店铺展示虚拟号码; 官方开放文档地址:https://help.aliyun.com/document_detail/59655.html?spma2c4g.111742…

医院空调冷热源设计方案VR元宇宙模拟演练的独特之处

作为一个备受关注的技术-元宇宙,毋庸置疑的是,因为建筑本身契合了时尚、前卫、高端、虚拟、科幻、泛在、协作、互通等元素特征,因此在建筑行业更需要元宇宙,以居民建筑环境冷热源设计来说,元宇宙会打破既定的现实阻碍和…

【MySQL】MySQL 数据库基础

MySQL 数据库基础 一. 数据库的操作1. 显示当前的数据库2. 创建数据库3. 使用数据库4. 删除数据库 二. 常用数据类型1. 数据类型2. 字符串类型3. 日期类型 三. 表的操作1. 查看表结构2. 创建表4. 删除表 一. 数据库的操作 1. 显示当前的数据库 SHOW DATABASES;MySQL 不区分大…

PHP设备检验系统Dreamweaver开发mysql数据库web结构php编程计算机网页代码

一、源码特点 PHP设备检验系统是一套完善的web设计系统,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 下载地址 https://download.csdn.net/download/qq_41221322/88306259 php设备检验系统1 …

海康机器人工业相机IP设置方式

文章目录 一.什么情况下需要修改相机IP二.网口相机IP地址修改方式 一.什么情况下需要修改相机IP 二.网口相机IP地址修改方式

IO多路转接poll和epoll

文章目录 pollpoll和select的区别poll的底层实现方式什么是epollepoll执行原理epoll接口struct epoll_event是什么结构 epoll的两种触发方式epoll底层实现epoll总结 poll #include <poll.h> int poll(struct pollfd *fds, nfds_t nfds, int timeout);参数&#xff1a; …

大数据(八):Pandas的基础应用详解(五)

专栏介绍 结合自身经验和内部资料总结的Python教程&#xff0c;每天3-5章&#xff0c;最短1个月就能全方位的完成Python的学习并进行实战开发&#xff0c;学完了定能成为大佬&#xff01;加油吧&#xff01;卷起来&#xff01; 全部文章请访问专栏&#xff1a;《Python全栈教…

MySQL表的CURD

CRUD : Create(创建), Retrieve(读取)&#xff0c;Update(更新)&#xff0c;Delete&#xff08;删除&#xff09; Create 语法 INSERT [INTO] table_name [(column [, column] ...)] VALUES (value_list) [, (value_list)] ... value_list: value, [, value] ... 示例&#x…

第 2 章 线性表(学生健康登记表实现)

1. 示例代码 1) status.h /* DataStructure 预定义常量和类型头文件 */#ifndef STATUS_H #define STATUS_H/* 函数结果状态码 */ #define TRUE 1 /* 返回值为真 */ #define FALSE 0 /* 返回值为假 */ #define RET_OK 0 /* 返回值正确 */ #define INFEASI…

Datax抽取mysql的bit类型数据

背景&#xff1a;使用datax抽取mysql的一张表&#xff0c;里面有两个bit类型的字段&#xff0c;抽取出来显示如下&#xff1a; 需要在抽取reader里面进行处理配置 最终生成的datax的json文件reader的配置会转换为具体的数值 最终查询效果&#xff1a;

python1图书点评推荐系统的设计与实现vue

本次设计任务是要设计一个图书点评网&#xff0c;通过这个系统能够满足用户对图书信息下载、收藏功能。系统的主要功能包括&#xff1a;首页、个人中心、用户管理、图书分类管理、图书信息管理、留言板管理、系统管理等功能。 管理员可以根据系统给定的账号进行登录&#xff0c…

新版edge浏览器读取谷歌浏览器上的历史记录

上一篇&#xff1a;(3条消息) 新版edge浏览器读取谷歌浏览器上的历史记录_learningbilibili的博客-CSDN博客https://blog.csdn.net/learningbilibili/article/details/123662218 关于上次的读取历史记录的问题是现在的edge浏览器最近的版本更新后出现了每次启动时从 Google Chr…