STM32F4 HAL库DMA学习

2019-09-11来源: eefocus关键字:STM32F4  HAL库  DMA

用了一段时间HAL库,不知道是不是用外设固件库时间长一点的原因,个人感觉没有固件库来的直接。看DMA部分看的有点乱,捋一下。


DMA的使用方法及细节直接看官方的手册就可以了,注意的是如果原地址和目的地址的数据长度不一样的话只能使用FIFO模式,直接模式下原地址和目的地址的数据长度必须一致。


主要是简单整理一下使用DMA的初始化过程,以串口发送使用DMA为例:


 (1)  定义一个外设的句柄,对外设的基本参数、IO、时钟、中断等进行初始化。


UART_HandleTypeDef UART1_Handler; 


               ....

 HAL_UART_Init(&UART1_Handler);

调用外设的初始化函数完成对外设的初始化


 (2)  定义一个 DMA的句柄,对DMA的数据流、通道、传输方向、数据长度等基本参数进行初始化


DMA_HandleTypeDef     UART1TxDMA_Handler; 


                      ....

HAL_DMA_Init(&UART1TxDMA_Handler);


调用初始化函数完成对句柄的填充。


 (3)  使用HAL库中对DMA的一个宏定义完成外设发送DMAT或者接收DMAR和第二步的DMA句柄进行关联


__HAL_LINKDMA(&UART1_Handler,hdmatx,UART1TxDMA_Handler);           

  每个外设的句柄结构体中都一个该外设关于DMA相关的设置:


 DMA_HandleTypeDef      *hdmatx;          UART TX 的DMA句柄参数

 DMA_HandleTypeDef      *hdmarx;          UART RX 的DMA句柄参数


 使用__HAL_LINKDMA 宏定义的作用就是将第二步初始化的DMA句柄赋值给外设的发送或者接收DMA句柄,并且外设的句柄(第一步定义的)赋给DMA结构体中的.parent 参数,调用DMA的函数都会间接调用 

             

 UART1TxDMA_Handler.parent->hdmatx  

            

 对DMA的个别寄存器的参数进行填充,比如调用 HAL_DMA_Start()函数就会调用DMA_SetConfig()函数配置数据个数、源地址、目的地址等。而hdmatx 和第二步的DMA句柄是一模一样的,感觉最后转了一圈又转回会来了。。。

  (4)  外设初始化、DMA初始化、外设和DMA进行关联、外设使能DMA发送或者接收、DMA调用函数开始发送或者接收。


 个人感觉有时候HAL库的确有些冗余了,这时候可能就需要部分进行寄存器操作了。


二、使用过程总结


1、传输数据数目设置


 注意传输数据的个数的设置:如果源的数据宽度和目标数据宽度不一样,即PSIZE、MSIZE不相等时,DMA_SXNDTR寄存器配置要传输的数据项数目的宽度等于外设总线的宽度(和传输方向无关)。例如外设的宽度设置为字,存储器的宽度设置为半字,假如要传输100个字节的数据,NDTR寄存器配置要传输的数据数目 100/4.外设宽度是字=4个字节。


2、DMA初始化


 HAL_DMA_Init() ;   初始化函数中会使能所有的中断,如果不想用中断,可以在初始化之后关闭。初始化完成后会自动使能流的DMA。 




三、调试过程问题解决


直接模式中出现FIFO溢出错误,可能是DMA的源地址或者目的地址设置有问题。


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

上一篇:发现的STM32——SPI的问题
下一篇:STM32 SPI发送与接收用一个函数实现的问题

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

推荐阅读

stm32入门——跑马灯(基于stm32f103zet6)
的驱动都要使能相应的时钟,首先看stm32系统的时钟框图经查阅资料可知,GPIO的时钟在APB2的外设时钟使能寄存器上,相关函数的定义在stm32f10x_rcc.h中 void   RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)其源代码为:void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState){  /* Check the parameters */ //检查值的有效性&nbs
发表于 2019-10-21
stm32入门——跑马灯(基于stm32f103zet6)
stm32入门——跑马灯(基于stm32f103zet6)
的驱动都要使能相应的时钟,首先看stm32系统的时钟框图经查阅资料可知,GPIO的时钟在APB2的外设时钟使能寄存器上,相关函数的定义在stm32f10x_rcc.h中 void   RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)其源代码为:void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState){  /* Check the parameters */ //检查值的有效性&nbs
发表于 2019-10-21
stm32入门——跑马灯(基于stm32f103zet6)
STM32F103流水灯实验
#include "led.h"//初始化PB5和PE5为输出口.并使能这两个口的时钟     //LED IO初始化void LED_Init(void){  GPIO_InitTypeDef  GPIO_InitStructure;  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE); //使能PB,PE端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8
发表于 2019-10-19
STM32F4 SPI2初始化及收发数据【使用库函数】
我的STM32F4 Discovery上边有一个加速度传感器LIS302DL。在演示工程中,ST的工程师使用这个传感器做了个很令人羡慕的东西:解算开发板的姿态。当开发板倾斜时候,处于最上边的LED点亮,其他LED不亮。同时,用MicroUSB数据线将开发板连接电脑时,开发板就会虚拟成一个鼠标。倾斜开发板时,鼠标指针会向倾斜的方向移动。归根结底,就是牛B的ST工程师用加速度传感器完成了姿态解算。在开发板上,加速度传感器使用了SPI方式用STM32F4芯片进行通信。STM32F4的SPI1 作为主机,与LIS302Dl进行通信,读取或者写入数据。由于我没有使用过STM32的SPI口,因此在板子的空余资源中找到了SPI2接口来做实验
发表于 2019-10-19
使用STM32CubeMX,生成STM32F103ZE SPI3 HAL 工程
1,选择芯片型号为STM32F103ZET6,开始工程,引脚配置如下:主要是RCC,SPI3,和SYS三个模块2,时钟配置,可按下图进行:3,SPI3配置,如下图,配完这一步其它可以不管,直接生成工程。4,生成工程,打开工程手动输入红框中内容。运行:成功输出波形。
发表于 2019-10-18
使用STM32CubeMX,生成STM32F103ZE SPI3 HAL 工程
STM32F103xC 之 SPI 引脚分解
芯片:STM32F103RCT6 (64pin ,256K ,LQFP ,-40~85)对象:spiSPI1连接在APB2总线上;SPI2/3连接在APB1总线上;串行外设接口(SPI)在全双工和单工通信模式下,多达三个SPI能够在从属模式和主模式下以高达18 Mbits / s的速度进行通信。 3位预分频器提供8个主模式频率,并且帧可配置为8位或16位。 硬件CRC生成/验证支持基本的SD卡/ MMC模式。所有SPI都可以由DMA控制器提供服务。内部集成I2S两个标准的I2S接口(与SPI2和SPI3复用)可用,可以在主模式或从模式下运行。 这些接口可以配置为以16/32位分辨率工作,作为输入或输出通道。 支持8 kHz至48
发表于 2019-10-18
小广播
何立民专栏 单片机及嵌入式宝典

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

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