【STM32】DMA数据转运(存储器到外设)

本篇博客重点在于标准库函数的理解与使用,搭建一个框架便于快速开发

目录

前言

外设DMA请求使能

DMA1

DMA2 

常用的外设DMA使能库函数 

配置串口发送的DMA请求

驱动代码

MyDMA.h

MyDMA.c

main.c 


前言

【STM32】DMA数据转运(存储器到存储器)_stm32dma往ccr搬运-CSDN博客

【STM32】ADC模拟数字转换(规则组多通道)+ DMA数据转运(外设到存储器)-CSDN博客

本博客学习DMA将数据从存储器转运到外设的代码,其实就是外设到存储器反过来

外设DMA请求使能

DMA请求同时只能有一个请求有效 !!!

DMA1

DMA2 

注意: DMA2控制器及相关请求仅存在于大容量产品和互联型产品中

常用的外设DMA使能库函数 

void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq,FunctionalState NewState);
void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState);
void DAC_DMACmd(uint32_t DAC_Channel, FunctionalState NewState);
void I2C_DMACmd(I2C_TypeDef* I2Cx, FunctionalState NewState);
void SDIO_DMACmd(FunctionalState NewState);
void SPI_I2S_DMACmd(SPI_TypeDef* SPIx, uint16_t SPI_I2S_DMAReq, FunctionalState NewState);void TIM_DMAConfig(TIM_TypeDef* TIMx, uint16_t TIM_DMABase, uint16_t TIM_DMABurstLength)
void TIM_DMACmd(TIM_TypeDef* TIMx, uint16_t TIM_DMASource,FunctionalState NewState);

配置串口发送的DMA请求

DMA请求同时只能有一个请求有效 

	DMA_InitTypeDef DMA_InitStructure;DMA_InitStructure.DMA_PeripheralBaseAddr = AddrA;DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//USART1->DR寄存器为8位DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址指针不自增,固定为&USART1->DRDMA_InitStructure.DMA_MemoryBaseAddr = AddrB;DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//存储器地址指针自增DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;//外设为转运的目的地DMA_InitStructure.DMA_BufferSize = Size;DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//单次转运DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//失能,存储器到存储器才使能DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;DMA_Init(DMA1_Channel4, &DMA_InitStructure);//USART1的Tx引脚位于DMA1的通道4

串口利用DMA发送

使用DMA进行发送,可以通过设置USART_CR3寄存器上的DMAT位激活。当TXE位被置为’1’ 时,DMA就从指定的SRAM区传送数据到USART_DR寄存器。为USART的发送分配一个DMA 通道的步骤如下(x表示通道号):

1. 在DMA控制寄存器上将USART_DR寄存器地址配置成DMA传输的目的地址。在每个TXE 事件后,数据将被传送到这个地址。

2. 在DMA控制寄存器上将存储器地址配置成DMA传输的源地址。在每个TXE事件后,将从 此存储器区读出数据并传送到USART_DR寄存器。

3. 在DMA控制寄存器中配置要传输的总的字节数。

4. 在DMA寄存器上配置通道优先级。

5. 根据应用程序的要求,配置在传输完成一半还是全部完成时产生DMA中断。

6. 在DMA寄存器上激活该通道。

当传输完成DMA控制器指定的数据量时,DMA控制器在该DMA通道的中断向量上产生一中断。 在发送模式下,当DMA传输完所有要发送的数据时,DMA控制器设置DMA_ISR寄存器的TCIF 标志;监视USART_SR寄存器的TC标志可以确认USART通信是否结束,这样可以在关闭 USART或进入停机模式之前避免破坏最后一次传输的数据;软件需要先等待TXE=1,再等待 TC=1。

USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);//使能USART1的Tx发送请求

驱动代码

配置串口发送的代码这里不再赘述,如有需要可以阅读下方博客。

【STM32】USART通用同步/异步收发器(串口数据的接收与发送)_stm32 usart同步时钟-CSDN博客

MyDMA.h

#ifndef __MYDMA_H
#define __MYDMA_Hvoid MyDMA_Init(uint32_t AddrA, uint32_t AddrB, uint16_t Size);
void MyDMA_Transfer(void);#endif

MyDMA.c

