基于HEL库利用DMA实现串口通信

文章目录

  • 一、DMA的原理
  • 二、配置HEL库环境
  • 二、代码的编写
  • 三、程序的烧录与实现
    • 1.程序的烧录
    • 2.程序的实现
  • 四、总结
  • 参考文献

一、DMA的原理

DMA的概念:直接存储器访问(DMA):用于在外设与存储器之间以及存储器与存储器之间进行高速数据传输。DMA传输过程的初始化和启动由CPU完成,传输过程由DMA控制器来执行,无需CPU参与,从而节省CPU资源,提高利用率。
STM32的DMA控制器特点
STM 32的DMA控制器特点
基于HEL库利用DMA实现串口通信_第1张图片

STM32的DMA控制器特点
1.STM32F411微控制器具备两个DMA控制器:DMA1和DMA2,每个控制器有8个数据流,每个数据流可以映射到8个通道((或请求);2.每一个DMA控制器用于管理一个或多个外设的存储器访问请求,并通过总线仲裁器来协调各个DMA请求的优先级;
3.数据流(stream)是用于连接传输源和传输目标的数据通路,每个数据流可以配置为不同的传输源和传输目标,这些传输源和传输目标称为通道(Channel)
;4。具备16字节的FIFO。使能FIFO功能后,源数据先送入FIFO,达到FIFO的触发阈值后,再传送到目标地址。

基于HEL库利用DMA实现串口通信_第2张图片DMA传送由3个操作组成:
(1)从外设数据寄存器或者从当前外设/存储器地址寄存器指示的存储器地址取数据,第一次传输时的开始地址是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元;
(2)存数据到外设数据寄存器或者当前外设/存储器地址寄存器指示的存储器地址,第一次传输时的开始地址是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元;
(3)执行一次DMA_CNDTRx寄存器的递减操作,该寄存器包含未完成的操作数目。
下面时DMA的数据传输框图:
基于HEL库利用DMA实现串口通信_第3张图片DMA方式的接口函数
基于HEL库利用DMA实现串口通信_第4张图片基于HEL库利用DMA实现串口通信_第5张图片基于HEL库利用DMA实现串口通信_第6张图片

DMA传输参数的数据传输需要:
1 数据的源地址
2 数据传输位置的目标地址
3 传递数据多少的数据传输量
4 进行多少次传输的传输模式

当用户将参数设置好,主要涉及源地址、目标地址、传输数据量这三个,DMA控制器就会启动数据传输,当剩余传输数据量为0时 达到传输终点,结束DMA传输 ,当然,DMA 还有循环传输模式 当到达传输终点时会重新启动DMA传输。

二、配置HEL库环境

RCC的设置(并选择引脚)基于HEL库利用DMA实现串口通信_第7张图片
基于HEL库利用DMA实现串口通信_第8张图片设置中断
基于HEL库利用DMA实现串口通信_第9张图片
DMA设置,选择DMA Setting的Add的添加通道,传输速率设置为Medium
基于HEL库利用DMA实现串口通信_第10张图片
选择Normal–Memory基于HEL库利用DMA实现串口通信_第11张图片
System view选择DMA基于HEL库利用DMA实现串口通信_第12张图片
时钟的设置基于HEL库利用DMA实现串口通信_第13张图片

二、代码的编写

在main函数中添加

uint8_t Senbuff[] = "Hello world!";  //定义数据发送数组

在这里插入图片描述

  HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff));
  HAL_Delay(1000);

基于HEL库利用DMA实现串口通信_第14张图片
编译后得到
在这里插入图片描述

三、程序的烧录与实现

1.程序的烧录

基于HEL库利用DMA实现串口通信_第15张图片

2.程序的实现

打开串口调试助手,stm32c8t6核心板boot双置0,打开串口接收信号,如下图所示
基于HEL库利用DMA实现串口通信_第16张图片

四、总结

通过对DMA串口通信的实现,发现DMA可以使任务的传输更加高效,但是DMA的资源有限,需要合理使用。DMA不是独立的某个外设,而是独立的一整个模块,希望给各位读者带来帮助!

参考文献

Cubemx配置串口实现DMA的数据传输
DMA数据传输
HAL库 STM32CubeMX教程
DMA方式向上位机连续发送数据

你可能感兴趣的:(单片机,stm32,嵌入式硬件)