DMA简述与使用实例

news2024/9/21 14:27:08

之后要学:SPI / IIC+DMA

学习的这位up主的视频:全网最清楚的DMA讲解,三种搬运模式三个例子讲清楚(STM32教程基于HAL库和CUBEIDE)_哔哩哔哩_bilibili

目录

01-基本信息

1-概述

2-方向

3-模式

正常模式

轮询模式

4-地址自增

02-实例一:串口读取陀螺仪

01-基本信息

1-概述

DMA能将外设/内存与外设/内存间建立直接的通道进行数据传输,而无需CPU进行数据的传输,可以将资源用在更合适的地方

2-方向

外设-》内存、内存-》外设,内存-》内存

3-模式

正常模式

只执行一次DMA数据传输,在接收到制定的数据大小之后,结束DMA

轮询模式

可以一直进行数据的传输,不过要注意防止数据的覆盖等,需要特殊的算法进行数据的结算(以后学)

4-地址自增

有这四种自增方式

02-实例一:串口读取陀螺仪

认为适用于接收连续的数据包,协议

1-cubemx配置

配置为正常模式,外设地址不变,内存地址自增

正常模式需要每次调用完成,重新开启DMA,但算法相对简单

当前外设为串口接收寄存器,只有一个地址无需自增

内存需要存放多个数据,所以需要自增,不能覆盖

数据宽度也很重要,但是了解不深,以后再说

串口中断也要打开

在后续处理中,需要用串口中断来进行DMA接收数据完成的判断

2-代码编写

1-初始化

		__HAL_UART_ENABLE_IT(&hlpuart1, UART_IT_IDLE); //使能IDLE

        //开启DMA接收,
		HAL_UART_Receive_DMA(&hlpuart1,uart1_rx_buf, UART1_PACK_SIZE);
        

DMA接收,只需要设定好初始位置,定义好数组大小、接收数据数目比接收的一帧数据大就行,后续会进行处理

使能IDLE,即空闲中断,之后在中断处理函数中进行处理

2-中断处理函数

在stm32g4xx_it.c中

void LPUART1_IRQHandler(void)
{
  /* USER CODE BEGIN LPUART1_IRQn 0 */
	extern uint8_t uart1_rx_buf[UART1_PACK_SIZE];//16Byte
  extern uint16_t uart1_rx_size;
  extern uint8_t uart1_rx_cplt_flag;
	
  uint32_t tmp_flag = 0;
	uint32_t temp;
	tmp_flag =__HAL_UART_GET_FLAG(&hlpuart1,UART_FLAG_IDLE); //获取IDLE标志位
	if((tmp_flag != RESET))//idle标志被置位
	{ 
			__HAL_UART_CLEAR_IDLEFLAG(&hlpuart1);//清除标志位
			
			HAL_UART_DMAStop(&hlpuart1);
			temp  =  __HAL_DMA_GET_COUNTER(&hdma_lpuart1_rx);// 获取DMA中未传输的数据个数   
			uart1_rx_size =  sizeof(uart1_rx_buf) - temp; //总计数减去未传输的数据个数,得到已经接收的数据个数
			uart1_rx_cplt_flag = 1;	// 接受完成标志位置1

	}
  /* USER CODE END LPUART1_IRQn 0 */
  HAL_UART_IRQHandler(&hlpuart1);
  /* USER CODE BEGIN LPUART1_IRQn 1 */

  /* USER CODE END LPUART1_IRQn 1 */
}

使能IDLE中断后,在串口空闲下便会进入此中断(其他中断会进吗)然后判断串口当前是否空闲,若空闲,代表一帧数据接收完毕,然后结束DMA(之前接收函数比具体数据数量大也没关系就是这个原因,之后会重新开启),使能标志位,之后进行到串口数据处理函数中,便可以进行处理。

ps:一帧数据代表一次发送所有信息,如55 51 aa aa aa 55 52 aa aa aa,此时接受了两个帧头,但因为是一遍发过来的,所以为一帧。

ps:所以单片机,openmv的printf,print发送的是什么呢,是一帧还是一个个发送的呢,或许之后可以用打包函数,直接打包数据发送出去就是一帧

3-串口数据处理函数

