使用CUBE_MX实现STM32 DMA功能 (储存器发送数据到外设串口)+(外设串口将数据写入到存储器)
目录
一、配置串口打印(参考串口打印的文章)
二、CUBE_MX配置
三、KEIL5配置
1.打开dma.c文件(默认初始化DMA中断函数)
2.打开usart.c文件
3.打开main.c文件(储存器发送数据到外设串口)
4.打开main.c文件(外设串口将数据写入储存器)
一、配置串口打印(参考串口打印的文章)
二、CUBE_MX配置
1.选择USART1串口,配置为异步发送
2.在DMA Setting中add
USART1_RX(串口到储存器)
USART1_TX(存储器到串口)
3.配置优先级、传输数据的大小
4.生成代码
三、KEIL5配置
1.打开dma.c文件(默认初始化DMA中断函数)
void MX_DMA_Init(void)
{/* DMA controller clock enable */__HAL_RCC_DMA1_CLK_ENABLE();/* DMA interrupt init *//* DMA1_Channel4_IRQn interrupt configuration */HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 0, 0);HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn);/* DMA1_Channel5_IRQn interrupt configuration */HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 0, 0);HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn);}
2.打开usart.c文件
定义了句柄结构体
UART_HandleTypeDef huart1;
DMA_HandleTypeDef hdma_usart1_tx;
DMA_HandleTypeDef hdma_usart1_rx;
串口参数配置
void MX_USART1_UART_Init(void)
{/* USER CODE BEGIN USART1_Init 0 *//* USER CODE END USART1_Init 0 *//* USER CODE BEGIN USART1_Init 1 *//* USER CODE END USART1_Init 1 */huart1.Instance = USART1;huart1.Init.BaudRate = 115200;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;if (HAL_UART_Init(&huart1) != HAL_OK){Error_Handler();}/* USER CODE BEGIN USART1_Init 2 *//* USER CODE END USART1_Init 2 */}
要手动增补初始化函数(不要忘记了)
HAL_UART_Init(&huart1);
上述代码配置了串口的传输速度和模式(可以通过软件配置),如图:
初始化 USART1_RX(串口到储存器)、 USART1_TX(存储器到串口)
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};if(uartHandle->Instance==USART1){/* USER CODE BEGIN USART1_MspInit 0 *//* USER CODE END USART1_MspInit 0 *//* USART1 clock enable */__HAL_RCC_USART1_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/**USART1 GPIO ConfigurationPA9 ------> USART1_TXPA10 ------> USART1_RX*/GPIO_InitStruct.Pin = GPIO_PIN_9;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);GPIO_InitStruct.Pin = GPIO_PIN_10;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/* USART1 DMA Init *//* USART1_RX Init */hdma_usart1_rx.Instance = DMA1_Channel5;hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE;hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE;hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;hdma_usart1_rx.Init.Mode = DMA_NORMAL;hdma_usart1_rx.Init.Priority = DMA_PRIORITY_LOW;if (HAL_DMA_Init(&hdma_usart1_rx) != HAL_OK){Error_Handler();}__HAL_LINKDMA(uartHandle,hdmarx,hdma_usart1_rx);/* USART1_TX Init */hdma_usart1_tx.Instance = DMA1_Channel4;hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;hdma_usart1_tx.Init.Mode = DMA_NORMAL;hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK){Error_Handler();}__HAL_LINKDMA(uartHandle,hdmatx,hdma_usart1_tx);/* USER CODE BEGIN USART1_MspInit 1 *//* USER CODE END USART1_MspInit 1 */}
}
要手动增补初始化函数(不要忘记了)
HAL_DMA_Init(&hdma_usart1_tx);
HAL_DMA_Init(&hdma_usart1_rx);
3.打开main.c文件(储存器发送数据到外设串口)
1.定义存储器1
#define SENDBUFF_SIZE 13
uint8_t SendBuff[SENDBUFF_SIZE];//储存器(给外设串口发送数据)
2.在主结构体存储数据
HAL_UART_Transmit_DMA函数中,储存器中只能使用 ‘’ (单个字符)
int i;for(i=0;i<SENDBUFF_SIZE;i=i+13){SendBuff[i] = 'M';SendBuff[i+1] = 'L';SendBuff[i+2] = 'S';SendBuff[i+3] = ' ';SendBuff[i+4] = 'L';SendBuff[i+5] = 'O';SendBuff[i+6] = 'V';SendBuff[i+7] = 'E';SendBuff[i+8] = ' ';SendBuff[i+9] = 'M';SendBuff[i+10] = 'X';SendBuff[i+11] = ' '; }
3.配置串口打印(参考另一篇文章)
4.在main结构体中调用函数
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)SendBuff ,SENDBUFF_SIZE);
//三个参数 1.USART句柄结构体 2.要发送数据的存储器 3.数据大小
5.打开串口调试助手
4.打开main.c文件(外设串口将数据写入储存器)
1.定义储存器2
#define SENDBUFF_SIZE 13
uint8_t ReceiveBuff[SENDBUFF_SIZE];
2.配置串口打印
3.在main结构体中调用函数
HAL_UART_Receive_DMA(&huart1,(uint8_t *)ReceiveBuff,SENDBUFF_SIZE);
//三个参数 1.串口的句柄结构体 2.要接收串口数据的存储器 3.数据大小
4.再调用函数把存储的数据再发送到串口中
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)ReceiveBuff,SENDBUFF_SIZE);
5.打开串口助手,发送数据999,并回显
相关文章:

