STM32 DMA编程时的一个应用小提醒

news2025/1/12 16:15:44

631561cc86ceec1c7dce8619f2360437.jpeg

有人使用STM32H7芯片做些事情,发现基于ST公司的HAL库开发UART1DMA收发时可以轻松实现,而当使用STLL库组织代码时,却没法实现UARTDMA传输。感觉上就是使用HAL库编写代码功能正常而基于LL库则不行。真是这样吗?

使用STM32CubeMx进行图形化配置,并生成基于HAL库的初始代码,要实现UART收发功能的DMA传输的话,除了安排好的收发缓冲内存外,再就只需调用下面两个HAL库的API函数即可进行功能验证。

636e3e9a612a8f532fec83f711765f1f.png

从功能实现上讲,使用HAL库及相应API还是很方便、很简单的。每个API函数就像个黑盒子,对于里面的内容,如果你不点进去阅读是不会知晓的。不过,建议尽可能地多点进去瞧瞧,那里往往别有洞天。

如果基于LL库来组织代码的话,先使用STM32CubeMx进行配置并生成基于LL库的初始化代码。

268489a263d3d8a664c69b4593eea0c5.png

c9dc4187ba91d3b9219d296f354df4df.png

基于CubeMx配置完毕后生成初始化工程,准备收发缓冲内存,然后添加用户代码。

刚开始用户代码是这样编写安排的。见下面代码截图。

3df3806b6d1c729756620f8d3aba88d1.png

上图中A处代码的作用就是开启两个DMA stream的功能,即对相关DMA Stream的控制寄存器的使能位进行使能置1。

编译无错后运行代码,可是根本没有数据的收发动作发生。看来,跟反馈者的症状一样。

没办法,硬着头皮核查代码。除了核查我添加的用户代码外,还核查UARTDMA的初始化代码。看来看去,似乎该有的都有了,该写的都写了。

后来,根据代码里涉及到的寄存器去跟STM32H7手册里寄存器做比较阅读。在查看DMA各个stream配置控制寄存器DMA_SxCR内容时,突然发现并想起了点什么。其实也是之前在别的DMA应用场合也碰到过的类似问题。下面为该寄存器的内容布局截图。

184e14eb1d60dd7a8c348926ec80dae9.png

隐约记得,该DMA StreamChannel的控制使能位为0时才能做DMA相关其它参数的配置的。我们可以在手册里找到针对该位的明确描述:

78f60da9e055a120e38e5ced4ae289e6.png

这里的意思是说,要想让某DMA stream工作,必须令该EN位为1。不过,当该EN位为1时时,是不允许对DMA及相应FIFO寄存器做配置的。换言之,若要针对某StreamDMA相关配置,得先让该控制寄存器的EN位保持为0状态。

而在我的用户代码里,对EN位写1操作则放在了对DMA做各种配置的前面,即上面代码截图的A处。

e7fcc60338c30268f0e6992d32f31378.png

28e2beed3f9c86308ad778982df7abe1.png

既然这样,我们把对DMA控制寄存器EN位的置1操作放在其它DMA相关配置之后就应该可以了,即从上面代码截图中的A处拉到B。然后,进行测试,结果果真正常了。

其实就是一个配置代码顺序问题,卡了半天。

如果不是用LL库而是用HAL库可能就不太容易碰到这个问题。前面说过了,基于HAL库的API函数像个黑盒子,它帮我们处理了很多细节性、判断性的东西。

基于LL库组织的代码,相比HAL库组织的代码,代码精简、流程清晰、运行高效。不过,使用LL库做开发需要开发者对芯片各个模块的工作原理,操作流程有更清晰、更精准的了解,同时往往还需要开发者对应用相关的寄存器有更细致、深入的把握。

