STM32入门——DMA数据搬运工

DMA简介

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

存储器映像

在这里插入图片描述
DMA框图
在这里插入图片描述
DMA基本结构
在这里插入图片描述
自动重装器:转运完成后恢复到初值,决定单次转换还是循环转换
M2M:0位硬件触发(外设到存储器或者存储器到外设),1为软件触发(存储器到存储器)
传输计数器:触发一次,转运一次,计数器减1.
*写传输计数器时,要先关闭DAM使能
DMA请求
在这里插入图片描述

数据宽度与对齐
在这里插入图片描述
数据转运+DMA
在这里插入图片描述

#include "DMA.h"
uint16_t SIZE;
void myDMA_Init(uint32_t AddrA,uint32_t AddrB,uint16_t Size)
{//开启时钟RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);SIZE = Size;DMA_InitTypeDef DMA_InitStructure;DMA_InitStructure.DMA_BufferSize = Size;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//传输方向DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;//触发方式DMA_InitStructure.DMA_MemoryBaseAddr = AddrB;//目标地址DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//字节DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//是否自动重装DMA_InitStructure.DMA_PeripheralBaseAddr = AddrA;//源地址DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//字节DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;//地址是否递增DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//优先级DMA_Init(DMA1_Channel1,&DMA_InitStructure);DMA_Cmd(DMA1_Channel1,DISABLE);}void myDMA_Transmission(void)
{DMA_Cmd(DMA1_Channel1,DISABLE);DMA_SetCurrDataCounter(DMA1_Channel1,SIZE);DMA_Cmd(DMA1_Channel1,ENABLE);while(DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET);DMA_ClearFlag(DMA1_FLAG_TC1);
}

ADC扫描模式+DMA
在这里插入图片描述

#include "ADC.h"
uint16_t AD_value[] = {0,0,0,0};void AD_Init(void)
{//开启对应时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//GPIO初始化GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//模拟输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed  =  GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);//配置ADC的通道配置ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_1,2,ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_2,3,ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_3,4,ADC_SampleTime_55Cycles5);ADC_InitTypeDef ADC_InitStructure;ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;ADC_InitStructure.ADC_NbrOfChannel = 4;ADC_InitStructure.ADC_ScanConvMode = ENABLE;ADC_Init(ADC1,&ADC_InitStructure);DMA_InitTypeDef DMA_InitStructure;DMA_InitStructure.DMA_BufferSize = 4;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//传输方向DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//触发方式DMA_InitStructure.DMA_MemoryBaseAddr = (uint16_t)AD_value;//目标地址DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//字节DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//是否自动重装DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;//源地址DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//地址是否递增DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//优先级DMA_Init(DMA1_Channel1,&DMA_InitStructure);DMA_Cmd(DMA1_Channel1,ENABLE);ADC_DMACmd(ADC1,ENABLE);ADC_Cmd(ADC1,ENABLE);//ADC校准ADC_ResetCalibration(ADC1);//重置所选ADC校准寄存器。while(ADC_GetResetCalibrationStatus(ADC1) == SET);//获取所选ADC重置校准寄存器的状态,重置完成硬件清零ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1) == SET);//获取所选ADC校准状态,校准完成后硬件清零
}uint16_t AD_GetValue(void)//单通道
{DMA_Cmd(DMA1_Channel1,DISABLE);DMA_SetCurrDataCounter(DMA1_Channel1,4);DMA_Cmd(DMA1_Channel1,ENABLE);ADC_SoftwareStartConvCmd(ADC1,ENABLE);//ADC软件触发启动转换。while(DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET);DMA_ClearFlag(DMA1_FLAG_TC1);
}uint16_t AD_GetAppointValue(uint8_t ADC_Channel)//指定通道
{ADC_RegularChannelConfig(ADC1,ADC_Channel,1,ADC_SampleTime_55Cycles5);ADC_SoftwareStartConvCmd(ADC1,ENABLE);//ADC软件触发启动转换。while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == RESET);return ADC_GetConversionValue(ADC1);
}uint16_t AD_GetVoltage(void)
{return (AD_GetValue()/4095)*3.3*100;
}

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

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

相关文章

代理类型中的 HTTP、HTTPS 和 SOCKS 有什么区别?

HTTP、HTTPS 和 SOCKS 都是代理(Proxy)协议,用于在网络通信中转发请求和响应,但它们在工作原理和用途上有一些区别。下面是它们之间的主要区别: HTTP代理: 工作原理: HTTP 代理主要用于转发 HTT…

Qt 7. 在自定义类TcpClient类中使用信号槽功能

1. 因为只有QObject类及其子类派生的类才能使用信号和槽机制。 使用信号和槽还必须在类声明的最开始处添加Q_OBJECT宏,在这个程序中,类的声明是自动生成的,已经添加了这个宏。UI类继承自QDialog,QDialog类又继承自QWidget类&…

Map映射学习

一、Map的遍历 创建Map集合 Map<String, Integer> map new HashMap<>();添加元素 map.put("java", 99);map.put("c", 88);map.put("c", 93);map.put("python", 96);map.put("Go", 88); 遍历方法&#xff1a; …

gorm基本操作

一、gorm安装 1.下载gorm go get -u gorm.io/gorm //gorm框架 go get -u gorm.io/driver/mysql //驱动2.mysql准备工作 mysql> create database godb; mysql> grant all on *.* to admin% identified by golang123!; mysql> flush privileges;3.导入gorm框架 impo…

4-20mA模拟电流回路协议比0-20mA模拟电流回路协议有什么优势?

有很多原因使得我们采用4-20mA电流回路协议作为事实标准&#xff08;特别针对回路供电的设备&#xff0c;比如二线制传感器&#xff09;。其中最重要的有以下两点&#xff1a; 1&#xff09;在一个直流系统中&#xff0c;能够有效地侦测开路状态。如果在4-20mA系统中&#xff0…

Unity学习笔记--如何优雅简便地利用对象池生成游戏对象(进阶版)LRU + 对象池

前言 之前写过一篇关于对象池的文章&#xff0c;现在来看写的并不是很好&#xff0c;所以来考虑优化下。 现在来看一年前写的代码&#xff0c;越看越不能入目hhh Unity学习笔记–如何优雅简便地利用对象池生成游戏对象 前置知识 Unity学习笔记–使用 C# 开发一个 LRU 代码实…

Camunda 7.x 系列【7】Spring Boot 集成 Camunda 7.19

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 前言2. Camunda Platform Run3. Spring Boot 版本兼容性4. 集成 Spring Boot5. 启动项目…

暑假集训笔记

Problem - B - Codeforces 这题看了好久&#xff0c;一直没思路..也可能是早上来没睡醒的原因吧.有点困.. 昨天晚上12点睡的&#xff0c;然后早上直接睡到7.48....真的6啊 话说这题真有点猜的成分&#xff0c; 先说我的思路&#xff1a;一开始和的奇偶 如果为偶数&#xf…

构建 LVS-DR 群集、配置nginx负载均衡。

目录 一、基于 CentOS 7 构建 LVS-DR 群集 1、准备四台虚拟机 2、配置负载调度器&#xff08;192.168.2.130&#xff09; 3、部署共享存储&#xff08;192.168.2.133&#xff09; 4、配置两个Web服务器&#xff08;192.168.2.131、192.168.2.132&#xff09; 测试集群 二…

Location匹配与Rewrite重写

一、常见的Nginx正则表达式 ^ &#xff1a;匹配输入字符串的起始位置 $ &#xff1a;匹配输入字符串的结束位置 * &#xff1a;匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”&#xff1a;匹配前面的字符一次或多次。如“ol”能匹配“ol”及“oll”、“oll…

jQuery练习题

目录 1.制作QQ简易聊天框 2.制作课工场论坛发帖 1.制作QQ简易聊天框 <script>$(function () {var touxiang new Array("images/head01.jpg","images/head02.jpg","images/head03.jpg");var names new Array("时尚伊人", &qu…

nvidia驱动更新导致驱动版本不匹配

关于nvidia驱动自动更新&#xff1a; 和这篇描述类似&#xff1a;https://blog.csdn.net/weixin_43568307/article/details/128187469 记得记录原先版本 sudo dpkg-reconfigure unattended-upgrades 关闭一下自动更新。 当前主机做好快照备份&#xff0c;重新安装之前的驱…

Django路由Router

文章目录 一、路由router路由匹配命名空间反向解析 二、实践创建用户模型Model添加子路由 - 创建用户首页页面跳转 - 使用反向解析和命名空间1. 不使用命名空间的效果2. 使用命名空间的效果 用户详情页面跳转 - 路由传参路由传递多个参数re_path 以前写法,了解即可重定向Redire…

全景图!最近20年,自然语言处理领域的发展

夕小瑶科技说 原创 作者 | 小戏、Python 最近这几年&#xff0c;大家一起共同经历了 NLP&#xff08;写一下全称&#xff0c;Natural Language Processing&#xff09; 这一领域井喷式的发展&#xff0c;从 Word2Vec 到大量使用 RNN、LSTM&#xff0c;从 seq2seq 再到 Attenti…

Cocos Creator的rigidBody.applyForce变成了滚动

序: 1、原因是因为没有调整摩擦系数physics-material 2、摩擦系数调整你要在你的节点 一个物理材料才会有的&#xff0c;教程没跳过去了所以没有 3、扩展阅读第一话&#xff1a;入行程序员的一波三折 最终效果&#xff1a; git录屏会卡&#xff0c;其实过程很平滑 正…

vue项目切换页面白屏不显示解决方案

问题描述 1、页面切换后白屏&#xff0c;同时切换回上一个页面同样白屏 2、刷新后正常显示 3、有警告&#xff1a;Component inside <Transition> renders non-element root node that cannot be animated 解决方法 <Transition>中的组件呈现不能动画化的非元素…

安卓如何快速定位native内存泄露。

步骤1&#xff09;cat /proc/pid/status,观察下面俩个指标 RssAnon: 5300 kB //一直增大说明匿名映射的内存增大&#xff0c;malloc本质就是调用匿名映射分 配内存 RssFile: 26884 kB //文件句柄泄露&#…

mysql之存储过程

目录 一、mysql之存储过程的相关知识 1&#xff09;存储过程的概念 2&#xff09;存储过程的优点 二、存储过程的管理 1&#xff09;创建存储过程 基本格式&#xff1a; 2&#xff09;调用存储过程 格式&#xff1a; call 存储过程名称 3&#xff09;查看存储过程 查…

TVS二极管失效分析

摘要&#xff1a;常用电路保护器件的主要失效模式为短路&#xff0c;瞬变电压抑制器(TvS)亦不例外。TvS 一旦发生短路失效&#xff0c;释放出的高能量常常会将保护的电子设备损坏&#xff0e;这是 TvS 生产厂家和使用方都想极力减少或避免的情况。通过对 TVS 筛选和使用短路失效…

【MFC】11.MFC文档和单文档架构-笔记

MFC文档 之前我们在写字符雨的时候&#xff0c;将数据都存储到了视图类中&#xff0c;这是不合理的&#xff0c;视图类只负责显示&#xff0c;不应该存储任何数据 文档&#xff1a;专门存储数据用的 CDocument 文档与视图的关系&#xff1a; 创建一个文档类 单文档四个类都…