STM32采用串口DMA方式,发送数据

您所在的位置:网站首页 stm32dma串口不连续 STM32采用串口DMA方式,发送数据

STM32采用串口DMA方式,发送数据

2023-11-09 22:51| 来源: 网络整理| 查看: 265

STM32串口DMA发送数据 一、DMA介绍1、DMA简介2、DMA功能框图3、DMA传输方式 二、DMA串口通信1、CubeMx配置DMA2、DMA函数3、实验结果 三、实验总结四、参考文献

一、DMA介绍 1、DMA简介

DMA(Direct Memory Access)—直接存储器存取,是单片机的一个外设,它的主要功能是用来搬数据,但是不需要占用 CPU,即在传输数据的时候,CPU 可以干其他的事情,好像是多线程一样。数据传输支持从外设到存储器或者存储器到存储器,这里的存储器可以是 SRAM 或者是 FLASH。DMA 控制器包含了 DMA1 和 DMA2,其中 DMA1 有 7 个通道,DMA2 有 5 个通道,这里的通道可以理解为传输数据的一种管道。要注意的是 DMA2 只存在于大容量的单片机中。

2、DMA功能框图

如图1所示。 在这里插入图片描述 图1 DMA框图 ①DMA请求 如果外设要想通过 DMA 来传输数据,必须先给 DMA控制器发送 DMA请求,DMA收到请求信号之后,控制器会给外设一个应答信号,当外设应答后且 DMA 控制器收到应答信号之后,就会启动 DMA 的传输,直到传输完毕。 ②通道 DMA 具有 12 个独立可编程的通道,其中 DMA1 有 7 个通道,DMA2 有 5 个通道,每个通道对应不同的外设的 DMA 请求。虽然每个通道可以接收多个外设的请求,但是同一时间只能接收一个,不能同时接收多个。 ③仲裁器 当发生多个 DMA 通道请求时,就意味着有先后响应处理的顺序问题,这个就由仲裁器也管理。仲裁器管理 DMA 通道请求分为两个阶段。第一阶段属于软件阶段,可以在DMA_CCRx 寄存器中设置,有 4 个等级:非常高、高、中和低四个优先级。第二阶段属于硬件阶段,如果两个或以上的 DMA 通道请求设置的优先级一样,则他们优先级取决于通道编号,编号越低优先权越高,比如通道 0 高于通道 1。在大容量产品和互联型产品中,DMA1 控制器拥有高于 DMA2 控制器的优先级。

3、DMA传输方式

(1)DMA数据传输的四个要素 ① 传输源 :DMA数据传输的来源 ② 传输目标:DMA数据传输的目的 ③ 传输数量:DMA传输数据的数量 ④ 触发信号:启动一次DMA数据传输的动作 (2)DMA传输模式 DMA_Mode_Normal,正常模式: 传输结束后(即要传输数据的数量达到零),将不再产生DMA操作。若开始新的DMA传输,需在关闭DMA通道情况下,重新启动DMA传输。 DMA_Mode_Circular ,循环传输模式: 可用于处理环形缓冲区和连续数据流(例如ADC扫描模式)。当激活循环模式后,每轮传输结束时,要传输的数据数量将自动用设置的初始值进行加载, 并继续响应DMA请求。

二、DMA串口通信 1、CubeMx配置DMA

选择芯片、设置RCC步骤省略 (1)串口的DMA配置 如图2所示在这里插入图片描述 图2 DMA串口配置 点击3DMA Settings,再点击Add,添加RX和TX串口 然后点击NVIC Settings使能接收中断 (2)DMA串口参数配置 RX:如图3所示 在这里插入图片描述 图3 接收串口 传输速率设置为中速,DMA传输模式为正常模式 TX: 如图4所示 在这里插入图片描述 图4 发送串口 与接收串口一致。

(3)DMA基础设置 如图5所示 在这里插入图片描述 图5 DMA设置 点击DMA再点击Add添加MEMTOMEM。

2、DMA函数

在main.c中添加:

/* USER CODE BEGIN Init */ uint8_t Senbuff[] = "Hello Windows!\n"; //定义数据发送数组 /* USER CODE END Init */

while循环:

while (1) { /* USER CODE END WHILE */ HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff)); HAL_Delay(1000); /* USER CODE BEGIN 3 */ }

串口DMA方式发送函数: 函数原型:HAL_StatusTypeDef HAL_UART_Transmit_DMA (UART_HandleTypeDef *huart,uint8_t *pData, uint16_t Size) 功能描述:在DMA方式下发送一定数量的数据 参数1 huart:串口句柄的地址 参数2 pData:待发送数据的首地址 参数3 Size:待发送数据的个数 串口DMA方式接收函数: 函数原型:HAL_StatusTypeDef HAL_UART_Receive_DMA (UART_HandleTypeDef *huart,uint8_t *pData, uint16_t Size) 功能描述:在DMA方式下接收一定数量的数据 参数与发送函数的参数相同 HAL库URTDMA函数库还有很多但与串口的函数库几乎一致,这里就不一一介绍了。

3、实验结果

(1)烧录 (2)野火串口调试 如图6所示 在这里插入图片描述 图6 实验结果 由图可见,串口接收窗口显示成功。 注:可先进行仿真,查看自己的工程是否出错,避免串口输出无结果显示。

三、实验总结

本实验进行的时采用DMA模式进行串口通信,DMA的作用就是实现数据的直接传输,而去掉了传统数据传输需要CPU参与的环节,没有了CPU的干涉,外设利用DMA通道直接将数据写入存储器或将数据从存储器中读出,提高了工作效率。这是串口通信工作的第三个方法,传输效率是最高的,整个实验主要是通过CubeMx自动生成工程,省去了很多函数代码的编写,只要明白了每个函数的作用,正确的格式使用还是很简单的,本次实验过程还算顺利,但在对DMA的了解过程花了很长时间,了解的也还不算透彻,还需要好好学习。如有错误,请指正。

四、参考文献

【1】第九章—串口通信 【2】https://blog.csdn.net/as480133937/article/details/104927922 【3】https://blog.csdn.net/faihung/article/details/78748033 【4】零死角玩转STM32F103——指南



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3