STM32采用串口DMA方式,发送数据 |
您所在的位置:网站首页 › stm32dma串口不连续 › STM32采用串口DMA方式,发送数据 |
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数据传输的动作 (2)DMA传输模式 DMA_Mode_Normal,正常模式: 传输结束后(即要传输数据的数量达到零),将不再产生DMA操作。若开始新的DMA传输,需在关闭DMA通道情况下,重新启动DMA传输。 DMA_Mode_Circular ,循环传输模式: 可用于处理环形缓冲区和连续数据流(例如ADC扫描模式)。当激活循环模式后,每轮传输结束时,要传输的数据数量将自动用设置的初始值进行加载, 并继续响应DMA请求。 二、DMA串口通信 1、CubeMx配置DMA选择芯片、设置RCC步骤省略 (1)串口的DMA配置 如图2所示 (3)DMA基础设置 如图5所示 在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所示 本实验进行的时采用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 |