#include "stm32f10x.h"                  // Device header
#include "MyDMA.h"uint16_t MyDMA_Size;void MyDMA_Init(uint32_t AddrA, uint32_t AddrB, uint16_t Size)
{MyDMA_Size = Size;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);DMA_InitTypeDef DMA_InitStructure;DMA_InitStructure.DMA_PeripheralBaseAddr = AddrA;DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//USART1->DR寄存器为8位DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址指针不自增,固定为&USART1->DRDMA_InitStructure.DMA_MemoryBaseAddr = AddrB;DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//存储器地址指针自增DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;//外设为转运的目的地DMA_InitStructure.DMA_BufferSize = Size;DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//单次转运DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//失能,存储器到存储器才使能DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;DMA_Init(DMA1_Channel4, &DMA_InitStructure);//USART1的Tx引脚位于DMA1的通道4DMA_Cmd(DMA1_Channel4, DISABLE);//先不开始转运
}void MyDMA_Transfer(void)
{USART_DMACmd(USART1, USART_DMAReq_Tx, DISABLE);DMA_Cmd(DMA1_Channel4, DISABLE);DMA_SetCurrDataCounter(DMA1_Channel4, MyDMA_Size);//设置数据转运的大小DMA_Cmd(DMA1_Channel4, ENABLE);USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);//使能USART1的Tx发送请求while (DMA_GetFlagStatus(DMA1_FLAG_TC4) == RESET);DMA_ClearFlag(DMA1_FLAG_TC4);
}

