• 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

  • 相关阅读:
    项目经理如何管理团队
    正则表达式判断中文字符
    售前工作经验总结
    项目管理知识体系九大知识领域
    项目经理如何调动员工的积极性
    项目经理与客户沟通的宜与忌
    关于CodeSmith生成CSLA代码的联想
    接触CSLA框架的感觉
    C#多线程浅接触二、
    WF工作流开发回顾:介绍
  • 原文地址:https://www.cnblogs.com/showtime20190824/p/11487602.html
Copyright © 2020-2023  润新知