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

DMA-STM32

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.lryc.cn/news/68655.html

相关文章:

  • 代码随想录算法训练营第二十七天|39. 组合总和、40.组合总和II、131.分割回文串
  • 泛型(Generic) <? extends T>,<? super T>
  • 数云融合|数字化转型中的利器:揭秘云技术的重要角色
  • Linux篇2
  • 《微服务实战》 第九章 Gitlab使用
  • KMP匹配算法
  • ClickHouse笔记: Ubuntu/Centos下的安装, 配置和用户管理
  • 网络编程——UDP编程
  • linux内核篇-进程及其调度
  • C#开发的OpenRA游戏之基地工程车执行部署命令
  • 米哈游的春招实习面经,问的很基础
  • pro如何添加定时任务
  • bgp路由策略
  • chatGPT4.0编写性能测试报告
  • jpa多线程事务
  • 加密解密软件VMProtect教程(四):准备项目之SDK功能
  • 夏令营教育小程序开发功能和优势有哪些?
  • Cocos CreatorXR 1.2.0 今日发布,正式支持 WebXR ,并开启 MR 之路
  • Linux 使用笔记(本人出品,必属精品)
  • 【2023 · CANN训练营第一季】初识新一代开发者套件 Atlas 200I DK A2 第二章——安装Atlas 200I DK A2跑通第一个案例
  • concurrenthashmap
  • 8年测试总结,项目/团队如何做自动化测试?效率价值?吐血整理...
  • 图像动态裁剪
  • Thematica: 炫彩主题与黑暗奇观的Vue3之旅
  • 平凡的Python为什么能一跃成为世界排名第一的语言
  • Wijmo 2023 v1 Crack
  • 万物互联时代的边缘计算安全需求与挑战
  • 函数序列与函数项级数
  • UML时序图详解
  • Centos7.6部署postgresql15主从