uint8_t uart1_receiveData_parse(void)
{
		uint8_t ret = 1;
		//如果接收到数据包
		if(uart1_rx_cplt_flag)
		{
            //数据处理
			for(uint8_t i=0;i<99;i++)
			{
					jy901_read_data(uart1_rx_buf[i]);
			}

			//清空数据包与标志位
			memset(uart1_rx_buf, 0, UART1_PACK_SIZE);
			uart1_rx_cplt_flag = 0;
			uart1_rx_size = 0;
			//重新打开DMA接收
			HAL_UART_Receive_DMA(&hlpuart1,uart1_rx_buf, UART1_PACK_SIZE);	
		}
		
		return ret;
}

注意,这并不是什么接收完成中断之类的,而是一个简单的函数的,需要外界的调用,我将其放在定时器中断函数中,每1ms调用一次函数,则1ms读取一次数据。

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

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

相关文章

学习日志8.30--防火墙NAT

目录 一、实验环境配置 二、配置防火墙静态NAT一对一 三、配置防火墙静态NAT多对多 四、配置防火墙NAT端口转换NAPT 五、防火墙smart-nat、easyip 六、防火墙三元组NAT 在学习过基于路由器的NAT网络地址转换&#xff0c;现在学习基于防火墙NAT的网络地址转换&#xff0c;…

python-读写Excel:xlwings库操作

几种操作Excel的python库对比 安装:pip install xlwings 目录 APP实例化对象 工作薄对象 创建工作薄 打开工作薄 工作薄属性 工作表对象 新增工作表 复制表 获取工作表对象 工作表属性 删除和清除表数据及表格式 工作表行高列宽(自动调整) 单元格对象 获取单元…

【hot100篇-python刷题记录】【旋转图像】

R7-矩阵篇 印象题&#xff1a; 思路&#xff1a; 先转置&#xff0c;转置完我们按照列的中间进行对称交换就可以了。 class Solution:def rotate(self, matrix: List[List[int]]) -> None:"""Do not return anything, modify matrix in-place instead.&qu…

【微机原理】指令JZ和JNZ的区别

&#x1f31f; 嗨&#xff0c;我是命运之光&#xff01; &#x1f30d; 2024&#xff0c;每日百字&#xff0c;记录时光&#xff0c;感谢有你一路同行。 &#x1f680; 携手启航&#xff0c;探索未知&#xff0c;激发潜能&#xff0c;每一步都意义非凡。 JZ&#xff08;Jump …

祝贺严建兵教授任华中农业大学校长

公众号&#xff1a;生信漫谈&#xff0c;获取最新科研信息&#xff01; 祝贺严建兵教授任华中农业大学校长https://mp.weixin.qq.com/s?__bizMzkwNjQyNTUwMw&mid2247487040&idx1&sn6800055c9944754be11dc77a30ee1906&chksmc0e9ebb0f79e62a64634d5cd057578ca5…

Java 入门指南:Java 并发编程 —— AQS、AQLS、AOS 锁与同步器的框架

AQS AQS 是 AbstractQueuedSynchronizer 的缩写&#xff0c;即 抽象队列同步器&#xff0c;是 Java.util.concurrent 中的一个基础工具类&#xff0c;用于实现同步器&#xff08;Synchronizer&#xff09;的开发。 AQS 提供了一种实现锁和同步器的框架&#xff0c;使用 AQS 能…

Mysql高级篇(上)

Mysql高级篇&#xff08;上&#xff09; Mysql架构介绍(一)1、Linux环境下的MySQL的安装与使用2、MySQL请求到响应字符集变化&#xff08;了解&#xff09;3、MySQL8 的主要目录结构4、数据库和文件系统关系&#xff08;1&#xff09;默认数据库&#xff08;2&#xff09;数据库…

C语言程序设计之基础易错题锦集6

C语言程序设计之基础易错题锦集6 问题 6_0解析 6_0 问题 6_0 将形参 s 所指字符串中字母字符顺序前移&#xff0c;其他字符顺序后移&#xff0c;处理后将新字符串的首地址作为函数值返回。 例如&#xff1a;输入 &#xff1a;“asd123fgh456df”, 输出&#xff1a;“a…

React基础面试题

React 面试题 以下是面试官最有可能问到的 50 个 React 面试题和答案。为方便你学习&#xff0c;我对它们进行了分类&#xff1a; 基本知识React 组件React ReduxReact 路由 基本知识 1. 区分Real DOM和Virtual DOM Real DOMVirtual DOM1. 更新缓慢。1. 更新更快。2. 可以…

简化理解:Tomcat 和 Servlet 规范

