历史上的今天
今天是:2024年09月11日(星期三)
2019年09月11日 | STM32F4 HAL库DMA学习
2019-09-11 来源:eefocus
用了一段时间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的源地址或者目的地址设置有问题。
史海拾趣
|
我最近在做一块ARM板上的蓝牙底层初始化驱动,环境如下 板子:ARM11板 Linux内核版本:2.6.18 蓝牙模块:采用CSR的Bluecore5核心,和CPU通过UART相连 蓝牙驱动:1.自己根据蓝牙的datasheet在系统启动时给蓝牙模块发送了一条Reset信号,并初始化 ...… 查看全部问答> |
|
早晨起来,一看上海天马上赛车场已经装扮一新,赛道内有专门的维修通道,与正式的F1比赛管理别无二致,已悄然感受到大战的气息。在赛事现场,热辣的美女、轰鸣的马达、绚丽的奥铃CTX赛车、激情呐喊的观众,这就是2010(第二届)福田奥铃CTX中国勒芒 ...… 查看全部问答> |
|
写了一个定时中断函数,将AD采样写在定时中断中,结果不能得到正确的AD值,定时时间为0.1ms, 采用dsp2806,系统时钟为50MHz,外部引脚ADCIN已经连接到1.6V直流电压,为什么我的AD值却总是零呢? 请高手帮帮忙!! void ADC_Init(void) {&nb ...… 查看全部问答> |
|
在做AD采样时,初始化AD时,如果没有这段代码,发现采样结果不对,加上后,检测结果正常: AdcRegs.ADCTRL1.bit.RESET=1; //复位整个ADC模块 DSP28x_usDelay(1); ...… 查看全部问答> |
|
不知道有多少朋友已经拿到SensorTag了? 今天来说一下SensorTag的OAD(Over the Air Download) 无线下载升级固件功能 大家都知道 单片机开发测试一般需要用JTAG下载器烧写固件,但如果是开发产品都会面临一个比较头疼的问题,如果产品已经投放市场 ...… 查看全部问答> |
|
1、设计显示的图片内容,图形内容为笑脸 2、显示方式设计为:左右上下移动 3、实现图形的放大和缩小,并能按设定的路径自动在显示屏移动 4、页面开始显示姓名:夏赞义 学号:2010044213 有意做的请联系qq:357271420,价格私聊 谢谢!!! … 查看全部问答> |
|
1、图中电路当最右边开关S闭合时,请写出所有工作的用电器。(10分)2、图中电路闭合所有开关时,请计算出电路消耗的总功率、总电阻。(10分)3、向图中变压部分输入AC 220V,根据电路及元件参数,计算出输出的最大DC电压为?最大输出电流为?(20 ...… 查看全部问答> |




