STM32之HAL开发——DMA转运串口数据

DMA功能框图(F1系列)

如果外设要想通过 DMA 来传输数据,必须先给 DMA 控制器发送 DMA 请求, DMA 收到请求信号之后,控制器会给外设一个应答信号,当外设应答后且 DMA 控制器收到应答信号之后,就会启动 DMA 的传输,直到传输完毕

DMA映像表(F1系列)

DMA1通道请求映像

DMA2通道请求映像

注意:DMA 具有 12 个独立可编程的通道,其中 DMA1 有 7 个通道, DMA2 有 5 个通道,每个通道对应不同的外设的 DMA 请求。虽然每个通道可以接收多个外设的请求,但是同一时间只能接收一个,不能同时接收多个。
 

DMA_InitTypeDef 初始化结构体

typedef struct {
uint32_t Direction; //传输方向
uint32_t PeriphInc; //外设递增
uint32_t MemInc; //存储器递增
uint32_t PeriphDataAlignment; //外设数据宽度
uint32_t MemDataAlignment; //存储器数据宽度
uint32_t Mode; //模式选择
uint32_t Priority; //优先级
} DMA_InitTypeDef;
  1.  Direction:传输方向选择,可选外设到存储器、存储器到外设以及存储器到存储器。它设定DMA_SxCR 寄存器的 DIR[1:0] 位的值。 ADC 采集显然使用外设到存储器模式。
  2. PeripheralInc:如果配置为 DMA_PINC_ENABLE,使能外设地址自动递增功能,它设定DMA_CCR 寄存器的 PINC 位的值;一般外设都是只有一个数据寄存器,所以一般不会使能该位。
  3. MemoryInc:如果配置为 DMA_MINC_ENABLE,使能存储器地址自动递增功能,它设定DMA_CCR 寄存器的 MINC 位的值;我们自定义的存储区一般都是存放多个数据的,所以要使能存储器地址自动递增功能。
  4. PeriphDataAlignment:外设数据宽度,可选字节 (8 位)、半字 (16 位) 和字 (32 位),它设定DMA_SxCR 寄存器的 PSIZE[1:0] 位的值。 ADC 数据寄存器只有低 16 位数据有效,使用半字数据宽度。
  5. Mode: DMA 传输模式选择,可选一次传输或者循环传输,它设定 DMA_SxCR 寄存器的 CIRC位的值。我们希望 ADC 采集是持续循环进行的,所以使用循环传输模式。
  6. 软件设置数据流的优先级,有 4 个可选优先级分别为非常高、高、中和低,它设定 DMA_SxCR寄存器的 PL[1:0] 位的值。 DMA 优先级只有在多个 DMA 数据流同时使用时才有意义,这里我们设置为非常高优先级就可以了。

DMA存储器到外设实验

