STM32——DMA知识点及实战总结

1.DMA概念介绍

DMA,全称Direct Memory Access,即直接存储器访问。
DMA传输 将数据从一个地址空间复制到另一个地址空间。
注意:DMA传输无需CPU直接控制传输
在这里插入图片描述

在这里插入图片描述

2.DMA框图

在这里插入图片描述

3.DMA处理过程

在这里插入图片描述
外设的 8 个请求独立连接到每个通道,由 DMA_SxCR 控制数据流选择哪一个通道,每个
数据流有 8 个通道可供选择,每次只能选择其中一个通道进行 DMA 传输。
在这里插入图片描述
在这里插入图片描述

5 DMA优先级

第一阶段(软件阶段):每个通道的优先级可在DMA_CCRx寄存器中设置,有四个等级:最高、高、中和低优先级。
第二阶段(硬件阶段):如果两个请求有相同软件优先级,较低编号的通道比较高编号的通道有较高的优先级。

6.寄存器

在这里插入图片描述
)

7.DMA句柄结构体

typedef struct __DMA_HandleTypeDef
{
void Instance; / 寄存器基地址 /
DMA_InitTypeDef Init; /
DAM 通信参数 */

uint32_t StreamBaseAddress
uint32_t StreamIndex

}DMA_HandleTypeDef;

typedef struct
{
uint32_t Channel; /* 传输通道,例如:DMA_CHANEL_4 /
uint32_t Direction; /
传输方向,例如存储器到外设 DMA_MEMORY_TO_PERIPH /
uint32_t PeriphInc; /
外设(非)增量模式,非增量模式 DMA_PINC_DISABLE /
uint32_t MemInc; /
存储器(非)增量模式,增量模式 DMA_MINC_ENABLE /
uint32_t PeriphDataAlignment; /
外设数据大小:8/16/32 位 /
uint32_t MemDataAlignment; /
存储器数据大小:8/16/32 位 /
uint32_t Mode; /
模式:外设流控模式/循环模式/普通模式 /
uint32_t Priority; /
DMA 优先级:低/中/高/非常高 */
}DMA_InitTypeDef;

8 8.2以DMA方式传输串口数据配置步骤

在这里插入图片描述
代码:

8.1 dma.c


