文章目录

  • 一、DMA介绍
    • 1、DMA基本定义
    • 2、DMA传输方式
    • 3、DMA传输原理
    • 4、DMA主要特征
    • 5、DMA工作原理框图
  • 二、通过STMCude生成芯片代码
    • 1、设置RCC
    • 2、设置USART
    • 3、DMA设置
      • (1)、DMA基础设置
    • 3、时钟设置
    • 4、创建项目生成代码
  • 三、调制keil代码
  • 四、使用mcuisp烧录代码到芯片
  • 五、结果展示
  • 六、参考

一、DMA介绍

1、DMA基本定义

DMA(Direct Memory Access,直接存储器访问) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。否则,CPU 需要从来源把每一片段的资料复制到暂存器,然后把它们再次写回到新的地方。在这个时间中,CPU 对于其他的工作来说就无法使用。

2、DMA传输方式

DMA技术的出现,使得外围设备可以通过DMA控制器直接访问内存,与此同时,CPU可以继续执行程序。那么DMA控制器与CPU怎样分时使用内存呢?
通常采用以下三种方法:
(1)停止CPU访问内存;
(2)周期挪用;
(3)DMA与CPU交替访问内存。

3、DMA传输原理

DMA 传输将数据从一个地址空间复制到另外一个地址空间。当CPU 初始化这个传输动作,传输动作本身是由 DMA 控制器来实行和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存区。像是这样的操作并没有让处理器工作拖延,反而可以被重新排程去处理其他的工作。DMA 传输对于高效能 嵌入式系统算法和网络是很重要的。
在实现DMA传输时,是由DMA控制器直接掌管总线,因此,存在着一个总线控制权转移问题。即DMA传输前,CPU要把总线控制权交给DMA控制器,而在结束DMA传输后,DMA控制器应立即把总线控制权再交回给CPU。一个完整的DMA传输过程必须经过DMA请求、DMA响应、DMA传输、DMA结束4个步骤。

4、DMA主要特征

·每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发,这些功能通过软件来配置。
·在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,依此类推)。
·独立数据源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐。
·支持循环的缓冲器管理。
·每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求。
·存储器和存储器间的传输、外设和存储器、存储器和外设之间的传输。
·闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标。
·可编程的数据传输数目:最大为65535(0xFFFF)。

5、DMA工作原理框图

二、通过STMCude生成芯片代码

1、设置RCC

如图:

2、设置USART

选择到USART1,如图设置

点击旁边的NVIC Setting,进行如下设置

3、DMA设置

如图

(1)、DMA基础设置

在右侧System Core找到DMA
如图

DMA Request : DMA传输的对应外设

注意: 如果你是在DMA设置界面添加DMA 而没有开启对应外设的话 ,默认为MENTOMEN

Channel DMA传输通道设置
DMA1 : DMA1 Channel 0~DMA1 Channel 7
DMA2: DMA2 Channel 1~DMA1 Channel 5

Dirction : DMA传输方向
四种传输方向:

外设到内存 Peripheral To Memory
内存到外设 Memory To Peripheral
内存到内存 Memory To Memory
外设到外设 Peripheral To Peripheral
Priority: 传输速度

最高优先级 Very Hight
高优先级 Hight
中等优先级 Medium
低优先级;Low
2DMA传输模式

Normal:正常模式
当一次DMA数据传输完后,停止DMA传送 ,也就是只传输一次

Circular: 循环模式

传输完成后又重新开始继续传输,不断循环永不停止

3DMA指针递增设置

Increment Address:地址指针递增(上方有介绍)。

左侧Src Memory 表示外设地址寄存器

功能:设置传输数据的时候外设地址是不变还是递增。如果设置 为递增,那么下一次传输的时候地址加 Data Width个字节,右侧Dst Memory 表示内存地址寄存器

功能:设置传输数据时候内存地址是否递增。如果设置 为递增,那么下一次传输的时候地址加 Data Width个字节,这个Src Memory一样,只不过针对的是内存。

3、时钟设置

4、创建项目生成代码


同样的保存路径和文件名不能出现中文,否则代码保存会出错 ,IDE选择MDK-ARM

将这两个勾选上后,就可以保存文件生成代码了。

三、调制keil代码

打开刚刚生成的文件,找到main.c文件并打开
在main函数中添加

 /* USER CODE BEGIN Init */uint8_t Senbuff[] = "\r\n**** Serial Output Message by DMA ***\r\n   UART DMA Test \r\n   Zxiaoxuan";  //定义数据发送数组/* 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 */}

四、使用mcuisp烧录代码到芯片


烧录完成后,可在串口助手中查看情况

五、结果展示

六、参考

