目录

前言

要求

一.DMA的基本介绍

DMA的基本定义

DMA的主要特征

STM32F411x系列芯片DMA控制器

二.通过CubeMX配置项目

1.创建项目

2.选择芯片STM32F103C8T6

3.设置RCC

4.设置串口

5.设置NVIC Settings

6.DMA设置

7.DMA基础设置

8.时钟源设置

9.项目文件设置

三.在keil配置代码

1.打开通过CubeMX生成的项目

2.配置下载工具

3.添加代码

4.编译并烧录

5.程序实现

四.总结

五.参考资料

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


前言

软件版本:
    STM32CubeMX:6.61
    KEIl:5.61
   mcuisp
    firetools
硬件:
    STM32F103C8T6

要求

STM32采用串口DMA方式,用115200bps或更高速率向上位机连续发送数据

一.DMA的基本介绍

DMA的基本定义

DMA,全称Direct Memory Access,即直接存储器访问。

DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实现和完成的。DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场过程,通过硬件为RAM和IO设备开辟一条直接传输数据的通道,使得CPU的效率大大提高。

DMA的主要特征

·每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发,这些功能通过软件来配置。

·在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,依此类推)。

·独立数据源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐。

·支持循环的缓冲器管理。

·每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求。

·存储器和存储器间的传输、外设和存储器、存储器和外设之间的传输。

·闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标。

·可编程的数据传输数目:最大为65535(0xFFFF)。

STM32F411x系列芯片DMA控制器

DMA的工作框图如下图所示。DMA控制器和Cortex™-M4核心共享系统数据总线,执行直接存储器数据传输。当CPU和DMA同时访问相同的目标(RAM或外设)时,DMA请求会暂停CPU访问系统总线达若干个周期,总线仲裁器执行循环调度,以保证CPU至少可以得到一半的系统总线(存储器或外设)带宽。

DMA控制器传输作为AHB主设备操作直接存储器,它可以控制AHB总线的控制矩阵以启动AHB传送。它可以执行以下信息交换:

•外设到内存

•内存到外设

•内存到内存

DMA控制器提供两个AHB主端口:AHB内存端口(用于连接到内存)和AHB外设端口(用于连接到外设)。 但是,为了允许内存到内存的传输,AHB外设端口也必须可以访问内存。AHB从端口用于对DMA控制器的编程控制(仅支持32位访问)。

DMA处理

对于两个DMA控制器的系统实现如下图所示。DMA1控制器AHB外设端口没有像DMA2控制器那样连接到总线矩阵,所以只有DMA2能够执行内存到内存的数据传输。

DMA事务由给定数量的数据传输序列组成,可以传输的数据项的数量及其宽度(8位,16位或32位)可以通过软件编程实现。每个DMA传输都包含三个操作步骤:

·从外设数据寄存器或者从当前外设/存储器地址寄存器指示的存储器地址取数据,第一次传输时的开始地址是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元;

·存数据到外设数据寄存器或者当前外设/存储器地址寄存器指示的存储器地址,第一次传输时的开始地址是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元;

·执行一次DMA_CNDTRx寄存器的递减操作,该寄存器包含未完成的操作数目。

通道选择

事件发生后,外设向DMA控制器发送请求信号,DMA控制器根据通道优先级来处理请求。当DMA控制器访问外围设备时,确认信号即由DMA控制器发送到外围设备,一旦外围设备从DMA控制器收到确认信号,它就会释放其请求,当外设取消了该请求后,DMA控制器将释放确认信号。 如果外设还有更多请求,它可以启动下一轮请求操作。

每个数据流流都与一个DMA请求相关,该DMA请求可以从8个可能的通道请求中选择,由DMA_SxCR寄存器中的CHSEL [2:0]位控制。

来自外设(TIM,ADC,SPI,I2C等)的8个请求独立连接到每个通道如下图所示:

仲裁器

仲裁器根据通道请求的优先级来启动外设/存储器的访问。优先权管理分2个阶段:

·软件:每个通道的优先权可以在DMA_CCRx寄存器中设置,有4个等级:最高优先级、高优先级、中等优先级、低优先级;

·硬件:如果2个请求有相同的软件优先级,则较低编号的通道比较高编号的通道有较高的优先权。比如:如果软件优先级相同,通道2优先于通道4。