//DMA数据传输(内存到内存的传输)实现步骤:
//1.全局变量与宏定义
//1.1源与目标缓冲区定义//2.函数定义
//初始化DMA配置
//2.1DMA时钟使能
//2.3初始化DMA句柄及DMA配置
//2.4关联源和目标地址//3 传输控制
//3.1传输失能
//3.2设置传输数据的长度
//3.3传输使能//4.函数调用、执行
//4.1硬件初始化,HAL_Init()调用
//4.2 DMA配置初始化化函数调用调用
//4.3 等待DMA传输完成
//4.4 while(1)中执行代码//DMA数据传输(内存到内存的传输)实现步骤:
//2.2DMA句柄创建
DMA_HandleTypeDef g_dma_handler;     
//1.全局变量与宏定义
//1.1源与目标缓冲区定义
uint8_t src_buf[10] = {0x0a, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09};
uint8_t dest_buf[10] = {0};//2.函数定义
//初始化DMA配置
void dma_init(void)
{//2.1DMA1时钟使能__HAL_RCC_DMA1_CLK_ENABLE();//2.3初始化DMA句柄及DMA配置g_dma_handler.Instance = DMA1_Channel1;g_dma_handler.Init.Direction = DMA_MEMORY_TO_MEMORY;/* 与目标地址相关 */g_dma_handler.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;g_dma_handler.Init.MemInc = DMA_MINC_ENABLE;/* 与源地址相关 */g_dma_handler.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;g_dma_handler.Init.PeriphInc = DMA_PINC_ENABLE;g_dma_handler.Init.Priority = DMA_PRIORITY_HIGH;g_dma_handler.Init.Mode = DMA_NORMAL;   /* 内存到内存是不支持循环模式 */HAL_DMA_Init(&g_dma_handler);//2.4关联源和目标地址,启动DMA传输的函数HAL_DMA_Start(&g_dma_handler, (uint32_t)src_buf, (uint32_t)dest_buf, 0);}//3 传输控制函数
void dma_enable_transmit(uint16_t cndtr)
{//3.1传输失能__HAL_DMA_DISABLE(&g_dma_handler);//3.2设置传输数据的长度g_dma_handler.Instance->DMA_CNDTR = cndtr;  // 设置传输数据长度//3.3传输使能__HAL_DMA_ENABLE(&g_dma_handler);}

8.2 main.c

int main()    
{uint8_t key = 0;//3.1硬件初始化,HAL_Init()调用HAL_Init();                             /* 初始化HAL库 */sys_stm32_clock_init(336, 8, 2, 7);     /* 设置时钟,168Mhz */delay_init(168);                         /* 延时初始化 */usart_init(115200);led_init();                             /* 初始化LED */key_init();                             /* 初始化按键 */LED0(0);                                /* 先点亮LED0 *///3.2 DMA配置初始化化函数调用调用dma_init();while(1){key = key_scan(0);                  /* 得到键值 */if (key == KEY0_PRES){memset(dest_buf, 0, 10);dma_enable_transmit(10);while(1){if (__HAL_DMA_GET_FLAG(&g_dma_handler, DMA_FLAG_TC1)){__HAL_DMA_CLEAR_FLAG(&g_dma_handler, DMA_FLAG_TC1);printf("传输完成 \r\n");break;}}}LED0_TOGGLE();delay_ms(200);  }}

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

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

相关文章

YOLOv5改进 | 融合改进篇 | 轻量化CCFM + SENetv2进行融合改进涨点 (全网独家首发)

一、本文介绍 本文给大家带来的改进机制是轻量化的Neck结构CCFM配合SENetv2改进的网络结构进行融合改进,其中CCFM为我本人根据RT-DETR模型一比一总结出来的,文中配其手撕结构图,其中SENetV2为网络结构重构化模块,通过其改进主干从而提取更有效的特征,这两个模块搭配在一起…

Java实现海南旅游景点推荐系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户端2.2 管理员端 三、系统展示四、核心代码4.1 随机景点推荐4.2 景点评价4.3 协同推荐算法4.4 网站登录4.5 查询景点美食 五、免责说明 一、摘要 1.1 项目介绍 基于VueSpringBootMySQL的海南旅游推荐系统&#xff…

探索单元测试和 E2E 测试:提升软件质量的关键步骤(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

探索Redis特殊数据结构:Bitmaps(位图)在实际中的应用

一、概述 Redis官方提供了多种数据类型,除了常见的String、Hash、List、Set、zSet之外,还包括Stream、Geospatial、Bitmaps、Bitfields、Probabilistic(HyperLogLog、Bloom filter、Cuckoo filter、t-digest、Top-K、Count-min sketch、Confi…

【机组】算术逻辑运算单元实验的解密与实战

​🌈个人主页:Sarapines Programmer🔥 系列专栏:《机组 | 模块单元实验》⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 ​ 目录 🌺 一、 实验目的…

为您的网站添加网站底部美化代码 支持任意网站

将下面代码放在网站底部或者侧边栏,主要是cssjs的代码!html格式! 在逛 Gitee、Github 等各大代码仓库时,往往能看到以下这种徽章式的网页链接,美观好看又方便,那么这个徽章是如何制作出来的呢?…

区间预测 | Matlab实现BiLSTM-Adaboost-ABKDE的集成双向长短期记忆网络自适应带宽核密度估计多变量回归区间预测

区间预测 | Matlab实现BiLSTM-Adaboost-ABKDE的集成双向长短期记忆网络自适应带宽核密度估计多变量回归区间预测 目录 区间预测 | Matlab实现BiLSTM-Adaboost-ABKDE的集成双向长短期记忆网络自适应带宽核密度估计多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 …

web架构师编辑器内容-编辑器组件图层面板功能开发01-锁定隐藏功能的开发

我们这一部分主要是对最右侧图层面板功能进行剖析,完成对应的功能的开发: 每个图层都对应编辑器上面的元素,有多少个元素就对应多少个图层,主要的功能如下: 锁定功能:点击锁定,在编辑器中没法编辑对应的组…

瑞_Java开发手册_(四)安全规约

🙊前言:本文章为瑞_系列专栏之《Java开发手册》的安全规约篇。由于博主是从阿里的《Java开发手册》学习到Java的编程规约,所以本系列专栏主要以这本书进行讲解和拓展,有需要的小伙伴可以点击链接下载。本文仅供大家交流、学习及研…

如何用Python调用智谱AI的API进行智能问答

一、引言 随着人工智能技术的不断演进,以ChatGPT为首的智能聊天机器人如:文心一言、通义千问、智谱AI等受到越来越多人的喜欢。这些智能引擎不仅有网页版,而且开放了免费的api接口,并给出了样例代码。 这样,我们可以…

Rust 错误处理(上)

目录 1、用 panic! 处理不可恢复的错误 对应 panic 时的栈展开或终止 1.1 使用 panic! 的 backtrace 2、用 Result 处理可恢复的错误 2.1 匹配不同的错误 2.2 失败时 panic 的简写:unwrap 和 expect 2.3 传播错误 错误是软件中不可否认的事实,所…

jmeter-线程数设置为1,循环10次没问题,循环100次出现异常

一、多次尝试,发现出现异常的接口大致相同。 解决办法:在第一个出现异常的接口下添加超时时间,固定定时器:2000ms,再次运行就没问题了。 二、压力机自身存在的问题 1)在网络编程中,特别是在短…

20240112-补 制作两个字符串字谜的最少步骤数

题目要求 给你两个长度相同的字符串 s 和 t。在一个步骤中,你可以选择 t 中的任意一个字符并用另一个字符替换它。 返回将 t 变为 s 的变位所需的最少步数。 字符串的 "字谜 "是指字符串中的相同字符具有不同(或相同)的排列顺序…

使用PyTorch实现混合专家(MoE)模型

Mixtral 8x7B 的推出在开放 AI 领域引发了广泛关注,特别是混合专家(Mixture-of-Experts:MoEs)这一概念被大家所认知。混合专家(MoE)概念是协作智能的象征,体现了“整体大于部分之和”的说法。MoE模型汇集了各种专家模型…

CMU15-445-Spring-2023-Project #4 - Concurrency Control

前置知识,参考上一篇博客:CMU15-445-Spring-2023-Project #4 - 前置知识(lec15-20) 通过添加一个锁管理器在 BusTub 中支持事务,然后将其用于并发查询执行。锁管理器将支持五种锁模式下的表锁和元组锁:int…

「解析」Jetson配置 git服务

这两天感冒了在家休养,想着把之前买的 Jetson 开发板用起来,买Jetson的初衷就是用来学习Linux系统,顺道可以部署算法,以及一些其他需求,相比树莓派而言,Jetson开发相对更贵,但是其配备了英伟达的…

电子学会C/C++编程等级考试2023年09月(八级)真题解析

C/C++编程(1~8级)全部真题・点这里 第1题:最短路径问题 平面上有n个点(n<=100),每个点的坐标均在-10000~10000之间。其中的一些点之间有连线。 若有连线,则表示可从一个点到达另一个点,即两点间有通路,通路的距离为两点间的直线距离。现在的任务是找出从一点到另一…

详细讲解Python中的aioschedule定时任务操作

目录 前言1. 基本概念2. 基本API3. Demo 前言 如果下面的函数库无法执行&#xff0c;出现类似&#xff1a;&#xff08;前提是python3.7以上&#xff09; AttributeError: module ‘asyncio‘ has no attribute ‘run‘请检查run是否可跳转&#xff0c;如果无法跳转&#xff…

element plus 可选择树形组件(el-tree) 怎样一键展开/收起?实现方法详解

实现代码&#xff1a; 按钮&#xff1a; <el-button click"takeall" style"height: 24px">{{zhanstatus % 2 ! 0 ? "收起所有" : "展开所有"}} </el-button> 组件&#xff1a; <el-form-item label"可选择菜单…

harbor https

harbor https部署 准备docker-compose安装https 证书harbor安装访问harbor推镜像到harbor 准备 192.168.112.99&#xff0c;harbor&#xff0c;centos7 192.168.112.3&#xff0c;测试机&#xff0c;centos7 docker版本&#xff1a;docker-ce 20.10.16&#xff08;部署参考&a…