DMA简述与使用实例

2024-09-01 20:12
文章标签 使用 实例 简述 dma

本文主要是介绍DMA简述与使用实例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

之后要学: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];//16Byteextern 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读取一次数据。

这篇关于DMA简述与使用实例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1127931

相关文章

Pandas使用SQLite3实战

《Pandas使用SQLite3实战》本文主要介绍了Pandas使用SQLite3实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1 环境准备2 从 SQLite3VlfrWQzgt 读取数据到 DataFrame基础用法:读

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤

Java中StopWatch的使用示例详解

《Java中StopWatch的使用示例详解》stopWatch是org.springframework.util包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比,这篇文章主要介绍... 目录stopWatch 是org.springframework.util 包下的一个工具类,使用它

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

springboot security验证码的登录实例

《springbootsecurity验证码的登录实例》:本文主要介绍springbootsecurity验证码的登录实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录前言代码示例引入依赖定义验证码生成器定义获取验证码及认证接口测试获取验证码登录总结前言在spring

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为