DMA 直接存储器访问

DMA传输,将数据从一个地址空间复制到另一个地址空间。—–“数据搬运工”。

DMA传输无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场,它是通过硬件为RAM和IO设备开辟一条直接传输数据的通道,使得CPU的效率,使得CPU的效率大大提高。

STM32F1 DMA框图

1. DMA请求

DMA传输数据,先向DMA控制器发送请求。

2.DMA通道

不同外设向DMA的不同通道发送请求。DMA1有7个通道,DMA2有5个通道。(DMA2仅存在大容量产品和互联型产品)

3.DMA优先级

多个DMA通道同时发来请求时,几句有先后响应处理的顺序问题,这个由仲裁器管理(优先级管理也分成软件阶段和硬件阶段)

DMA处理过程

  • image

  • 1.外设想通过DMA发送数据,先发送请求。

    2.DMA控制器收到请求后,给外设一个ack

    3.外设收到ack后,释放请求

    4.外设启动DMA数据传输,直到传输结束

    DMA优先级:仲裁器管理DMA通道请求分为两个阶段:软件阶段、硬件阶段

    第一阶段(软件阶段):每个通道的优先级可在DMA_CCRx寄存器中设置,由四个等级:最高、高、中、低优先级。

    第二阶段(硬件阶段):如果两个请求有相同软件优先级,较低编号的通道有较高的优先级

    (大容量芯片中,DMA1控制器拥有高于DMA2控制器的优先级)

    DMA的HAL库函数

  • image

  • DMA-串口数据传输

    1.使能DMA时钟

    _HAL_RCC_DMA1_CLK_ENABLE

    2.初始化DMA

    HAL_DMA_Init函数初始化DMA相关参数

    _HAL_LINKDMA函数连接DMA和外设

    3.使能串口的DMA发送,启动传输

    HAL_UART_Transmit_DMA

    4.查询DMA传输状态

    _HAL_DMA_GET_FLAG查询传输状态 _HAL_DMA_GET_COUNTER 获取当前传输剩余数据量

    5.DMA中断使用

    HAL_NVIC_EnableIRQ

    HAL_NVIC_SetPriority

    编写中断服务函数xxx_IRQHandler

    实战

    1.配置USART1以及相应中断

  • image

  • 配置DMA

  • image

  • 中断优先级(这里防止HAL_Delay卡死,详细请看 http://t.csdnimg.cn/NQhQV)

  • image

  • 生成keil工程后

    DMA+串口发送字符串

  • image

  • main函数 while(1)里

  • image

  • DMA+串口接收空闲中断

    uart.h、uart.c当中定义接收数组、数据长度、接收完成标志

  • image

  • 在uart.c当中的Init函数下添加使能IDLE中断

  • image

  • main.c当中封装接收和发送函数

  • image

  • 中断stm32f4xx_it.c中调用 #include "usart.h"

  • image

  • stm32f4xx_it.c中编写中断服务函数

  • main.c中的while循环内编写发送以及接收标志清除

  • 实验现象
  • 打开串口,若没有接收到数据时,串口一直会每隔500ms发送SendBuff数组里的数据

  • 接收

  • 作者:菲子叭叭

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【STM32 HAL库】DMA+串口

    发表回复