使用CUBE_MX实现STM32 DMA功能 (储存器发送数据到外设串口)+(外设串口将数据写入到存储器)
目录 一、配置串口打印(参考串口打印的文章) 二、CUBE_MX配置 三、KEIL5配置 1.打开dma.c文件(默认初始化DMA中断函数) 2.打开usart.c文件 3.打开main.c文件(储存器发送数据到外设串口) 4.打开main.c…...

【JavaScript】数据结构之树
什么是树形结构? 一种分层数据的抽象模型,用来分层级关系的。虚拟dom它所组织的那个数据原理就是树形结构 深度优先搜索(遍历)- 递归 从根出发,尽可能深的搜索树的节点技巧 访问根节点对根节点的children挨个进行深…...

【AI大模型】LLM主流开源大模型介绍
目录 🍔 LLM主流大模型类别 🍔 ChatGLM-6B模型 2.1 训练目标 2.2 模型结构 2.3 模型配置(6B) 2.4 硬件要求 2.5 模型特点 2.6 衍生应用 🍔 LLaMA模型 3.1 训练目标 3.2 模型结构 3.3 模型配置(7B) 3.4 硬件…...

Uniapp的alertDialog返回值+async/await处理确定/取消问题
今天在使用uniui的alertDialog时,想添加一个确定/取消的警告框时 发现alertDialog和下面的处理同步进行了,没有等待alaertDialog处理完才进行 查询后发现问题在于 await 关键字虽然被用来等待 alertDialog.value.open() 的完成,但是 alertDi…...
Spring Boot中的响应与分层解耦架构
Spring Boot中的响应与分层解耦架构 在Spring Boot框架中,响应与分层解耦架构是两个核心概念,它们共同促进了应用程序的高效性、可维护性和可扩展性。下面将详细探讨这两个方面,包括Spring Boot的响应机制、分层解耦的三层架构以及它们在实际…...

基于python+django+vue的图书管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的图…...

Oracle数据库安装与SQL*Plus使用
一、实验过程 1、安装完数据库服务器程序后,查看系统服务启动状况并截图。 2、启动 SOL Plus工具,分别以SYS用户和 SYSTEM用户登录数据库,并解锁scott用户,用scott用户登录。每次登录完成后用show user命令查看当前用户,并截图。…...

C#通过MXComponent与三菱PLC通信
1,MXComponent安装包与手册。 https://download.csdn.net/download/lingxiao16888/89767137 2,使用管理员权限打开MXComponent,并进行配置。 3,引用相应的类库。 //通信类库 ActUtlTypeLib.dll或者ActProgType.dll 注明&#x…...

深度学习实战91-利用时空特征融合模型的城市网络流量预测分析与应用
大家好,我是微学AI,今天给大家介绍一下深度学习实战91-利用时空特征融合模型的城市网络流量预测分析与应用。本文围绕基于时空特征融合的城市网络流量预测展开。介绍了城市网络流量预测的重要性和现实需求,以及时空特征融合模型,包括其原理和优势。然后展示所使用的数据集,…...