HAL库往往事先帮我们充分考虑到了基于硬件需求的操作流程、时序,基于软件层面的诸多事件及状态的互斥管理,以及不同STM32系列的代码兼容性,并做了很好、很全面的封装。所以我们在利用HAL库来实现相应功能时,往往无须对操作流程、时序以及寄存器本身做过多的了解就可以完成。从开发角度讲,利用HAL库往往比利用LL库能更快地完成任务,同时基于HAL库的代码也有更好的移植性,代价就是代码相对LL库要庞大些。对应STM32开发者而言,即使基于HAL库开发了一些STM32项目,对于芯片的诸多功能细节以及寄存器的了解往往可能比较有限。当然,这点因人而异吧,不可说死。

对于HAL库和LL库的选用,我们每个人可以根据自身情况来。比方,对芯片软硬件不熟悉时、任务紧急时先使用HAL库,等对芯片及库函数熟悉、任务不紧急时可以切换到LL库。或者说,只是做些功能性验证确认,使用HAL库组织代码也是非常快捷方便的。当然,一个工程里HAL库、LL库是可以同时并存的。另外,当我们对芯片寄存器、内核指令系统足够熟悉时,甚至可以尝试使用汇编语言做MCU编程开发。作为开发人员,基于HAL库组织代码和基于汇编指令组织代码实现相同功能时,对我们自身的挑战及相应的收获是不可同日而语的。

==========================

往期话题阅读链接:

1、STM32G4系列存储访问的两个小话题

2、开启Cache后UART无法发送新数据

3、为何STM32H7的ADC数据不变?

4、CubeMx配置顺序与DMA传输异常之提醒

5、基于STM32的TIM+DMA+DAC应用示例

9ee238f374f9fb2b62452394d0708fef.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/145851.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

磁盘管理与配置

磁盘管理的概念 Windows Server 2012 R2支持基本分区和动态分区两类分区,实现了跨区卷、带区卷、镜像卷等功能。使用动态存储技术,可以创建、扩充或监视磁盘卷,添加新磁盘,用户无须重启系统,多数配置即可立即生效 分…

TCP/IP 网络模型

应用层最上层的,也是我们能直接接触到的就是应用层(Application Layer),我们电脑或手机使用的应用软件都是在应用层实现。那么,当两个不同设备的应用需要通信的时候,应用就把应用数据传给下一层&#xff0c…

V2X,路测单元,RSU,Map消息集

前言 MAPMAP消息即地图消息,由路侧单元RSU(RodeSide Unit)广播,向车辆传递局部区域的地图信息。包括局部区域路口消息、路段消息、车道消息、道路之间的连接关系等。用于传递多种类型的地理道路信息,内容应该包括&…

JS 代理第一篇:在代理中使用反射

理解代理的概念 有过 java 或者 c# 经验的同学,比较容易理解代理的概念和作用,可以类比类中的 setter 和 getter 没有相关经验,读完下面内容,也可以初步理解JS中的代理了 有下面一个对象 const duck {name: Maurice,color: whi…

iOS WeexSDK 如何将 Vue 文件绘制成原生UI

废话开篇:现在的跨平台开发尤其是以 vue 语法为主的 uniapp 框架,可以实现 vue 语法直接转换为原生 UI 组件的功能(.nvue 文件),可以理解成 .nvue 文件下的标签与 weex 库的原生注册的 UI 有对应的映射关系&#xff0c…

String类详解(java)

文章目录📖前言:🎀String类的构造方法两种创建形式🪅**隐式创建:**🪅**显式创建:**🎀String类底层结构:🎀String类常用方法:📖前言&am…

神经网络漫谈(一):科普篇

神经网络漫谈(一):科普篇 发表时间: 2023年1月6日创作地点:湖北省武汉市作者:ixy_com&[Bill Kromydas]封面图片来源:Towards Data Science 1、背景 基本概念:神经网络,也称为人工神经网络 (ANN) 或…

Ubuntu22.04安装Docker以及Docker安装微信、企业微信、Docker常用命令

Ubuntu22.04安装Docker以及Docker安装微信、企业微信、Docker常用命令1 Docker引擎官网安装1.1 访问Docker官网下载社区版引擎并按照官网指导进行初步安装1.2 检查安装是否成功1.3 添加当前用户到docker组,不用每次都输入sudo。2 Docker安装微信2.1 拉取微信镜像2.2…