https://blog.csdn.net/as480133937/article/details/104827639/
https://baike.baidu.com/item/DMA/2385376#%E4%BC%A0%E9%80%81%E6%96%B9%E5%BC%8F
https://blog.csdn.net/as480133937/article/details/98845509

DMA (串口DMA发送接收)相关推荐

  1. 求android 中串口的发送接收数据代码

    RT,求高手帮忙! 就是 /dev/ttyS0 和/dev/ttyS1 两个设备的通信问题.. 同求~ 这个是不是需要串口驱动啊?最近正在搞这个串口通信的案子,头疼 同样也没有搞出来,老是报:不能扫描 ...

  2. 【STM32】HAL库 STM32CubeMX教程十一---DMA (串口DMA发送接收)

    前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...

  3. 了解DMA (串口DMA发送接收)

    文章目录 一.DMA介绍 1.DMA的基本定义 2.DMA传输方式 3.DMA传输原理 4.DMA的主要特征 5.DMA工作原理框图 二.通过STMCude生成芯片代码 1.设置RCC 2.设置USA ...

  4. msp430g2553串口接受数据_MSP430G2553串口通讯 发送接收

    数据发送代码: void UartPutchar(unsigned char c) { while(!(IFG2 & UCA0TXIFG));  //待发送为空 UCA0TXBUF=c; IF ...

  5. 蓝桥杯51单片机之串口通信发送接收信息【单片机开发初学者串口必会】

    文章目录 一.上位机发送信号控制单片机 1.显示对应的流水灯 2.显示对应数码管 3.控制数码管显示的数字 二.两机收发信息 一.上位机发送信号控制单片机 1.显示对应的流水灯 实现现串口通信接收上位 ...

  6. usart 串口的发送-接收数据(正点改编)

    功能:上位机发送给mcu,mcu原原本本发送给上位机**main关键代码**while(1){if(flag==1){len=usart_sta&0xffff;//接收数据长度,&0x ...

  7. dma接收双缓存 stm32_容易被大多数人忽视的STM32串口DMA问题

    讨论三个问题: 1.什么叫串口DMA 请求: 2.串口简要复习: 3.串口DMA发送流程. 第一 什么叫串口DMA 请求(战舰STM32开发板) 说这个问题之前先简单回顾DMA的基本特性.先导出原子哥 ...

  8. 嵌入式作业STM32采用串口DMA方式发送数据

    目录 前言 要求 一.DMA的基本介绍 DMA的基本定义 DMA的主要特征 STM32F411x系列芯片DMA控制器 二.通过CubeMX配置项目 1.创建项目 2.选择芯片STM32F103C8T6 ...

  9. STM32采用串口DMA方式实现发送数据

    文章目录 一.实验工具 二.DMA介绍 三.配置工程 1.新建工程 2.引脚配置 3.设置RCC 4.设置串口 5.DMA设置 6.时钟源设置 7.项目文件设置 8.创建代码 四.Keil中修改代码 ...

最新文章

  1. 一些实用的 Javascript 代码
  2. Powershell管理系列(八)Exchange 2013通讯组管理
  3. spring MVC cors跨域实现源码解析
  4. tableau做rfm分析_RFM模型客户关系管理
  5. 基于时序数据库做监控,这里有超流行的开源方案
  6. jzoj3852-单词接龙【0/1分数规划,负环】
  7. python比较运算符重载_python运算符重载
  8. 区分'方法'和'函数'
  9. python语法笔记(五)
  10. datatables 增、删、查、改
  11. 设置mysql的interactive_timeout和wait_timeout的值
  12. HTML5---新标签与特性
  13. C++之指针探究(十四):回调函数
  14. MIT6.828 boot.S文件分析
  15. 户外移动电源:华宝新能、EcoFlow上演“龙虎斗”
  16. python实现压缩,解压文件,使用密码解压文件。
  17. 我的2018OKR年终回顾与2019OKR初步规划
  18. [GYCTF2020]Easyphp
  19. Scala基础:类和构造器
  20. 2021-2027全球与中国SD WAN托管服务市场现状及未来发展趋势

热门文章

  1. swagger文档无法测试下载文件的接口解决方式
  2. 菜鸟慢慢爬行-----web(8)
  3. 第3关:花式索引与布尔索引
  4. iOS 本地动态验证码生成
  5. office365有必要值得买吗?office365家庭版和个人版区别解析
  6. 餐饮连锁收银系统总结会议——对合作做事情的思考
  7. 为下一代消费者做游戏
  8. 充电桩将成为新能源汽车的“大心脏”
  9. 解决电脑部分软件显示网络连接异常,或者界面加载不成功问题
  10. 入门网络安全工程师要学什么