GlusterFS 分布式文件系统
一、GlusterFS 概述 1.1 什么是GlusterFS GlusterFS 是一个开源的分布式文件系统,它可以将多个存储服务器结合在一起,创建一个大的存储池,供客户端使用。它不需要单独的元数据服务器,这样可以提高系统的性能和可靠性。由于没有…...

论文学习笔记6:Relation-Aware Heterogeneous Graph Neural Network for Fraud Detection
文章目录 Abstract一、Introduction二、Preliminaries2.1Problem Definition2.2Related Works 三、Proposed Method3.1Model Architecture3.2Computation Graph Pre-process3.3Heterogeneous Propagation Abstract 欺诈检测是金融和社交媒体领域的一项重要数据挖掘任务。传统的…...

无人机光电吊舱的技术!!
1. 成像技术 可见光成像:通过高分辨率相机捕捉地面或空中目标的清晰图像,提供直观的视觉信息。 红外热成像:利用红外辐射探测目标的温度分布,实现夜间或恶劣天气条件下的隐蔽目标发现。 多光谱成像:通过不同波段的光…...
C++——判断year是不是闰年。
没注释的源代码 #include <iostream> using namespace std; void Y(int y); int main() { int year; cout<<"请输入一个年份:"; cin>>year; Y(year); return 0; } void Y(int y) { if(((y%40)&&(y%100!0))||(y%…...

31. 三维向量Vector3与模型位置
点模型Points、线模型Line、网格网格模型Mesh等模型对象的父类都是Object3D (opens new window),如果想对这些模型进行旋转、缩放、平移等操作,如何实现,可以查询Threejs文档Object3D (opens new window)对相关属性和方法的介绍。 三维向量Ve…...
C# Action和delegate区别及示例代码
Action和delegate类似但没有返回值 Action和delegate在C#编程语言中有明显的区别,主要体现在它们的定义、用途和特性上。 1. 定义 Delegate:Delegate是C#中用于定义方法签名的类型,它允许将方法作为参数传递,或者将方法赋值给变…...

深度优先搜索: 探索图结构的括号化旅程
深度优先搜索: 探索图结构的括号化旅程 图的括号化结构示例图深度优先搜索的伪代码C语言实现解释运行结果总结在解决图相关问题时,深度优先搜索(DFS)是一种非常有用的算法。DFS 通过递归或使用栈的方式遍历图的节点,尽可能深地搜索每一个分支,然后回溯以搜索其他未访问的节…...

LINUX网络编程:传输层
目录 1.端口号 1.1知名端口号 1.2注意 2.UDP协议 2.1UDP报头的格式 2.2UDP的特点 2.3UDP的缓冲区 1.端口号 端口号的作用标识一个网络中主机的一个进程。 网络之间通信无非就是,发送端和接受端进程之间的通信,所以通过ip地址找到目标主机之后&am…...
PyTorch框架
PyTorch是一个开源的深度学习框架,由Facebook AI Research(FAIR)团队开发,自2017年发布以来,凭借其出色的灵活性、易用性和强大的功能,在深度学习和机器学习领域得到了广泛的应用和认可。以下是对PyTorch框…...
分布式系统实战经验
分布式系统是现代软件架构的核心部分,它通过多个计算节点协同工作来处理大规模数据和请求,提供高可用性、可扩展性和容错能力。在实际开发和运维中,构建分布式系统需要考虑多方面的挑战。以下是一些在分布式系统中的实战经验: 1.…...

软考(中级-软件设计师)(0919)
软考 一、软件设计师-历年考试考点分布情况-上午-计算机与软件工程知识 知识点分数说明比例软件工程基础知识11开发模型、设计原则、测试方法、质量特性、CMM、Pert图、风险管理14.67%面向对象12面向对象基本概念、面向对象分析与设计、UML、常见算法16.00%数据结构与算法10…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...

Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...

基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...

yaml读取写入常见错误 (‘cannot represent an object‘, 117)
错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码: 放弃yaml.dump,又切…...