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

STM32学习笔记(八)--DMA直接存储器存取详解

(1)配置步骤
1.配置RCC外设时钟 开启DMA外设
2.初始化DMA外设 调用DMA_Init 外设存储器站点的起始地址 数据宽度 地址是否自增 方向 传输计数器 是否需要自动重装 选择触发源 通道优先级
3.开启DMA控制
4.开启触发信号输出(如果需要硬件触发)
5.开启中断输出(如果需要DMA中断)

(2)代码示例
案例1  ADC1单通道 PA0单通道模拟输入实例

uint16_t MyDMA_Size;
void MyDMA_Init(uint32_t AddrA, uint32_t AddrB, uint16_t Size)
{
MyDMA_Size = Size;
//开启DMA1外设时钟
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_InitTypeDef DMA_InitStructure;
//外设站点起始地址 数据宽度 地址是否自增
DMA_InitStructure.DMA_PeripheralBaseAddr = AddrA;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;
//存储器站点起始地址 数据宽度 地址是否自增
DMA_InitStructure.DMA_MemoryBaseAddr = AddrB;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
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);
//DMA1(1--7)、DMA2(1--5) 
DMA_Cmd(DMA1_Channel1, DISABLE);
}
void MyDMA_Transfer(void)
{
//每当要重新获取一次DMA数据的时候 可以调用下面的函数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);//标志位清除
}

相关文章:

  • css display:grid布局,实现任意行、列合并后展示,自适应大小屏幕
  • VMR,支持30+种编程语言的SDK版本管理器,支持Windows/MacOS/Linux。
  • 手写实现call函数和应用场景
  • 刷题记录(240619)
  • JSON学习
  • .Net多线程Threading相关详解
  • 数据库大作业——音乐平台数据库管理系统
  • 爬虫的法律风险是什么?以及合法使用爬虫技术的建议。
  • 基于深度学习的光流预测
  • Elasticsearch搜索引擎(高级篇)
  • k8s快速上手实操
  • llama-factory微调chatglm3
  • MySQL数据库的列类型
  • 如何理解shell命令 cd $(dirname $0)
  • matlab 路面点云标线提取
  • 2019年如何成为全栈工程师?
  • Android开源项目规范总结
  • Angular 4.x 动态创建组件
  • CAP理论的例子讲解
  • Facebook AccountKit 接入的坑点
  • Gradle 5.0 正式版发布
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Netty 4.1 源代码学习:线程模型
  • Objective-C 中关联引用的概念
  • SpingCloudBus整合RabbitMQ
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 后端_MYSQL
  • 如何选择开源的机器学习框架?
  • 双管齐下,VMware的容器新战略
  • 听说你叫Java(二)–Servlet请求
  • 微信公众号开发小记——5.python微信红包
  • #、%和$符号在OGNL表达式中经常出现
  • #NOIP 2014#Day.2 T3 解方程
  • (1) caustics\
  • (13):Silverlight 2 数据与通信之WebRequest
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (4)事件处理——(7)简单事件(Simple events)
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (转)shell调试方法
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • **PHP分步表单提交思路(分页表单提交)
  • ./和../以及/和~之间的区别
  • .gitignore文件---让git自动忽略指定文件
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET CLR基本术语
  • .Net MVC4 上传大文件,并保存表单
  • .Net 代码性能 - (1)
  • .net 反编译_.net反编译的相关问题
  • .NET/C# 使窗口永不获得焦点
  • @Documented注解的作用
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798