当前位置: 首页 > news >正文

嵌入式学习(18)-stm32F407串口接收空闲中断+DMA

一、概述

在一些一次性接收大批量数据的引用场合,如果使用接收中断会频繁的进入接收中断影响代码的运行效率。为了解决这个问题可以使用串口的空闲中断+DMA实现。

二、应用

在网上招了一些例程在STM32F407的平台上都没有跑通会出现各种异常,主要原因还是库的版本有更新可能和当前的工程不匹配,经过几天的煎熬终于调通了流程。

三、代码实现

1、初始化程序

void USART3_Init(uint32_t baudrate)
{/* IO 及 时钟配置 */USART3_TX_GPIO_CLK_ENABLE(); /* 使能 串口TX脚 时钟 */USART3_RX_GPIO_CLK_ENABLE(); /* 使能 串口RX脚 时钟 */USART3_CLK_ENABLE();      /* 使能 串口 时钟 */GPIO_InitTypeDef gpio_init_struct;gpio_init_struct.Pin = USART3_TX_GPIO_PIN;gpio_init_struct.Mode = GPIO_MODE_AF_PP;gpio_init_struct.Pull = GPIO_PULLUP;gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;gpio_init_struct.Alternate = USART3_TX_GPIO_AF;              /* 复用为串口 */HAL_GPIO_Init(USART3_TX_GPIO_PORT, &gpio_init_struct); /* 串口TX 脚 模式设置 *///gpio_init_struct.Pin = USART3_RX_GPIO_PIN;gpio_init_struct.Alternate = USART3_RX_GPIO_AF;              /* 复用为USART3 */HAL_GPIO_Init(USART3_RX_GPIO_PORT, &gpio_init_struct); /* 串口RX 脚  *//* USART 初始化设置 */USART3_handler.Instance = USART3;                  /* 选择串口屏对应的串口 */USART3_handler.Init.BaudRate = baudrate;               /* 波特率 */USART3_handler.Init.WordLength = UART_WORDLENGTH_8B;   /* 字长为8位数据格式 */USART3_handler.Init.StopBits = UART_STOPBITS_1;        /* 一个停止位 */USART3_handler.Init.Parity = UART_PARITY_NONE;         /* 无奇偶校验位 */USART3_handler.Init.HwFlowCtl = UART_HWCONTROL_NONE;   /* 无硬件流控 */USART3_handler.Init.Mode = UART_MODE_TX_RX;            /* 收发模式 */HAL_UART_Init( &USART3_handler);                       /* 使能对应的串口, 但会调用MSp */
//    __HAL_UART_DISABLE_IT( &USART3_handler, UART_IT_TC);__HAL_UART_ENABLE_IT( &USART3_handler, UART_IT_RXNE);  /* 开启接收中断 */__HAL_UART_ENABLE_IT(&USART3_handler, UART_IT_IDLE);    // 使能串口接收空闲中断HAL_NVIC_SetPriority(USART3_IRQn, 3, 3);              /* 抢占优先级3,子优先级3 */HAL_NVIC_EnableIRQ(USART3_IRQn);                      /* 使能USART1中断 */	__HAL_RCC_DMA1_CLK_ENABLE();// 低优先级
//    __HAL_LINKDMA(&USART3_handler, hdmatx, g_dma_handle);   /* 将DMA与USART3联系起来(发送DMA) */	 
__HAL_LINKDMA(&USART3_handler, hdmarx, g_dma_handle); g_dma_handle.Instance = DMA1_Stream1;                    /* 数据流选择 */g_dma_handle.Init.Channel = DMA_CHANNEL_4;                               /* DMA通道选择 */g_dma_handle.Init.Direction = DMA_PERIPH_TO_MEMORY;           /* 外设到存储器 */g_dma_handle.Init.PeriphInc = DMA_PINC_DISABLE;               /* 外设非增量模式 */g_dma_handle.Init.MemInc = DMA_MINC_ENABLE;                   /* 存储器增量模式 */g_dma_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;  /* 外设数据长度:8位 */g_dma_handle.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;     /* 存储器数据长度:8位 */g_dma_handle.Init.Mode = DMA_NORMAL;                          /* 外设流控模式 */g_dma_handle.Init.Priority = DMA_PRIORITY_MEDIUM;             /* 中等优先级 */g_dma_handle.Init.FIFOMode = DMA_FIFOMODE_DISABLE;            /* 关闭FIFO模式 */g_dma_handle.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;    /* FIFO阈值配置 */g_dma_handle.Init.MemBurst = DMA_MBURST_SINGLE;               /* 存储器突发单次传输 */g_dma_handle.Init.PeriphBurst = DMA_PBURST_SINGLE;            /* 外设突发单次传输 */	
//	  HAL_DMA_Init(&g_dma_handle);                          // 将DMA与USART3联系起来(接收DMA)HAL_UART_Receive_DMA(&USART3_handler, g_rcvDataBuf, MAX_BUF_SIZE);             // 开启DMA接收HAL_DMA_Start(&g_dma_handle,(uint32_t)&USART3->DR,(uint32_t)&g_rcvDataBuf,MAX_BUF_SIZE);}

2、中断处理

void USART3_IRQHandler(void)
{
//     printf("t");uint8_t res;uint16_t PACKET_DATA_LEN;uint16_t t;__HAL_UNLOCK( &USART3_handler);//    if ((__HAL_UART_GET_FLAG( &USART3_handler, UART_FLAG_RXNE) != RESET)) /* 接收到数据 */
//    {
//        HAL_UART_Receive( &USART3_handler, &res, 1, 1000);Buffer_Push( &RF_Buffer, res); //接收数据,
//        		printf("%c",res);
//    }	if (__HAL_UART_GET_FLAG(&USART3_handler, UART_FLAG_IDLE) != RESET)                 // 获取接收IDLE标志位是否被置位{   printf("进入空闲中断 !\r\n");          __HAL_UART_CLEAR_IDLEFLAG(&USART3_handler); 
//		HAL_UART_DMAStop(&USART3_handler); 	  /* 异常 */	HAL_DMA_Abort(&g_dma_handle);PACKET_DATA_LEN = (MAX_BUF_SIZE - __HAL_DMA_GET_COUNTER(&g_dma_handle));t=__HAL_DMA_GET_COUNTER(&g_dma_handle);	printf("使用存储空间:%d 剩余存储空间:%d\r\n",PACKET_DATA_LEN,t);printf("接收到的数据:%s",g_rcvDataBuf);HAL_UART_Receive_DMA(&USART3_handler, (uint8_t *)g_rcvDataBuf, MAX_BUF_SIZE);  HAL_DMA_Start(&g_dma_handle,(uint32_t)&USART3->DR,(uint32_t)&g_rcvDataBuf,MAX_BUF_SIZE);// 重新开启DMA传输memset(g_rcvDataBuf, 0, sizeof(g_rcvDataBuf));}}

3、测试结果

4、源码链接

STM32F407基于串口空闲中断和DMA的实现可以实现大批量数据的接收资源-CSDN文库

相关文章:

嵌入式学习(18)-stm32F407串口接收空闲中断+DMA

一、概述 在一些一次性接收大批量数据的引用场合,如果使用接收中断会频繁的进入接收中断影响代码的运行效率。为了解决这个问题可以使用串口的空闲中断DMA实现。 二、应用 在网上招了一些例程在STM32F407的平台上都没有跑通会出现各种异常,主要原因还…...

b站视频爬虫-词云分析

一、设置爬虫程序 # requests 请求b站视频 import jsonimport fake_useragent import requests from lxml import etreeif __name__ == __main__:# UA伪装head = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like …...

如何防止订单二次重复支付?

如何防止订单二次重复支付? 在电商平台和支付系统中,防止订单二次重复支付是一个至关重要的功能。以下是一些常见的策略和技术手段,用于确保订单支付的幂等性和一致性。 目录 唯一订单号订单状态检查数据库事务乐观锁悲观锁支付渠道状态核查…...

LeetCode 24反转链表

单链表反转:详细解析与代码实现 在数据结构的学习过程中,链表是一个非常重要且有趣的部分,而单链表的反转操作更是常考的基础知识点。今天就来和大家详细讲讲如何实现单链表的反转,并通过代码示例来加深理解呀。 题目 给定单链…...

用python的flask写的一个MQTT中转功能,http的方式发送数据和接收数据

需求背景 给一个客户对接人脸识别的设备,最后需要通知服务端进行一些消息推送。 简单例子 # 作者 陈老师 # https://v.iiar.cn import json import paho.mqtt.client as mqtt import requests from flask import Flask, requestapp Flask(__name__)# MQTT配置 mq…...

img引入svg如何修改颜色

方法1:通过css中filter:drop-shadow 首先需要一个容纳图标的父盒子(下方实例中的.svg-img),通过css造一个图标的‘影子’(.svg-color中的drop-shadow),然后设置‘影子’的颜色,再把图标本体移出父盒子&…...

计算机毕业设计PySpark+PyFlink+Hive地震预测系统 地震数据分析可视化 地震爬虫 大数据毕业设计 Hadoop 机器学习 深度学习

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...

【Python】使用Numpy实现余弦相似度计算

本文详细介绍了如何使用 NumPy 实现两个向量之间的余弦相似度计算,帮助理解向量相似度在推荐系统、文本处理等领域的应用。 1. 余弦相似度定义 余弦相似度是衡量两个向量在高维空间中夹角大小的指标,其公式为: c o s ( θ ) A ⋅ B ∥ A ∥…...

nginx中的root和alias的区别

alias 在E:\\test\\目录下创建一个index.html文件 在nginx.conf文件配置alias,路径填写为绝对路径,但是要注意,这里结尾是文件夹的名字 然后下面的/aa/ 是随便起的名字,也不是文件夹的名字,在浏览器访问的使用的 在浏览器使用 …...

探索Telnet:实现Windows远程登录Ubuntu的实践指南

前言 在互联网技术日新月异的今天,远程登录已经成为许多开发者和系统管理员日常工作中不可或缺的一部分。虽然SSH已经成为远程登录的首选协议,但了解并掌握Telnet这一经典协议仍然具有重要意义。本文将带您一起探索如何使用Telnet实现Windows远程登录Ub…...

在 Vue 2 中隐藏页面元素的方法

目录 在 Vue 2 中隐藏页面元素的方法 引言 1. 使用 v-if 指令 2. 使用 v-show 指令 3. 使用自定义类名与 v-bind:class 4. 使用内联样式与 v-bind:style 5. 使用组件的 keep-alive 和条件渲染 在 Vue 2 中隐藏页面元素的方法 引言 在开发 Web 应用时,我们经…...

【Java】Java8的4个函数式接口简单教程

什么是函数是接口? 函数式接口是一个包含 单个抽象方法 的接口,且可以有任意多个默认方法或静态方法。为了增强可读性,Java 8 引入了 FunctionalInterface 注解,用于标识该接口是一个函数式接口,编译器会帮助我们检查…...

计算机组成原理与系统结构——微程序控制

笔记内容及图片整理自XJTUSE “计算机组成原理与系统结构” 课程ppt,仅供学习交流使用,谢谢。 基本概念 微指令 将控制单元实现为基本逻辑单元之间的互连并非易事,且设计相对呆板,难以灵活地改变,因此实现微程序控制…...

【Swift】集合类型 - 数组、集合、字典

文章目录 集合的可变性数组数组类型简写语法创建空数组使用默认值创建数组通过合并两个数组创建一个新数组使用数组字面量创建数组访问和修改数组 Swift 提供了三种主要的 集合类型,分别是数组、集合和字典,用于存储值集合。数组是有序的值集合。集合是无…...

3D 视觉定位技术:汽车零部件制造的智能变革引擎

在汽车零部件制造领域,传统工艺正面临着前所未有的挑战。市场对于零部件精度与生产效率近乎苛刻的要求,促使企业寻求突破之道。而 3D 视觉定位技术,为汽车零部件制造开启了精准定位与智能化生产的新纪元。 3D 视觉定位系统的核心技术原理 3…...

操作系统的基本认识

操作系统的感性认识 操作系统这个词可能或多或少听说过,比如windows, linux, macOS。这些其实都是工程师们经过实践后的具象化产物。而操作系统原理这六个字就是操作系统的抽象化,更准确的说,操作系统原理是很理论化的东西。举一个不是很恰当…...

使用pycharm连接远程服务器

使用pycharm连接远程服务器 1.在你的项目里配置 SSH ,放到服务器上去跑 主机为服务器的IP地址,输入用户名和密码 配置项目位置、选择编译器 2.设置本地更改代码保存后即上传到服务器 在本地使用 pycharm 调试代码,pycharm 上面的代码更改…...

【Linux SH脚本】LinuxCheck 应急检查信息脚本

LinuxCheck 1.下载地址 【Linux SH脚本】LinuxCheck 应急检查信息脚本 2.简介 LinuxCheck 是一个开源的自动化检查脚本,旨在快速检测 Linux 系统的安全配置和潜在问题。它支持多种发行版,能够扫描并生成详细的报告,涵盖用户管理、权限配置…...

apifox创建一个mock接口

1、新建接口 2、选择mock,开启云端mock; 3、新建期望; 4、编辑响应体; 5、快速请求,测试; (主要可能是网络问题,也可以自己python mock一个;apifox简单快速&#xf…...

设计一个基础JWT的多开发语言分布式电商系统

在设计一个分布式电商系统时,保证系统的可扩展性、性能以及跨语言的兼容性是至关重要的。随着微服务架构的流行,越来越多的电商系统需要在多个服务间共享信息,并且保证服务的安全性。在这样的场景下,JSON Web Token(JW…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...

uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)

UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...

Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合

无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...