注意: 在大容量产品和互联型产品中,DMA1控制器拥有高于DMA2控制器的优先级。

DMA通道数据量

每个通道都可以在有固定地址的外设寄存器和存储器地址之间执行DMA传输。DMA传输的数据量是可编程的,最大达到65535(0xFFFF)。包含要传输的数据项数量的寄存器,在每次传输后递减。外设和存储器的传输数据量可以通过DMA_CCRx寄存器中的PSIZE和MSIZE位编程得到。

DMA传输模式

数据传输源和目的地都可以寻址整个4 GB区域中的外围设备和存储器,其地址介于0x0000 0000和0xFFFF FFFF之间。传输方向使用DMA_SxCR寄存器中的DIR [1:0]位进行配置,并提供三种可能性:存储器到外围设备,外围设备到存储器或存储器到存储器的传输。

外设到存储器模式

使能此模式时(通过将DMA_SxCR寄存器中的EN位置1),每次发生外设请求时,数据流都会启动传输从数据源来填充到FIFO。当达到FIFO的阈值水平时,FIFO的内容被清空并存储到目标地址。

当外设请求结束传输时(对于外设流控制器),或当DMA_SxNDTR寄存器达到零时或将DMA_SxNDTR寄存器中的EN位清零,则传输停止。

当赢得了相应流的仲裁时,该数据流通道才可以访问AHB源或目标端口,使用DMA_SxCR寄存器中的PL [1:0]位,为每个数据流通道的优先级进行仲裁。

存储器到外设模式

使能该模式时(通过将DMA_SxCR寄存器中的EN位置1),该数据流通道立即启动传输,以完全填充FIFO。每次发生外设请求时,FIFO的内容都会被清空并存储到目的地。当FIFO未满时,会从内存中重新加载数据。

当外设请求结束传输时(对于外设流控制器),或者当DMA_SxNDTR寄存器达到零时或将DMA_SxNDTR寄存器中的EN位清零,则传输停止。

当赢得了相应流的仲裁时,该数据流通道才可以访问AHB源或目标端口,使用DMA_SxCR寄存器中的PL [1:0]位,为每个数据流通道的优先级进行仲裁。

存储器到存储器模式

配置同上。存储器到存储器模式不能与循环模式同时使用。

循环模式

循环模式可用于处理循环缓冲区和连续数据流(例如ADC扫描模式)。 可以使用DMA_SxCR寄存器中的CIRC位来启用此功能。使能循环模式后,将在数据流通道配置阶段使用初始值自动装载要传输的数据,并且DMA请求将继续。

中断

每个DMA通道都可以在DMA传输过半、传输完成和传输错误时产生中断。为应用的灵活性考虑,通过设置寄存器的不同位来打开这些中断。

对于每个DMA数据流通道,可以在以下事件上产生中断:

•达到半转移

•转移完成

•传输错误

•FIFO错误(溢出,欠载或FIFO内存错误)

•直接模式错误

二.通过CubeMX配置项目

1.创建项目

2.选择芯片STM32F103C8T6

3.设置RCC

4.设置串口

5.设置NVIC Settings

6.DMA设置

根据DMA通道预览可以知道,我们用的USART1 的TX RX 分别对应DMA1 的通道4和通道5

7.DMA基础设置

8.时钟源设置

9.项目文件设置

然后点击GENERATE CODE 创建工程

三.在keil配置代码

1.打开通过CubeMX生成的项目

2.配置下载工具

新建的工程所有配置都是默认的 我们需要自行选择下载模式,勾选上下载后复位运行

3.添加代码

在main.C中添加:

 /* 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 */}

4.编译并烧录

5.程序实现

四.总结

因为DMA的原理及概念实在是晦涩难懂,所以我只有借助其他人的博客进行操作,我只能完成最简单的任务,难以进行更进一步的深入

五.参考资料

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