main.c 

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "MyDMA.h"
#include "Serial.h"
#include "Key.h"uint8_t Buff_Send[200] = {0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D};
uint16_t Conuter, Percent;
uint8_t KeyNum;
int main(void)
{Serial_Init();Key_Init();MyDMA_Init((uint32_t)&USART1->DR, (uint32_t)Buff_Send, 200);while (1){KeyNum = Key_GetNum();if(KeyNum){printf("\r\nData:\r\n");MyDMA_Transfer();Conuter = DMA_GetCurrDataCounter(DMA1_Channel4);Percent = 100 - (float)Conuter * 100 / 200;printf("\r\nSend%d%%", Percent);//显示传输百分比if(Percent == 100){printf("\r\n*************Send Finish!******************\r\n");}}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

c++----模板(进阶)

也是好久没有更新了今天来将我们前面写过的模板更加升华一下。更加深一下。我们还记得我们前面讲过的模板,只是简单的运用模板而且还是参数类型模板。当然大家如果敏锐一点的话,应该就能看出这句话的问题看吧。我这里说的是参数类型模板,那么…

模仿抖音用户ID加密ID的算法MB4E,提高自己平台ID安全性

先看抖音的格式 对ID加密的格式 MB4EENgLILJPeQKhJht-rjcc6y0ECMk_RGTceg6JBAA 需求是 同一个ID 比如 413884936367560 每次获取得到的加密ID都是不同的,最终解密的ID都是413884936367560 注意这是一个加密后可解密原文的方式,不是单向加密 那么如下进行…

Java在零工市场中的应用:构建灵活高效的劳动力平台

随着数字经济的迅猛发展,零工经济作为一种新兴的劳动力市场模式,正在全球范围内迅速崛起。零工市场通过互联网平台将服务提供者与需求者进行快速匹配,使得个人可以临时、自由地提供服务,企业则能够按需雇佣劳动力,实现…

清理微信一些文件

C盘的微信文件实在是太难搞了,怎么弄怎么麻烦 一般文件保存在手机端或者自己的文件夹更多,要清理呀 不然卡秃噜皮了怎么办是啊不 路径如图

【JAVA入门】Day45 - 压缩流 / 解压缩流

【JAVA入门】Day45 - 压缩流 / 解压缩流 文章目录 【JAVA入门】Day45 - 压缩流 / 解压缩流一、解压缩流二、压缩流 在文件传输过程中,文件体积比较大,传输较慢,因此我们发明了一种方法,把文件里的数据压缩到一种压缩文件中&#x…

Linux与Ubuntu:内核与发行版的关系

在计算机科学的领域内,Linux和Ubuntu这两个术语频繁出现,但它们之间的确切联系往往不为大众所熟知。本文旨在深入探讨Linux内核与Ubuntu操作系统发行版之间的技术关系,并阐明它们各自的独特性质。 Linux内核:操作系统的基石 Lin…

双碳目标下DNDC模型建模方法及在土壤碳储量、温室气体排放、农田减排、土地变化、气候变化中的实践应用

查看原文>>> 双碳目标下DNDC模型建模方法及在土壤碳储量、温室气体排放、农田减排、土地变化、气候变化中的实践技术应用 目录 专题一、DNDC模型介绍 专题二:DNDC初步操作 专题三、遥感和GIS基础 专题四、DNDC气象数据 专题五、DNDC土地数据 专题六…

项目警告Added non-passive event listener to a scroll-blocking ‘touchstart‘ event.

使用touchstart和touchmove时项目报如下警告: 这个警告信息是由浏览器提供的,主要是为了提醒开发者关注性能问题。在移动设备上,touchstart事件可能会导致滚动操作的响应问题。当你在touchstart事件上添加了一个非被动的监听器(即…

统计/nginx/access.log中每个ip的访问次数,按高到低排列

/nginx/access.log具体内容长这样: 第一个元素就是ip。 awk {print $1} /nginx/access.log | sort | uniq -c | sort -r首先,awk {print $1} /nginx/access.log 从 /nginx/access.log文件的每行中提取出第一个字段。然后,sort 对提取出的第…

多线程篇(其它容器- CopyOnWriteArrayList)(持续更新迭代)

一、CopyOnWriteArrayList(一) 1. 简介 并发包中的并发List只有CopyOnWriteArrayList。 CopyOnWriteArrayList是一个线程安全的ArrayList,对其进行的修改操作都是在底层的一个复制的数 组(快照)上进行的&#xff0…

MySQL迁移达梦报错,DMException: 第1 行附近出现错误: 无效的表或视图名[ACT_GE_PROPERTY]

达梦数据库选好模式和登录用户,迁移时的目标模式名要和达梦的当前登录的用户名相同,否则查询的时候需要“form 模式名.表名”,只from表名就会报表不存在的错误。

Orchestrator 与 Mysql 8.0 的兼容性

一、看图识别问题 二、Mysql 8.0 从 MySQL 8.0.22 开始,使用SHOW REPLICA STATUS代替SHOW SLAVE STATUS,该语句从该版本开始已弃用。 所以:Mysql 8.0.22前可以用Orchestartor

YOLOv5/v8 + 双目相机测距

yolov5/v8双目相机测距的代码,需要相机标定 可以训练自己的模型并检测测距,都是python代码 已多次实验,代码无报错。 非常适合做类似的双目课题! 相机用的是汇博视捷的双目相机,具体型号见下图。 用的yolov5是6.1版本的…

并发控制全解析

在数据库操作中,并发控制 是确保数据一致性和事务隔离性的关键。然而,多个事务的并发操作可能导致数据不一致,破坏数据库的ACID特性。本文将深入探讨并发操作可能带来的问题,并介绍常见的并发控制技术。 1. 并发操作带来的挑战 …

代码随想录算法训练营第五十九天 | dijkstra(堆优化版)精讲

目录 dijkstra(堆优化版)精讲 思路 堆优化细节 方法一: 最小堆优化 dijkstra(堆优化版)精讲 题目链接:卡码网:47. 参加科学大会 文章讲解:代码随想录 小明是一位科学家&#x…

Git常用命令与基本操作(包括搭建git环境)

首先,在github注册邮箱,然后再Ubuntu下安装git和ssh服务(如果实在windows下需要下载git bash,其余操作与Ubuntu相同)。 Ubuntu搭建git环境 ssh-keygen -t rsa -C "注册账号的邮箱名字" 生成SSH通信用的公钥…

Snowflake 如何通过 Apache Iceberg 和 Polaris 为大数据的未来提供动力

Snowflake 的使命是让每个组织都成为数据驱动型组织。凭借围绕 Apache Iceberg 的最新创新和 Polaris 的推出,这家数据云公司使开发人员、工程师和架构师能够比以往任何时候都更快、更轻松地利用大数据获得变革性的业务见解。 将开放标准引入数据云 Snowflake 战略的核心是采…

Elasticsearch知识点整理

数据分类 非结构化数据 全文数据。不定长或无固定格式 报错xml,HTML,Word结构化数据 行数据,由二维表结构来逻辑表达和实现的数据 非结构化数据 对于非结构化的数据 搜索主要有两种方法 顺序扫描全文检索 顺序扫描 一般不建议这么做。例如给你一张报纸&…

WEB攻防-PHP特性缺陷对比函数CTF考点CMS审计实例

知识点: 1、过滤函数缺陷绕过; 2、CTF考点与代码审计; 1、赋值 不会对比类型 类型也会对比 2、MD5 在使用比较md5的时候,只要第一位是相等的数字,则会值相等 3、intval 3、 %0a代表换行 4、 6、 7、 代码审计

STM32+ESP01连接到机智云

机智云,全球领先的智能硬件软件自助开发及物联网(iot)云服务平台。机智云平台为开发者提供了自助式智能硬件开发工具与开放的云端服务。通过傻瓜化的自助工具、完善的SDK与API服务能力最大限度降低了物联网硬件开发的技术门槛,降低开发者的研发成本,提升…