CSS基础(八)——CSS3新增样式

概述 前面7篇博客记录的所有 CSS 知识,都是 CSS2 版本的功能。 CSS3 在 CSS2 版本的基础上,新增了很多特性,例如边框圆角、动画效果。 在 CSS2 的时代,实现圆角必须要用图片才能实现,而 CSS3 只要一行样式就能实现…

SpringBoot+MySQL(官方案例)

在线文档项目结构 1.源码克隆:git clone https://github.com/spring-guides/gs-accessing-data-mysql.git 2.包含两个项目initial和complete,initial可以根据文档练习完善,complete是完整项目 3.功能描述:构建应用程序&#xff0c…

【jQuery】jQuery基础概念

一、JavaScript库1.仓库可以把很多东西放到这个仓库里面。找东西只需要到仓库里面查找到就可以了。2. JavaScript库即 library,是一个封装好的特定的集合(方法和函数)。从封装一大堆函数的角度理解库,就是在这个库中,封装了很多预…

信息技术 安全技术 密钥管理

声明 本文是学习github5.com 网站的报告而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 前 言 GB/T 17901《信息技术 安全技术 密钥管理》分为六个部分: ——第1部分:框架; ——第2部分:使用对称技术的…

Odoo 16 企业版手册 - 库存管理之库位管理

库存位置 配置和管理Odoo 库存模块中可用位置的平台将帮助您定义仓库中存放产品的地方。在单个仓库中,您可以管理库存的多个位置。从库存模块的「设置」菜单中,您可以激活存储位置功能,如下所示,该功能将帮助您跟踪仓库中的产品位…

为什么使用消息中间件

为什么要使用消息中间件 如有一个电商交易的场景,用户下单之后调用库存系统减库存,然后调用物流系统进行发货,如果刚开始交易,库存,物流都是属于一个系统,那么他们之间就是接口调用。但是随着系统的发展&a…

FRP 内网穿透搭建(无域名)

一、为什么要内网穿透 FRP 可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议。 使用场景:公网服务器监听某个端口等待内网服务器连接,内网服务器连接成功后,用户访问公网的某一个端口,访问的所…

Domino Web应用早就想到了环保

大家好,才是真的好。 前几周我们讲了Notes,上周讲了点管理,这周我们可以讲点开发。 我现在要讲的技术真的很古老,但现在却被越来越多的人提倡。 传统的Notes应用可以很简单地通过浏览器访问,以一个非常简单但又很使…

ESP32设备驱动-MCP9808数字温度传感器驱动

MCP9808数字温度传感器驱动 文章目录 MCP9808数字温度传感器驱动1、MCP9808介绍2、硬件准备3、软件准备4、驱动实现1、MCP9808介绍 MCP9808 数字温度传感器将 -20C 和 +100C 之间的温度转换为精度为 0.5C(最大值)的数字字。 MCP9808 带有用户可编程寄存器,可为温度传感应用…

联力L216装机心得

联力L216装机心得 2022年12月份装机笔记 参考视频 B站硬件茶谈装机:https://www.bilibili.com/video/BV1BG4y137mG/?spm_id_from333.337.search-card.all.click&vd_source8f7bdd23b317e50e9b9803f44de6a213 联力L216机箱介绍:https://www.bilibili.com/vid…

ArcGIS基础实验操作100例--实验57由点坐标生成面要素

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 高级编辑篇--实验57 由点坐标生成面要素 目录 一、实验背景 二、实验数据 三、实验步骤 (…

【Qt】自动查找Qt应用程序缺少的依赖库

【Qt】自动查找Qt应用程序缺少的依赖库1、背景2、实例3、验证1、背景 操作系统:windows10专业版,如下图: Qt版本:qt-opensource-windows-x86-msvc2013_64-5.7.1.exe 使用Qt安装后的qtcreator5.7.1开发Qt应用程序。 将编译生成的…