13-HAL库DMA系统总结

2019-08-16来源: eefocus关键字:HAL库  DMA系统  CPU

1.间接


DMA:Direct Memory Access,直接存储访问,实现数据在外设与存储器或存储器之间高速访问,数据移动过程无需CPU操作控制,因此可以大大解放CPU负担。


外设(ADC、SPI、I2C、DCMI等外设的数据寄存器),存储器(片内SRAM、外部存储器、片内Flash等等)。外设到存储器,例如将AD转换的数据转移到所定义的存储区中。存储器到外设多用于外设的发送通信,例如串口不定长数据的输入输出。

STM32F7xx系列有2个DMA控制器,每个控制器具有8个数据流(stream),每个数据流有8个通道(channel),对应如下:


每个外设请求占用一个数据流通道,相同外设请求可以占用不同数据流通道。数据流的传输依靠仲裁器进行管理和判断,包括软件(例如初始化中mydma2.Init.Priority=DMA_PRIORITY_MEDIUM)和硬件(数据流编号越低,优先权越高)。DMA传输有FIFO模式和直接模式,直接模式在每个外设请求时立即启动对存储器传输,FIFO模式为源数据传输到目标地址前将数据临时存放在FIFO(先进先出存储器缓冲区)中。FIFO模式对于要求源地址和目标地址数据宽度不同时很有用,同时可用于突发传输。


存储器到存储器传输必须使用DMA2,但对数据流编号和通道没有硬性要求。


DMA2的存储器端口和外设端口都连接到AHB,但DMA的存储区端口没有AHB2外设的访问权,同时外设端口只连接到APB1外设,所以DMA1不能实现存储器到存储器传输。


2.DMA相关函数解析


关于DMA,ST官方提供了HAL库(封装函数)和LL库(直接操作寄存器)。和GPIO定义类似,需要先使能相关时钟,定义句柄结构体DMA_HandleTypeDef mydma2,随后进行DMA的各项配置,最后进行初始化。


typedef struct __DMA_HandleTypeDef

    DMA_Stream_TypeDef          *Instance;                                                    

    DMA_InitTypeDef              Init;                                                         

    HAL_LockTypeDef              Lock;                                                         

    __IO HAL_DMA_StateTypeDef    State; 

    void                        *Parent;

    void                   (* XferCpltCallback)( struct __DMA_HandleTypeDef * hdma); 

    void                   (* XferHalfCpltCallback)( struct __DMA_HandleTypeDef * hdma);

    void                   (* XferM1CpltCallback)( struct __DMA_HandleTypeDef * hdma); 

    void                   (* XferM1HalfCpltCallback)( struct __DMA_HandleTypeDef * hdma); 

    void                   (* XferErrorCallback)( struct __DMA_HandleTypeDef * hdma);  

    void                   (* XferAbortCallback)( struct __DMA_HandleTypeDef * hdma); 

    __IO uint32_t                ErrorCode; 

    uint32_t                     StreamBaseAddress; 

    uint32_t                     StreamIndex; 

}DMA_HandleTypeDef;

typedef struct

   uint32_t     Channel;               //通道

   uint32_t     Direction;             //方向

   uint32_t     PeriphInc;             //外设递增

   uint32_t     MemInc;                //内存递增

   uint32_t     PeriphDataAlignment;   //外设数据宽度

   uint32_t     MemDataAlignment;      //内存数据宽度

   uint32_t     Mode;                  //模式选择

   uint32_t     Priority;              //优先级

   uint32_t     FIFOMode;              //FIFO模式

   uint32_t     FIFOThreshold;         //FIFO阈值

   uint32_t     MemBurst;              //内存突发传输

   uint32_t     PeriphBurst;           //外设突发传输

}DMA_InitTypeDef;

3.DMA初始化及配置


HAL库中,基本上都是结合XXX_HandleTypeDef 结构体和XXX_InitTypeDef 结构体进行初始化配置。


#include "dma.h"

#include "stm32f7xx_hal.h"

 

uint32_t DMA_Result;

DMA_HandleTypeDef Mydma1;

 

