0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文了解stm32使用DMA模块的相关操作

MCU开发加油站 来源:互联网 作者:佚名 2018-02-27 11:18 次阅读

DMA(Direct Memory Access)常译为“存储器直接存取”。早在Intel的8086平台上就有了DMA应用了。

一个完整的微控制器通常由CPU、存储器和外设等组件构成。这些组件一般在结构和功能上都是独立的,而各个组件的协调和交互就由CPU完成。如此一来,CPU作为整个芯片的核心,其处理的工作量是很大的。如果CPU先从A外设拿到一个数据送给B外设使用,同时C外设又需要D外设提供一个数据。这样的数据搬运工作将使CPU的负荷显得相当繁重。

严格的说,搬运数据只是CPU的比较不重要的一种工作。CPU最重要的工作室进行数据运算,从加减乘除到一些高级的运算,包括浮点、积分、微分、FFT等。CPU还需要负责复杂的中断申请和响应,以保证芯片的实时性能。

理论上常见的控制外设,比如Usart、I2C、SPI甚至是USB通信接口,单纯的利用CPU进行协议模拟也是可以实现的,比如51单片机经常使用I/O口模拟I2C协议通信。但这样既浪费了CPU的资源,同时实现后的性能表现往往和使用专门的硬件模块实现的效果相差甚远。从这个角度来看,各个外设控制器的存在,无疑降低了CPU的负担,解放了CPU的资源。

数据搬运这一工作占用了大部分的CPU资源,成为了降低CPU的工作效率的主要原因之一。于是需要一种硬件结构分担CPU这一职能—— DMA。

从数据搬运的角度看,如果要把存储地址A的数值赋给另外一个地址上B的变量,CPU实现过程为首先读出A地址上的数据存储在一个中间变量,然后再转送到B地址的变量上。使用DMA则不需要中间变量,直接将A地址的数值传送到B地址的变量里。无疑减轻了CPU的负担,也提高了数据搬运的效率。

stm32中 DMA1有7个通道,DMA2有5个通道。DMA挂载的时钟为AHB总线,其时钟为72Mhz,所以可以实现高速数据搬运。

stm32使用DMA的相关操作:

1、DMA的配置

void DMA_Configuration(void){ DMA_InitTypeDefDMA_InitStructure; //DMA设置: //设置DMA源:内存地址&串口数据寄存器地址 //方向:内存-->外设 //每次传输位:8bit //传输大小DMA_BufferSize=SENDBUFF_SIZE //地址自增模式:外设地址不增,内存地址自增1 //DMA模式:一次传输,非循环 //优先级:中 DMA_DeInit(DMA1_Channel4);//串口1的DMA传输通道是通道4 DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base; DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;//外设作为DMA的目的端 DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;//传输大小 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址不增加 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//内存地址自增1 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

//DMA_Mode_Normal(只传送一次), DMA_Mode_Circular(不停地传送) DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//(DMA传送优先级为中等) DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel4, &DMA_InitStructure);}

注:

1、传输通道:

通过查表,串口1的发送对应的是DMA的通道4,所以此处选择通道4.

2、DMA传输方式:

(1)DMA_Mode_Normal,正常模式,当一次DMA数据传输完后,停止DMA传送,对于上例而言,就是DMA_PeripheralDataSize_Byte个字节的传送完成后,就停止传送。

(2) DMA_Mode_Circular

循环模式,当传输完一次后,重新接着传送,永不停息。

2、外设的DMA方式设置

将串口1设置成DMA模式:

USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);

3、待传输数据的定义和初始化#define SENDBUFF_SIZE 10240vu8 SendBuff[SENDBUFF_SIZE];