void Debug_USART_Config(void)
{GPIO_InitTypeDef GPIO_InitStruct;__HAL_RCC_GPIOA_CLK_ENABLE();/* 使能 UART 时钟 */__HAL_RCC_USART1_CLK_ENABLE();  /* 配置Tx引脚为复用功能  */GPIO_InitStruct.Pin = DEBUG_USART_TX_PIN;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStruct);/* 配置Rx引脚为复用功能 */GPIO_InitStruct.Pin = DEBUG_USART_RX_PIN;GPIO_InitStruct.Mode=GPIO_MODE_AF_INPUT;	//模式要设置为复用输入模式!	HAL_GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStruct);UartHandle.Instance          = DEBUG_USART;UartHandle.Init.BaudRate     = DEBUG_USART_BAUDRATE;UartHandle.Init.WordLength   = UART_WORDLENGTH_8B;UartHandle.Init.StopBits     = UART_STOPBITS_1;UartHandle.Init.Parity       = UART_PARITY_NONE;UartHandle.Init.HwFlowCtl    = UART_HWCONTROL_NONE;UartHandle.Init.Mode         = UART_MODE_TX_RX;HAL_UART_Init(&UartHandle); 
}void USART_DMA_Config(void)
{DEBUG_USART_DMA_CLK_ENABLE();  DMA_Handle.Instance=DEBUG_USART_DMA_STREAM;                 //数据流选择DMA_Handle.Init.Direction=DMA_MEMORY_TO_PERIPH;             //存储器到外设HAL_DMA_Init(&DMA_Handle);DMA_Handle.Init.PeriphInc=DMA_PINC_DISABLE;                 //外设非增量模式/* Associate the DMA handle */DMA_Handle.Init.MemInc=DMA_MINC_ENABLE;                     //存储器增量模式__HAL_LINKDMA(&UartHandle, hdmatx, DMA_Handle); DMA_Handle.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE;    //外设数据长度:8位DMA_Handle.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE;       //存储器数据长度:8位DMA_Handle.Init.Mode=DMA_NORMAL;                            //外设普通模式DMA_Handle.Init.Priority=DMA_PRIORITY_MEDIUM;               //中等优先级HAL_DMA_Init(&DMA_Handle);/* Associate the DMA handle */__HAL_LINKDMA(&UartHandle, hdmatx, DMA_Handle); }HAL_UART_Transmit_DMA(&UartHandle, (uint8_t *)SendBuff ,SENDBUFF_SIZE);

F4/F7系列DMA框图

在F4/F7系列中升级了FIFO功能,使得搬运的数据源和目标之间的存储器可以不用考虑数据大小一致问题,例如将一个字节的数据传输到一个字的存储器中去。FIFO在这之间起一个缓冲区的作用,可以将传输过来的数据,先攒一攒再一起发送。

H7系列DMA框图

在H7系列中新增了一个新的外设,DMAMyx(DMA请求中转调度器):建立DMA请求和DMA通道之间的映射关系,类似于路由的功能。无DMAMUX的MCU,DMA请求和DMA通道的映射关系是固定的,不能由软件修改。有了DMAMUX可以将DMA请求和DMA通道由软件联系起来,实现自定义链接。

 

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

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

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

相关文章

实现ls -l 功能,index,rindex函数的使用

index();----------------------------------------------------------------- index第一次遇到字符c&#xff0c;rindex最后一次遇到字符c&#xff0c;返回值都是从那个位置开始往后的字符串地址 #include <stdio.h> #include <sys/types.h> #include <pwd.h&g…

[HackMyVM]靶场Crossbow

kali:192.168.56.104 靶机:192.168.56.136 端口扫描 # nmap 192.168.56.136 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-03-26 22:17 CST Nmap scan report for crossbow.hmv (192.168.56.136) Host is up (0.0057s latency). Not shown: 997 closed tcp…

反射率光纤光谱仪检测汽车后视镜反射率

反射率光纤光谱仪是一种用于测量材料表面反射率的精密仪器&#xff0c;它通过光纤传输光信号&#xff0c;并利用光谱仪进行分析&#xff0c;以确定材料的光学特性。反射率光纤光谱仪的工作原理基于相对反射率的计算&#xff0c;它涉及到光源、光纤、光谱仪等关键组件。 后视镜能…

牛客小白月赛89(A~C)

小白赛怎么这么难打&#xff0c;是什么小白&#xff0c;我的世界小白吗。 A. 伊甸之花 给你一个数组 a&#xff0c;问你是否找出一个 不等于 a 的数组 b&#xff0c;满足 其中数值都要在 [1,m] 的范围内 直接在 a 数组上修改&#xff0c;可以发现如果改了 a[1],a[2]&#xff…

HTML(一)---【基础】

零.前言&#xff1a; 本文章对于HTML的基础知识处理的十分细节&#xff0c;适合从头学习的初学者&#xff0c;亦或是想要提升基础的前端工程师。 1.什么是HTML&#xff1f; HTML是&#xff1a;“超文本标签语言”&#xff08;Hyper Text Markup Language&#xff09; HTML不…

《Django项目》day4 -- 部署nginx与对接acapp

文章目录 1.增加容器的映射端口&#xff1a;80&#xff08;http&#xff09;与443&#xff08;https&#xff09;2.创建AcApp&#xff0c;获取域名、nginx配置文件及https证书3.修改django项目的配置4.配置uwsgi 1.增加容器的映射端口&#xff1a;80&#xff08;http&#xff0…

SQL109 纠错4(组合查询,order by..)

SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_state MI UNION SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_state IL ORDER BY cust_name;order by子句&#xff0c;必须位于最后一条select语句之后

【AI模型-机器学习工具部署】远程服务器配置Jupyter notebook或jupyter lab服务

随着AI人工智能的崛起&#xff0c;机器学习、深度学习、模型训练等技术也慢慢泛化&#xff0c;java开发有idea&#xff0c;web开发有vscode&#xff0c;那么AI开发神器肯定离不开jupyter lab&#xff08;基础版jupyter notebook&#xff09; Jupyter notebook部署 1. 安装jupy…

FastAPI+React全栈开发06 使用MongoDB设置文档存储

Chapter02 Setting Up the Document Store with MongoDB 01 Summary FastAPIReact全栈开发06 使用MongoDB设置文档存储 In this chapter, we are going to address some of the main features of MongoDB, building upon what was mentioned in the introductory chapter, a…

类模板与继承及成员、全局函数的实现

一、类模板与继承 当类模板碰到继承时&#xff0c;需要注意一下几点&#xff1a; 1.当子类继承的父类是一个类模板时&#xff0c;子类在声明的时候&#xff0c;要指定出父类中T的类型 2.如果不指定&#xff0c;编译器无法给子类分配内存 3.如果想灵活指定出父类中T的类型&a…

在Jetson Nano上使用TensorRT来加速模型

NVIDIA Jetson Nano是一款小型的AI计算设备&#xff0c;专为边缘计算设计&#xff0c;适合运行机器学习和深度学习模型。TensorRT是NVIDIA的一个高性能深度学习推理&#xff08;Inference&#xff09;优化器和运行时库&#xff0c;可以用于加速深度学习模型的推理速度。 在Jet…

QT_day5:使用定时器实现闹钟

1、 程序代码&#xff1a; widget.h&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTime>//时间类 #include <QTimer>//时间事件类 #include <QTextToSpeech>//文本转语音类 QT_BEGIN_NAMESPACE namespace Ui { cla…

速盾:vue可以用cdn吗

Vue可以使用CDN&#xff08;Content Delivery Network&#xff09;来引入&#xff0c;这是一种分发网络&#xff0c;可以加速网站或应用的静态资源加载&#xff0c;从而提供更快的用户体验。在使用CDN之前&#xff0c;我们需要了解一些基本概念和步骤。 CDN是一个分布式系统&a…

2014年认证杯SPSSPRO杯数学建模C题(第一阶段)土地储备方案的风险评估全过程文档及程序

2014年认证杯SPSSPRO杯数学建模 C题 土地储备方案的风险评估 原题再现&#xff1a; 土地储备&#xff0c;是指市、县人民政府国土资源管理部门为实现调控土地市场、促进土地资源合理利用目标&#xff0c;依法取得土地&#xff0c;进行前期开发、储存以备供应土地的行为。土地…

【C语言】预处理编译链接调试技巧详解

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;C语言_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.预处理 1.1 预定义符号 1.2 #define 1.2.1 #define 定义标识符 1.2.2 #define 定义宏 1.2.3 #define 替换规则 1.2.4 #和## …

HTTPS 从懵懵懂懂到认知清晰、从深度理解到落地实操

Https 在现代互联网应用中&#xff0c;网上诈骗、垃圾邮件、数据泄露的现象时有发生。为了数据安全&#xff0c;我们都会选择采用https技术。甚至iOS开发调用接口的时候&#xff0c;必须是https接口&#xff0c;才能调用。现在有部分浏览器也开始强制要求网站必须使用https&am…

MySQL修改root用户的密码

在Windows上重置MySQL的root用户密码可以通过以下步骤进行&#xff1a; 停止MySQL服务&#xff1a;使用快捷键WINR打开运行窗口&#xff0c;输入cmd进入命令行。在命令行中输入net stop mysql来关闭MySQL服务。启动MySQL跳过授权表&#xff1a;将目录切换到MySQL安装目录下的b…

【MySQL】5.MySQL高级语句与sql语句

常用查询 对MySQL数据库的查询&#xff0c;除了基本的查询外&#xff0c;有时候需要对查询的结果集进行处理&#xff1b; 例如&#xff1a;只取10条数据、对查询结果进行排序或分组等 一、按关键字排序 ps&#xff1a;类比与windows任务管理器 使用select 语句可以将需要的…

谷粒商城——缓存——SpringCache

1. 配置使用 首先需要导入相关的依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency> 随后在配置文件中进行配置&#xff1a; spring:cache:t…

oracle补丁升级(19.3-19.22)

一、备份原来的opatch和数据库文件 这里要根据自己的路径&#xff1a; mv /u01/app/oracle/product/19.3.0/db_1/OPatch /u01/app/oracle/product/19.3.0/db_1/OPatch.bakcd /u01/app mkdir -p /u01/app/backup tar -pcvf /u01/app/backup/oracle_backup.tar /u01/app/oracle/…