void MyDMA_Config(void){

__HAL_RCC_DMA2_CLK_ENABLE();    //时钟使能

Mydma1.Instance=DMA2_Stream0;       //数据流

Mydma1.Init.Channel=DMA_CHANNEL_0;   //通道

Mydma1.Init.Direction=DMA_PERIPH_TO_MEMORY;    //传输方向

Mydma1.Init.PeriphInc=DMA_PINC_DISABLE;  //外设是否递增

Mydma1.Init.MemInc=DMA_MINC_DISABLE;    //内存是否递增

Mydma1.Init.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD;   //外设数据宽度半个字节

Mydma1.Init.MemDataAlignment=DMA_MDATAALIGN_HALFWORD;   //内存数据宽度半个字节

Mydma1.Init.Mode=DMA_CIRCULAR;    //循环模式

Mydma1.Init.Priority=DMA_PRIORITY_MEDIUM;   //优先级中等

Mydma1.Init.FIFOMode=DMA_FIFOMODE_DISABLE;  //是否使能FIFO模式

Mydma1.Init.PeriphBurst=DMA_PBURST_SINGLE;  //外设突发传输

Mydma1.Init.MemBurst=DMA_MBURST_SINGLE;     //内存突发传输

HAL_DMA_Init(&Mydma1);    //初始化

HAL_DMA_Start(&Mydma1,ADC1_BASE,DMA_Result,2400);   //启动DMA

}

随后还需进行相关外设的配置:如串口,AD采样等。


4.DMA中断


中断配置,中断函数调用,回调函数覆盖。

关键字:HAL库  DMA系统  CPU

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic471326.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:12-HAL库串口通信总结
下一篇:14-HAL库之I2C通信

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

使用stm32的HAL库完成pwm输入模式测量频率和占空比的详细教程

。 然后使能TIM2的中断接下来添加代码:main.c 中开启捕获中断    /* USER CODE BEGIN 2 */    HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);    HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);//如果不需要占空比和频率数据就只开通道2即可。第一次的数据是不正确的,实际工作中要将第一次的数据丢弃    /* USER CODE END 2 */      
发表于 2019-08-21
使用stm32的HAL库完成pwm输入模式测量频率和占空比的详细教程

16.HAL库之SPI和QSPI

沿进行数据变化。DDR模式:在该模式下,指令阶段在SCLK下降沿发送数据,而在地址,交替字节,数据阶段在SCLK上升沿和下降沿均发送数据。双闪存模式:使用两个外部SPI四线,可将flash扩大一倍。QSPI配置:时钟使能,管脚定义,QSPI配置,flash初始化,QSPI读/写函数定义。void Qspi_Config(){ __HAL_RCC_QSPI_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); Flash_GPIO.Pin=GPIO_PIN_2; Flash_GPIO.Mode=GPIO_MODE_AF_PP
发表于 2019-08-16
16.HAL库之SPI和QSPI

HAL库之485+DMA通信(STM32F746)

(uint32_t bound){  __HAL_RCC_GPIOD_CLK_ENABLE();  __HAL_RCC_USART2_CLK_ENABLE();   GPIO_InitTypeDef GPIO_Init2;   GPIO_Init2.Pin = GPIO_PIN_4;              //485_RTS  GPIO_Init2.Mode =GPIO_MODE_OUTPUT_PP;  GPIO_Init2.Pull = GPIO_NOPULL;  GPIO_Init2.Speed
发表于 2019-08-16
HAL库之485+DMA通信(STM32F746)

15-HAL库之定时器学习

RepetitionCounter;   //重复计数,高级控制定时器所用   uint32_t AutoReloadPreload;   //自动预装载值}TIM_Base_InitTypeDef;应用例子如下:#include "basic_tim.h"TIM_HandleTypeDef Basic_Tim6;void Basic_Tim_Config(void){ HAL_TIM_Base_MspInit(&Basic_Tim6); __HAL_RCC_TIM6_CLK_ENABLE(); Basic_Tim6.Instance=TIM6
发表于 2019-08-16
15-HAL库之定时器学习

14-HAL库之I2C通信

发送停止传输信号P。读数据时,主机向从机发应答信号,当主机希望停止接收数据时,发送非应答信号。起始信号和停止信号见上图。数据有效性见上图。2.基于HAL库的I2C配置步骤:时钟使能—GPIO管脚配置—I2C配置初始化:void MyI2C_Init(void){ __HAL_RCC_GPIOB_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = GPIO_PIN_6;  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;  GPIO_InitStruct.Pull
发表于 2019-08-16
14-HAL库之I2C通信

STM32系统学习——DMA(直接储存器访问)

DMA主要功能是传输数据,但是不需要占用CPU,即在传输数据时,CPU可以做别的事,像多线程。数据传输从外设到存储器或者从存储器到存储器。DMA控制器包含了DMA1和DMA2,其中DMA1有7个通道,DMA2有5个通道,可以理解为传输数据的一种管道。要注意的是,DMA2只存在于大容量单片机中。 一、DMA框图解析 DMA控制器独立于内核,属于一个单独外设,结构结合下图来看  1.DMA请求 如果外设想通过DMA传输数据,必须先向DMA控制器发送DMA请求,DMA收到请求信号后,控制器会给外设一个应答信号,当外设应答且DMA控制器收到应答信号后,就会启动DMA传输,直到传输
发表于 2019-07-01
STM32系统学习——DMA(直接储存器访问)

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved