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

2023-05-16

目录

前言

要求

 一.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发送接收)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式作业STM32采用串口DMA方式发送数据 的相关文章

  • Engine实现国密算法SM3的代码和逻辑图

    OpenSSL add all algorithms ERR load crypto strings ENGINE load dynamic ENGINE init Engine finish free ENGINE by id ENGIN
  • 安装VMware,出现没有虚拟网络适配器的问题

    遇到错误 xff1a 安装VMware Workstation Pro这个软件 xff0c 网络适配器中没有虚拟网卡 xff0c 导致无法上网 解决方法 xff1a 遇到这个问题 xff0c 我就第一时间就去网上搜索解决方法 xff0c 方
  • RabbitMQ和Kafka面试

    RabbitMQ xff1a 采用AMQP高级消息队列协议的一种消息队列技术 最大的特点就是消费并不需要确保提供方存在 实现了服务之间的高度解耦 当master queue 所在节点宕机后 xff0c 其正在被消费的消息的相关信息全部丢失
  • windows下用eclipse+goclipse插件+gdb搭建go语言开发调试环境

    windows下用eclipse 43 goclipse插件 43 gdb搭建go语言开发调试环境 http rongmayisheng com post windows E4 B8 8B E7 94 A8eclipsegoclipse E
  • Linux性能监测:磁盘IO篇

    Linux性能监测 xff1a 磁盘IO篇 计算机最慢的子系统 xff0c 也是最容易出现性能瓶颈的地方 xff0c 因为磁盘离 CPU 距离最远而且 CPU 访问磁盘要涉及到机械操作 xff0c 比如转轴 寻轨等 访问硬盘和访问内存之间的
  • 多媒体指令(图像灰度化)

    权当练手了 xff0c 效果不好 xff0c cpu没有提供pmulluw这样一个无符号字相乘指令 处理的效果和matlab明显不同 xff0c 尤其是背景 xff0c 我实在找不出问题在哪里 xff0c 最可能就在寄存器符号上 灰度公式是
  • jni 中的 extern "C" 分析

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 先看一段jni自动生成的源代码 code DO NOT EDIT THIS FILE it is machine generated include lt jni h gt
  • Engine实现国密算法SM4 ECB/CBC 模式的代码和逻辑图

    相应的 struct EVP sms4 cbc Encrypt Decrypt SKF SMS4实现 查看源文件 xff0c 暂不提供 执行测试
  • Java中的箭头——Lambda表达式

    转自 xff1a Java 8 Lambda 表达式 菜鸟教程 Lambda 表达式 xff0c 也可称为闭包 xff0c 它是推动 Java 8 发布的最重要新特性 Lambda 允许把函数作为一个方法的参数 xff08 函数作为参数传递
  • Linux学习之CentOS(十三)--CentOS6.4下Mysql数据库的安装与配置

    如果要在Linux上做j2ee开发 xff0c 首先得搭建好j2ee的开发环境 xff0c 包括了jdk tomcat eclipse的安装 这个在之前的一篇随笔中已经有详细讲解了Linux学习之CentOS 七 CentOS下j2ee环境
  • selenium.common.exceptions.WebDriverException: Message: "Can't load the profile.

    记录一下 xff0c Selenium在最新版本中修好了这个问题 运行CMD xff0c 然后输入 pip install U selenium
  • 网页跳转(APP内/浏览器)

    APP内网页跳转 xff1a xml lt WebView android layout below 61 span class hljs string 34 64 id lunbo 34 span android layout width
  • Intellij IDEA Resource Bundle

    Resource Bundle是什么 可以直接通过官方的描述来了解 https www jetbrains com hel Resource bundle is a set of properties files that have sam
  • H3C配置日志主机

    华三网络设备信息级别共有8级 xff0c 从高到底分别为emergencies alerts critical errors warnings notifications infomational debugging 信息级别数值描述eme
  • MIUI11系统怎么样刷入开发版获得Root超级权限

    小米的手机或平板不同手机型号一般情况下官网都提供两个不同的安卓系统版本 xff0c 可分为稳定版和开发版 xff0c 稳定版没有提供root权限管理 xff0c 开发版中就开启了root权限 xff0c 很多时候我们需要使用的一些功能强大的
  • 一起来看React(路由守卫)

    我们在很多时候都会接触到路由守卫 gt 无论是不是做 代码小子 的人 我们在浏览各网页时会看到头部的网址 如 xff1a 当我们在逛 xff1a 淘宝 天猫 京东 这一类的网站时我们自定义输入地址时 我们应该先登录 如果没登录我们应该跳转到
  • filezilla无法启动传输及严重文件传输错误

    filezilla无法启动传输 严重文件传输错误 文件夹权限不够 xff0c 修改之 你的空间或服务器已经满了 xff0c 请空下回收站或者扩容 文件正在被占用 xff0c 关闭后传输 转载于 https www cnblogs com w
  • 用KeyTool生成安全证书

    详细请见 xff1a Tomcat的帮助文档 xff0c xff1a https localhost 8080 tomcat docs ssl howto html 1 用keytool 生成证书 xff1a keytool genkey
  • Scheduling and emailing PeopleSoft Query results

    You could E Mail the Query results by embedding the paramters in a nVision Layout Create a Tabular nVision Layout Add th
  • VS2022 添加 dll 库文件

    参考链接 Visual Studio中的C 43 43 程序如何使用第三方静态库和动态库 xff1f 掘金 1 xff0c 添加库文件路径 在 Visual Studio 2022 中 xff0c 可以通过在项目属性页面中添加库文件的目录

