完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、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的了解过程花了很长时间,了解的也还不算透彻,还需要好好学习。如有错误,请指正。 |
|
|
|
只有小组成员才能发言,加入小组>>
3310 浏览 9 评论
2991 浏览 16 评论
3492 浏览 1 评论
9057 浏览 16 评论
4086 浏览 18 评论
1175浏览 3评论
603浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
596浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2333浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 15:55 , Processed in 1.140111 second(s), Total 80, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号