嵌入式作业STM32采用串口DMA方式发送数据相关推荐

  1. STM32使用串口DMA方式发送数据

    1.cubemx设置 1.1基本设置 1.2 打开DMA和中断 2.代码实现 HAL_UART_Transmit_DMA(&huart1,(uint8_t*)str,strlen(str)); ...

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

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

  3. STM32F103C8T6核心开发板下,采用串口DMA方式向上位机连续发送数据的实例详解

    STM32采用串口DMA方式,用115200bps或更高速率向上位机连续发送数据 文章目录 STM32采用串口DMA方式,用115200bps或更高速率向上位机连续发送数据 前言 一.DMA应用初步 ...

  4. STM32串口DMA方式接收数据。类似环形FIFO。超省CPU资源!

    本文转自:http://www.amobbs.com/thread-5530588-2-1.html 一直以来都为串口接收数据所困扰: 1:如果用接收中断的话,每接收1byte就得中断一次.这样太消耗 ...

  5. STM32F051串口DMA方式发送中的几点注意

    我的还没调试出来,先写写要注意的部分: 1.地址问题 STM32F051采用的是Cortex M0内核.在寄存器上与现在使用较多的Cortex M3内核的芯片还有点区别.在这里用到的应该是串口的数据寄 ...

  6. 关于RS485通讯中使用STM32串口以DMA方式发送数据丢失字节的问题

    1.开发平台 计算机操作系统:WIN7 64位: 开发环境:Keil MDK 5.14: MCU:STM32F407ZET6: STM32F4xx固件库:STM32F4xx_DSP_StdPeriph ...

  7. 【嵌入式系统开发13】采用串口中断方式完成单字符接受与字符串接受

    本文目的是主要介绍通过STM32F103C8T6接收到字符"s"时,停止持续发送"hello windows!"; 当接收到字符"t"时,持 ...

  8. STM32 USART串口DMA 接收和发送的源码详解!

    硬件平台:STM32F103ZET6: 开发环境:KEIL 4: 先说说应用通讯模式,串口终端的工作方式和迪文屏差不多,终端被动接受MCU发的指令,终端会偶尔主动发送一些数据给MCU(像迪文屏的触摸信 ...

  9. stm32的串口DMA空闲中断接收不等长数据,stm32F4的usart2-DMA-IDLE收发

    1. 串口为什么要使用DMA?好处? 提高系统实时性:stm32单片机的串口没有FIFO,使用字节中断的方式去接收,会频繁进入中断,影响系统实时性.好在stm32的串口可以级联DMA使用,在大数据量连 ...

最新文章

  1. 机房收费系统之抽象工厂篇
  2. Php7实现文件下载,PHP7 SFTP下载文件并重命名该下载文件
  3. go get github.com/astaxie/beego 没有反应
  4. 修改hosts 流畅使用coursera
  5. 龙芯上市是自主路线被广泛认可的风向标
  6. c#好的程序员必须掌握的编码习惯
  7. java判断文件是否存在_Java判断文件、文件夹是否存在
  8. Cisco路由器密码破解
  9. win10下装黑苹果双系统_win10下安装双系统:黑苹果10.13.5(17F77)教程!
  10. 2022-2027年中国通信光缆市场规模现状及投资规划建议报告
  11. UESTC_树上战争 CDOJ 32
  12. 幽灵蛛(pholcus)(五)--json解析学习资料
  13. Opera GX:什么是“游戏浏览器”?
  14. wx.getLocation接口申请原因怎么填?
  15. 右键没有WinRAR压缩的解决方法
  16. 360篡改Edge、Google浏览器主页的应对方法
  17. 深度学习与OpenCV DNN模块:权威指南
  18. 使用google map v3 api 开发地图服务
  19. 区块链需要学习哪些东西_学习区块链需要什么基础?小白必看
  20. 软件测试之因果图分析

热门文章

  1. 桌面PC/服务器 ubuntu18.04 Linux内核编译升级与机制分析
  2. 技术干货 | 实现模型透明化的有效技术:MindSpore可解释AI能力
  3. 心通医疗在港交所上市:商业化仍处于初级阶段,近三年亏损4亿元
  4. python3字典详解_Python3字典操作详解 Python3字典操作大全
  5. ZYNQ lwip协议栈phy芯片自协商连接速度
  6. [HLS] dataflow
  7. VB.net小技巧——VB中利用TreeView控件和Box控件做知识备忘
  8. 最新kali之dbd
  9. Ubuntu安装samb服务
  10. IntelliJ IDEA设置查看Java API帮助文档