DMA-STM32

news/2024/11/7 20:44:10/

DMA-STM32

DMA(Direct Memory Access)直接存储器存取
DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输,无须CPU干预,节省了CPU的资源
12个独立可配置的通道:DMA1 (7个通道),DMA2 (5个通道)
每个通道都支持软件触发和特定的硬件触发
STM32F103C8T6DMA资源:DMA1(7个通道)
在这里插入图片描述

在这里插入图片描述
用于访问各个存储器的DMA总线
内部的多个通道,可以进行独立的数据转运
仲裁器,用于调度各个通道,防止产生冲突
AHB从设备,用于配置DMA参数
DMA请求,用于硬件触发DMA的数据转运
CPU或者DMA直接访问Flash的话,是只可以读而不可以写的
后SRAM是运行内存,可以任意读写
在这里插入图片描述
左边是外设寄存器站点
右边是存储器站点,包括Flash和SRAM
在这里插入图片描述

不够就补0,超就舍弃高位

例子

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里的数据转运是一种复制转运,转运完成后DataA的数据并不会消失
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

第一步,RCC开启DMA的时钟。

第二步,就可以直接调用DMA Init,初始化这里的各个参数了。包括外设和存储器站点的起始地址、数据宽度、地址是否自增。方向、传输计数器、是否需要自动重装、选择触发源。

用的是软件触发,所以通道可以任意选择。

最后:进行开关控制,DMA_Cmd

#include "stm32f10x.h"                  // Device headeruint16_t MyDMA_Size;void MyDMA_Init(uint32_t AddrA, uint32_t AddrB, uint16_t Size)
{MyDMA_Size = Size;//¿ªÆôDMAʱÖÓRCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//ÅäÖÃDMA½á¹¹ÌåDMA_InitTypeDef DMA_InitStructure;DMA_InitStructure.DMA_PeripheralBaseAddr = AddrA;//Ô´µØÖ·DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//×Ö½ÚÀàÐÍ´«Êä(8λ)DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;//ʹÄܵØÖ·×ÔÔöDMA_InitStructure.DMA_MemoryBaseAddr = AddrB;//Ä¿±êµØÖ·DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//×Ö½ÚÀàÐÍ´«Êä(8λ)DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//ʹÄܵØÖ·×ÔÔöDMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//Êý¾Ý´«Êä·½ÏòDMA_InitStructure.DMA_BufferSize = Size;//Êý¾Ý¸öÊýDMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//Õý³£Ä£Ê½DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;//Èí¼þ³ö·¢DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;DMA_Init(DMA1_Channel1, &DMA_InitStructure);//ĬÈϹرտª¹ØʹÄÜDMA_Cmd(DMA1_Channel1, DISABLE);
}void MyDMA_Transfer(void)
{DMA_Cmd(DMA1_Channel1, DISABLE);DMA_SetCurrDataCounter(DMA1_Channel1, MyDMA_Size);DMA_Cmd(DMA1_Channel1, ENABLE);while (DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET);DMA_ClearFlag(DMA1_FLAG_TC1);
}
#ifndef __MYDMA_H
#define __MYDMA_Hvoid MyDMA_Init(uint32_t AddrA, uint32_t AddrB, uint16_t Size);
void MyDMA_Transfer(void);#endif

http://www.ppmy.cn/news/601469.html

相关文章

MIMX8MD6CVAHZAB I.MX 8MDUAL Cortex-A53 - 微处理器

概述 NXP i.MX 8M应用处理器采用Arm Cortex-A53和Cortex-M4内核,设计用于满足智能设备应用的丰富用户体验要求。i.MX 8M提供业界领先的多媒体处理功能,采用多达四个1.5GHz Arm Cortex-A53和Cortex-M4内核。另外,该器件还具有各种灵活的存储器…

基于STM32F103C8T6的DMA直接存储器存取

#一、DMA简介 #二、STM32存储器映像 #三、DMA基本结构 #四、项目代码 一、DMA简介 DMA(Direct Memory Access)直接存储器存储DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输,无须CPU干预,节省CPU的资源12个独立可配置的通道&#xff1a…

复旦微FM33LE0x单片机之串口DMA接收

一、简介 本例程以FM33LE026为例,已经过验证,其他型号不保证适用。   FM33LE0xx集成了多种不同类型的UART(LPUART),其差异如下表所示: UART特性UART0/1UART2UART4/5LPUART0/1DMA支持YYYY半双工/全双工YY…

SpringSecurity基础入门详解

【1】SpringSecurity是什么 Spring 是非常流行和成功的 Java 应用开发框架,Spring Security正是Spring家族中的成员。Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案。 正如你可能知道的关于安全方面的两个主要区域是“认…

延迟队列商业版RocketMQ和Pulsar的对比

目录 一、商业版RocketMQ和Pulsar的基本对比 二、核心差异 三、使用倾向 三、RocketMQ使用注意问题 一、商业版RocketMQ和Pulsar的基本对比 系统 实现原理 使用限制 成本 业务支持及使用 监控报警 容灾高可用 自动扩缩容(弹性) 鉴权 schema…

1.1.1 Qt信号槽之connect介绍(上)

关于Qt信号槽中connect与disconnect介绍 首先我们要知道,如果想要使用Qt中的信号槽机制, 那么必须继承QObject类,因为QObject类中包含了信号槽的一系列操作,今天我们来讲解的是信号与槽怎么建立连接以及断开连接。 一、connect …

Java正则表达式匹配方括号

Java代码: String s "[1,2,3][4,5,6]"; System.out.println(s.replaceAll("(\\[)","")); //匹配左方括号 System.out.println(s.replaceAll("(\\])","")); //匹配右方括号 System.out.println…

25匹马5个跑道,选出最快的5匹马?

回顾之前问题:25匹马5个跑道,怎样选出最快的3匹? 答:先分成5组比赛并组内排序(从1到5速度减慢),再让每组第一名比赛,按照每组第一名的比赛结果从快到慢对每组排序(从A到E…