STM32F429在HAL库上对DMA的研究及其测试

1DMA背景知识介绍

DMA全称Direct Memory Access,即存储器直接访问,所谓直接访问,即不需要经由CPU处理,直接在外设寄存器和存储器之间开辟一条通道(或者存储器和存储器之间),用于传递数据。由于无需经过CPU处理,因此,当传递的数据量十分庞大时,可以大大提高系统的运行效率。STM32F429有两个DMA控制器,DMA的工作原理如下图:

 每个DMA有多达8个数据流,每个数据流又最多可以映射8种外设寄存器,但是每个数据流最多同时只能映射一个外设。他们的映射关系图下图:

2串口中断DMA接收数据

具体原理就不介绍了,直接介绍使用步骤:

第一步:在CUBEMX上对其进行配置,并生成工程文件

 

 NVIC界面不需要配置,系统会强制你打开DMA中断。

第二步:打开工程文件,找到stm32f4xx_it.c文件,找到DMA2_Stream5_IRQHandler函数

void DMA2_Stream5_IRQHandler(void)
{

    static int Height = 80;

    LCD_ShowString(0,Height,1280,24,24,(char*)USART1MESSAGE);Height+=30; //该函数用于将接收到的信息打印到显示屏,功能类似于printf函数

    __HAL_DMA_CLEAR_FLAG(&hdma_usart1_rx, DMA_FLAG_TCIF1_5);

}

第三步:在mian中开启中断

    huart1.Instance->CR3 |= USART_CR3_DMAR;//开启DMA接收,直接配置寄存器,因为没找到API接口函数
    HAL_DMA_Start_IT(&hdma_usart1_rx, (u32)&huart1.Instance->DR, (u32)USART1MESSAGE, RX_Length);//开启DMA中断接收

运行一次上面两行代码(对,就是一次!),当接收到一共RX_Length个字节(博主设置为200)时,进入中断函数DMA2_Stream5_IRQHandler。运行完后,当再次接收到RX_Length个字节,再次进入该函数,反复如此。

运行结果

 每隔5ms发送一次,瞬间填满1280*800分辨率的屏幕

讨论

有同学会问,如果想要接收不定长的数据,怎么办,这个问题博主还没解决,但是,在我看来,DMA既然设计的初衷就是帮助CPU减少负担,那肯定是用于大量数据收发的时候,对于少量数据的传输,我认为大可不必采用DMA,普通的串口接收中断完全可以搞定。顺便附上我对串口接收中断的理解:

https://www.cnblogs.com/showtime20190824/p/11407923.html

原文地址:https://www.cnblogs.com/showtime20190824/p/11487602.html