自学内容网 自学内容网

【STM32 HAL库】DMA+串口

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数组里的数据

    • 接收


原文地址:https://blog.csdn.net/m0_73409202/article/details/140618237

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!