有时候&#xff0c;我们会把复杂的技术概念弄得很复杂&#xff0c;其实这些东西可以用更简单的语言来理解。我们来看看 Tomcat 和 Servlet 规范到底是怎么回事。 1. 什么是 Servlet 规范&#xff1f; 简单来说&#xff0c;Sun 公司&#xff08;现在是 Oracle&#xff09;定了…

YOLOv9改进策略【模型轻量化】| MoblieNetV3:基于搜索技术和新颖架构设计的轻量型网络模型

一、本文介绍 本文记录的是基于MobileNet V3的YOLOv9目标检测轻量化改进方法研究。MobileNet V3的模型结构是通过网络搜索得来的&#xff0c;其中的基础模块结合了MobileNet V1的深度可分离卷积、MobileNet V2的线性瓶颈和倒置残差结构以及MnasNet中基于挤压和激励的轻量级注意…

注意力机制(Attention mechanism)(上篇)

在图像识别的时候&#xff0c;假设输入的图像大小都是一样的。但如果问题变得复杂&#xff0c;如图1所 示&#xff0c;输入是一组向量&#xff0c;并且输入的向量的数量是会改变的&#xff0c;即每次模型输入的序列长度都不一 样&#xff0c;这个时候应该要怎么处理呢&#xff…

随笔十、音频扩展模块测试

本项测试简单&#xff0c;对购买的音频扩展模块进行录音放音测试 按照使用说明&#xff0c;连接音频小板&#xff0c;一个喇叭一个麦克风&#xff0c;4根线&#xff0c;buildroot系统镜像 录音测试 rootRK356X:/# arecord -c 1 -r 44100 -f S16_LE /tmp/record.wav Recording …

Java-多线程入门

多线程是指在软件或硬件上实现多个线程并发执行的技术。为了更好地理解多线程&#xff0c;首先需要了解几个基本概念&#xff1a; 了解概念 1.程序 程序是为完成特定任务、用某种语言编写的一组指令的集合。它是一个静态的概念&#xff0c;通常存储在磁盘或其他非易失性存储器…

vxe-table 更新到最新版本

当前版本&#xff1a; "vxe-table": "^4.3.0-beta.3" 更新后&#xff1a; "vxe-table": "^4.7.75" 需要调整代码&#xff1a; 更改前main.js 更改后&#xff1a;

Jenkins Environment Injector Plugin 插件详解

引言 在做自动化测试的过程中&#xff0c;我们需要经常发送测试报告给相关研发、产品和上级&#xff0c;但是Jenkins邮件模板不支持Javascritpt脚本来动态生成数据&#xff0c;只支持静态的HTML代码&#xff0c;那么我们就没有办法了吗&#xff1f;非也&#xff0c;我们可以通…

SQL进阶技巧:经典问题题-换座位

目录 0 问题描述 1 数据准备 2 问题分析 3 小结 0 问题描述 表 seat中有2个字段id和student id 是该表的主键(唯一值)列,student表示学生姓名。 该表的每一行都表示学生的姓名和 ID。 id 是一个连续的增量。 编写解决方案来交换每两个连续的学生的座位号。如果学生的数量…

Windows下Nacos安装与配置

目录 1. 下载Nacos 2. 解压安装包 3. 配置系统环境变量 4. 启动Nacos 5. 配置数据库为mysql 6. 配置鉴权默认值 1. 下载Nacos 我下载的版本是2.3.0。 下载地址&#xff1a;Nacos Server 下载 | Nacos 官网 但是我从官方那里下载超级慢&#xff0c;找了一个链接下载&#…

Milvus 向量数据库进阶系列丨构建 RAG 多租户/多用户系统 (下)

本系列文章介绍 在和社区小伙伴们交流的过程中&#xff0c;我们发现大家最关心的问题从来不是某个具体的功能如何使用&#xff0c;而是面对一个具体的实战场景时&#xff0c;如何选择合适的向量数据库解决方案或最优的功能组合。在 “Milvus 向量数据库进阶” 这个系列文章中&a…

Python将两个Excel文件按相同字段合并到一起

在工作中我们需要将两个有关联的数据文件合并成一个Excel 1. 创建两个excel文件 test1 test2 2. 使用Pandas 数据分析工具进行合并 Pandas 一个强大的分析结构化数据的工具集&#xff0c;提供了易于使用的数据结构和数据分析工具&#xff0c;特别适用于处理结构化数据&#x…