for(i=0;i

4、开始DMA传输(使能对应的DMA通道) DMA_Cmd(DMA1_Channel4, ENABLE);

5、DMA传输的完成while(DMA_GetFlagStatus(DMA1_FLAG_TC4) == RESET) { LED_1_REV; //LED翻转 Delay(); //浪费时间 }

当传输完成后,就会跳出上面的死循环。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    4981

    文章

    18281

    浏览量

    288423
  • STM32
    +关注

    关注

    2239

    文章

    10671

    浏览量

    348738

原文标题:聊聊STM32中DMA模块的使用

文章出处:【微信号:mcugeek,微信公众号:MCU开发加油站】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    STM32CubeMx的初始配置顺序是怎么影响DMA功能的

    ‍经常有STM32开发者基于STM32CubeMx进行配置并生成基于HAL库的初始化代码,当涉及到DMA功能时,发现DMA功能无效,但从配置操作
    的头像 发表于 10-13 10:14 2198次阅读
    <b class='flag-5'>STM32</b>CubeMx的初始配置顺序是怎么影响<b class='flag-5'>DMA</b>功能的

    STM32实例教程-DMA实验

    在前面我们提到过 DMA,这一章我们就来学习 STM32F1 的DMA 使用。要实现的功能是:通过 K_UP 按键控制 DMA 串口 1 数据的传送,在传送过程中让 D2 指示灯不断闪
    发表于 05-24 09:20 770次阅读
    <b class='flag-5'>STM32</b>实例教程-<b class='flag-5'>DMA</b>实验

    浅谈STM32DMA模块的使用

    的错误和偏差,欢迎“拍砖”和提出更正,虾米在此感谢大家了。哈哈!什么是STM32DMA?其全称是:Direct Memory Access;根据ST公司提供的相关信息,DMA
    发表于 01-13 14:00

    带你了解步进电机的相关知识

    带你了解步进电机的相关知识:相、线、极性和步进方式2017-09-07 16:45这里不说步进电机的 “细分” 实验,只说下有关步进电
    发表于 07-08 06:48

    DMA基本原理及相关实验相关资料推荐

    ,就开始DMA传送,同时,串口调试助手可以收到DMA发送的内容。官方资料:《STM32参考手册V10》第10章——DMA控制器1.
    发表于 12-10 06:00

    STM32串口DMA问题详解

    昨天晚上在STM32串口DMA的问题上纠结了好长时间,所以今天上午写篇博客来谈谈我对串口DMA发送的理解。
    的头像 发表于 10-27 16:16 7978次阅读
    <b class='flag-5'>STM32</b>串口<b class='flag-5'>DMA</b>问题详解

    STM32DMA模块的使用

    DMA_Mode_Normal,正常模式,当一次DMA数据传输完后,停止DMA传送,对于上例而言,就是DMA_PeripheralDataSize_Byte个字节的传送完成后,就停止传
    的头像 发表于 06-11 08:49 6236次阅读
    <b class='flag-5'>STM32</b>中<b class='flag-5'>DMA</b><b class='flag-5'>模块</b>的使用

    stm32DMA1通道一览表,stm32使用DMA相关操作

    从数据搬运的角度看,如果要把存储地址A的数值赋给另外一个地址上B的变量,CPU实现过程为首先读出A地址上的数据存储在一个中间变量,然后再转送到B地址的变量上。使用DMA则不需要中间变量,直接将A地址的数值传送到B地址的变量里。无疑减轻了CPU的负担,也提高了数据搬运的效率。
    的头像 发表于 11-05 10:56 2.5w次阅读
    <b class='flag-5'>stm32</b>的<b class='flag-5'>DMA</b>1通道一览表,<b class='flag-5'>stm32</b>使用<b class='flag-5'>DMA</b>的<b class='flag-5'>相关</b><b class='flag-5'>操作</b>

    STM32F1 _DMA_USART

    STM32F1_DMA_USART
    的头像 发表于 04-08 10:23 4259次阅读
    <b class='flag-5'>STM32</b>F1 _<b class='flag-5'>DMA</b>_USART

    OLED显示模块(原理讲解、STM32实例操作

    OLED显示模块(原理讲解、STM32实例操作
    发表于 11-30 14:51 68次下载
    OLED显示<b class='flag-5'>模块</b>(原理讲解、<b class='flag-5'>STM32</b>实例<b class='flag-5'>操作</b>)

    STM32cubeMX I2S DMA双缓冲配置

    STM32cubeMX I2S DMA双缓冲配置开发测试环境cubeMX配置方法1,配置I2S模块;我的是录音模块,所以master RX模式;修改固件1,修改
    发表于 12-03 09:06 35次下载
    <b class='flag-5'>STM32</b>cubeMX I2S <b class='flag-5'>DMA</b>双缓冲配置

    STM32基础-----DMA

    STM32基础-------DMA
    发表于 12-20 19:35 10次下载
    <b class='flag-5'>STM32</b>基础-----<b class='flag-5'>DMA</b>

    STM32串口中断之DMA通信

    一.DMA介绍DMA详细介绍请转博客:嵌入式:初次了解STM32的USART串口通讯(中断方式)_LaiYiFei25的博客-CSDN博客DMA
    发表于 12-24 19:08 12次下载
    <b class='flag-5'>STM32</b>串口中断之<b class='flag-5'>DMA</b>通信

    STM32L4直接访问内存模块(DMA)介绍

    电子发烧友网站提供《STM32L4直接访问内存模块(DMA)介绍.pdf》资料免费下载
    发表于 08-01 10:15 1次下载
    <b class='flag-5'>STM32</b>L4直接访问内存<b class='flag-5'>模块</b>(<b class='flag-5'>DMA</b>)介绍

    STM32 DMA传输的问题分析

    用户使用STM32G473RET6芯片,开发环境STM32CubeMX+Keil(LL库)。使用DMA1通道1,在半传输中断和完全传输中断里,拷贝ADC采集的数据。在应用过程中发现DMA
    的头像 发表于 12-01 09:19 1079次阅读
    <b class='flag-5'>STM32</b> <b class='flag-5'>DMA</b>传输的问题分析