随机推荐

  • OD常用断点(转载)

    常用断点 OD中 拦截窗口 xff1a bp CreateWindow 创建窗口 bp CreateWindowEx A 创建窗口 bp ShowWindow 显示窗口 bp UpdateWindow 更新窗口 bp GetWindowTe
  • Linux curl 命令模拟 POST/GET 请求

    curl 命令 xff0c 是一个利用URL规则在命令行下工作的文件传输工具 curl 支持文件的上传和下载 xff0c 所以是综合传输工具 xff0c 但按传统 xff0c 习惯称curl为下载工具 作为一款强力工具 xff0c curl
  • WINserver路由服务之多网段管控

    前几天 xff0c 看见了一个朋友写的一篇文章 实现win2003路由功能 看了之后的感觉是 xff0c 只写了路由功能的安装部分 xff0c 对于功能实现之后的应用 xff0c 没怎么谈到 于是跟他交流了一下下 然后也建议他来看看我的那篇
  • ubuntu环境下实现 多线程的socket(tcp) 通信

    改改就是个小型局域网聊天 服务器端 xff1a 1 File Name process server c 2 Author jiujue 3 Created Time 2019年03月10日 星期日 20时29分18秒 4 5 includ
  • cpptools-srv占用内存过大_iOS“其他内存”占用过大问题分析

    今天遇到了一个有趣的关于iPhone 占用内存过大的问题 xff0c app与正常使用内存没问题 xff0c 但莫名多了很多其他内存 手机只有64g但其他占了50g 首先百度一波 xff0c 得到的答案无一是还原出厂设置 xff0c 抹掉所
  • nginx限制客户端请求数+iptables限制TCP连接和频率来防止DDOS

    DDOS的特点是分布式 xff0c 针对带宽和服务 xff0c 即四层流量 和七层应用 对于七层的应用 xff0c 如果前端是Nginx xff0c 主要使用nginx的http limit conn和http limit req模块来防御
  • Android带图片的Toast(自定义Toast)

    使用Android默认的Toast Toast简介 xff1a Toast是一个简单的消息显示框 xff0c 能够短暂的出现在屏幕的某个位置 xff0c 显示提示消息 默认的位置是屏幕的下方正中 xff0c 一般Toast的使用如下 xff
  • XML CDATA是什么?

    解析数据 XML 解析器通常情况下会处理XML文档中的所有文本 当XML元素被解析的时候 xff0c XML元素内部的文本也会被解析 lt message gt This text is also parsed lt message gt
  • TCP端口同时做服务器与客户端

    下面的代码主要实现两个功能 xff1a 1 xff0c 通过bind使本机指定端口如2012端口与远端服务器通信 xff0c 不指定的话会随机分配 2 xff0c 然后使用该指定端口创建监听服务 xff0c 接受其他客户端的连接 主要方法用
  • bat脚本禁用和开启本地连接

    netsh interface set interface name 61 34 本地连接 34 admin 61 disabled 禁用本地连接 netsh interface set interface name 61 34 本地连接
  • 一个PHP的QRcode类,与大家分享

    类的代码 View Code lt php eval gzinflate base64 decode 39 7X1td9s2svDn3nP2PzBZNZJiKRb1ZtmxvY 43 bOE3u2o5rp9u7N5v1oSTaZqO3UHQ
  • Java程序员的黄金5年,从入行到大牛的晋升之路

    在程序界流行着一种默认的说法叫 黄金5年 xff0c 也就是一个程序员从入职的时候算起 xff0c 前五年的选择直接影响着整个职业生涯中的职业发展方向和薪资走向 xff0c 如何走好这5年 xff0c 彻底从一个刚入行的菜鸟蜕变成可以以不变
  • Gin 框架的路由结构浅析

    Gin 是 go 语言的一款轻量级框架 xff0c 风格简单朴素 xff0c 支持中间件 xff0c 动态路由等功能 gin项目github地址 路由是web框架的核心功能 在没有读过 gin 的代码之前 xff0c 在我眼里的路由实现是这
  • 红米手机5 Plus启用root超级权限的步骤

    红米手机5 Plus怎么开启root超级权限 xff1f 做开发的人清楚 xff0c Android机器有root超级权限 xff0c 一旦手机开启root相关权限 xff0c 就可以实现更强的功能 xff0c 举个栗子做开发的人企业的营销
  • 基于vue解决大数据表格卡顿问题

    点我在线体验Demo 请用电脑查看 亲测苹果电脑 xff0c chrome浏览器无卡顿现象 xff0c 其它浏览器并未测试 xff0c 如遇到卡顿请备注系统和浏览器 xff0c 方便我后续优化 xff0c 谢谢 先看一下效果 一共1000
  • raid1损坏一块盘之后的处理方式

    在企业生产环境中 xff0c 假如raid1两块盘中的一块损坏了 xff0c 后续如何处理 xff1f 直接换下损坏的磁盘是否会对服务有影响 xff08 如何把影响降到最低 xff09 xff0c 加入新的磁盘后是否还需要重新做raid1
  • Landsat Tm5辐射定标和大气校正(转)

    一 辐射定标 1 由于ENVI 4 4 中有专门进行辐射定标的模块 xff0c 因此实际的操作十分简单 将原始TM 影像打开以后 xff0c 选择 Basic Tools Preprocessing Calibration Utilitie
  • Traversing the Dept Security tree

    We can use the connect by prior function provided by Oracle to traverse the Dept security Tree Suppose an Organization h
  • Reconfigurable computing[可重构计算]

    在实验室跟老师做一些硬件加速相关的东西 xff0c 看文献时看到Reconfigurable computing xff0c 发现这个很有意思 现在每天都有越来越多的数据产生 xff0c 要处理这些数据如果单纯用CPU计算的话会耗费很多时间
  • 嵌入式作业STM32采用串口DMA方式发送数据

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