stm32 h5 串口采用DMA循环BUFF接收数据
当使用STM32H5系列的MCU进行串口(USART)通信,并希望使用DMA(Direct Memory Access)进行循环缓冲区(Circular Buffer)接收数据时,你需要进行以下配置步骤:
-
初始化串口(USART)
- 设置串口波特率、数据位、停止位和校验位。
- 使能串口接收中断(虽然DMA传输不需要CPU中断处理,但可能需要中断来检测DMA传输完成或其他状态)。
- 配置串口DMA接收。
-
配置DMA
- 初始化DMA句柄。
- 设置DMA通道,对于USART通常是固定的(比如USART1_RX通常使用DMA2的某个通道)。
- 设置DMA传输方向为内存到内存(实际上是从USART接收数据到内存),但这是DMA的一种抽象,实际上是从外设(USART)到内存。
- 配置DMA为循环模式(Circular Mode),这样当缓冲区满时,DMA会自动回到缓冲区的起始地址继续接收数据。
- 设置DMA优先级和其他相关参数。
-
配置循环缓冲区
- 定义一个循环缓冲区结构体,包含起始地址、大小、读/写指针等。
- 初始化循环缓冲区。
-
启动DMA传输
- 启动DMA传输,将USART接收的数据传输到循环缓冲区。
// 假设你已经定义了循环缓冲区的结构体和变量
typedef struct { uint8_t *buffer; uint16_t size; volatile uint16_t head; // 读指针 volatile uint16_t tail; // 写指针 // ... 其他可能的成员变量
} CircularBuffer_t; CircularBuffer_t rxBuffer = { /* 初始化缓冲区 */ }; // USART和DMA的初始化函数
void USART_DMA_Init(void) { // 1. 初始化USART(配置GPIO、波特率、数据格式等) MX_USART_UART_Init(); // 假设你有一个这样的函数来初始化USART // 2. 初始化DMA // 假设你使用HAL库,并且USART1的RX DMA通道是DMA2的某个通道 // 这里只是伪代码,你需要根据STM32H5的参考手册和HAL库文档来配置DMA DMA_HandleTypeDef hdma_usart1_rx; hdma_usart1_rx.Instance = DMA2_ChannelX; // X是USART1 RX对应的DMA通道号 hdma_usart1_rx.Init.Direction = DMA_MEMORY_TO_MEMORY; // 实际上是从USART到内存 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_CIRCULAR; // 循环模式 hdma_usart1_rx.Init.Priority = DMA_PRIORITY_LOW; hdma_usart1_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; // ... 其他配置 HAL_DMA_Init(&hdma_usart1_rx); // 将DMA与USART关联起来 __HAL_LINKDMA(&huart1, hdmarx, hdma_usart1_rx); // huart1是USART句柄 // 配置USART的DMA接收 HAL_UART_Receive_DMA(&huart1, rxBuffer.buffer, rxBuffer.size); // 3. 启动DMA传输(这一步通常在HAL_UART_Receive_DMA中完成) // HAL_DMA_Start_IT(&hdma_usart1_rx, (uint32_t)&huart1.Instance->DR, (uint32_t)rxBuffer.buffer, rxBuffer.size); // ... 其他可能的配置和使能中断等
} // ... 其他处理函数,如中断服务例程(ISR)来处理DMA完成或其他事件
以下是一个详细的配置实例,结合了参考文章中的信息并进行了适当的调整和补充:
1. STM32CubeMX配置
-
选择单片机型号:在STM32CubeMX中选择你使用的STM32H5系列单片机型号。
-
配置时钟:设置适当的系统时钟。
-
配置USART:
- 选择USART通道(例如USART1)。
- 配置波特率、数据位、停止位和校验位。
- 启用USART接收(RX)功能,并设置为循环模式(如果有这个选项)。
- 关联USART的RX引脚到对应的GPIO引脚。
-
配置DMA:
- 在DMA配置中选择与USART RX关联的DMA通道(例如DMA2的某个通道)。
- 设置DMA传输方向为从外设(USART)到内存。
- 设置DMA模式为循环模式(Circular Mode)。
- 设置数据宽度、优先级和其他相关参数。
UART_HandleTypeDef huart1; // 假设使用USART1 void MX_USART_UART_Init(void)
{ // 初始化USART结构体 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) { // 初始化错误处理 }
}
DMA_HandleTypeDef hdma_usart1_rx; void MX_DMA_Init(void)
{ __HAL_RCC_DMA2_CLK_ENABLE(); // 使能DMA2时钟 hdma_usart1_rx.Instance = DMA2_ChannelX; // 替换X为USART1 RX对应的DMA通道号 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_CIRCULAR; // 循环模式 hdma_usart1_rx.Init.Priority = DMA_PRIORITY_LOW; // 优先级 hdma_usart1_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; // FIFO模式禁用 hdma_usart1_rx.Init.MemBurst = DMA_MBURST_INC4; // 存储器突发传输 hdma_usart1_rx.Init.PeriphBurst = DMA_PBURST_SINGLE; // 外设突发传输 if (HAL_DMA_Init(&hdma_usart1_rx) != HAL_OK) { // DMA初始化错误处理 } // 关联USART和DMA __HAL_LINKDMA(&huart1, hdmarx, hdma_usart1_rx); // 配置USART的DMA接收 HAL_UART_Receive_DMA(&huart1, rxBuffer, BUFFER_SIZE); // 假设rxBuffer是已定义的接收缓冲区,BUFFER_SIZE是缓冲区大小
}
相关文章:
stm32 h5 串口采用DMA循环BUFF接收数据
当使用STM32H5系列的MCU进行串口(USART)通信,并希望使用DMA(Direct Memory Access)进行循环缓冲区(Circular Buffer)接收数据时,你需要进行以下配置步骤: 初始化串口&…...
海外媒体通稿:9个极具创意的旅游业媒体推广案例分享-华媒舍
如今,旅游业正迅速发展,媒体推广成为吸引游客的关键。为了更好地展示旅游目的地,许多创意而富有创新的媒体推广策略应运而生。本文将介绍九个极富创意的旅游业媒体推广案例,为广大从业者带来灵感和借鉴。 1. 视频系列:…...
接口自动化框架封装思想建立(全)
httprunner框架(上) 一、什么是Httprunner? 1.httprunner是一个面向http协议的通用测试框架,以前比较流行的是2.X版本。 2.他的思想是只需要维护yaml/json文件就可以实现接口自动化测试,性能测试,线上监…...
char [] 赋新值
在C语言中,字符数组(char [])的值可以通过多种方式进行赋值。以下是一些常见的方法: 1、直接初始化: char str[50] "Hello, World!";2、使用strcpy()函数: char str[50]; strcpy(str, "…...
matlab计算图像信噪比SNR
直接上源码: close all clear all clc% 读取图像 I = imread(lena.bmp);I = rgb2gray(I); J =imnoise(I, salt & pepper, 0.001);...
DP读书:如何使用badge?(开源项目下的标咋用)
最近在冲论坛,很少更一些内容了。但遇到了一个真的有趣的: 开源项目下,蓝蓝绿绿的标是怎么用的呢? 这是我的主页Readme,在看一些NXP的主仓时,突然发现没有这个玩,就自己整了个 再比如我的CSDN专…...
使用JavaScript实现网页通知功能
如何使用js来实现网页通知功能。即使在用户浏览其他页面时,也能向他们推送通知信息。 废话不多说直接上代码 function showAutoNotification() {if ("Notification" in window) {Notification.requestPermission().then(function(permission) {if (permis…...
前端--导出
这边记录我们公司后端做的导出接口和前端是如何对接的 这边的技术栈是: 1: react 2: fetch 第一步:简单封装--导出界面 import { DrawerForm } from ant-design/pro-components; import { CloseOutlined } f…...
【数据库系统概论】触发器
【数据库系统概论】触发器 概述 在数据库系统中,触发器(Trigger)是一种特殊的存储过程,当特定事件在数据库表上发生时,会自动执行。触发器主要用于确保数据的完整性、一致性和实现复杂的业务规则。触发器是由用户定义…...
小白跟做江科大32单片机之按键控制LED
原理部分 1.LED部分使用的是这样的连接方式 2.传感器模块的电路图 滤波电容如果接地,一般用于滤波,在分析电路时就不用考虑。下面这个电路就是看A端和B端哪端的拉力大,就能把电压值对应到相应的电压值 比较器部分 如果A端电压>B端电压&am…...
每天写java到期末考试(6.6)-java文件输入输出流实验
1、用字节流读写二进制文件 要求:用DataOutputStreamFileOutputStream类将1,2,…,100,这100个数字写入到文件 d:\out1.bin里,然后再用DatalnputStreamFilelnputStream类将d:\out1.bin的内读出来,并输出到屏幕上。 用DataOutputStreamFileOutputStream写入二进制数据时,直接调…...
Word2021中的The Mathtype DLL cannot be found问题解决(office 16+mathtype7+非初次安装)
问题描述,我的问题发生在word中无法使用自定义功能区中的mathtype 我的环境是:W11Word2021mathtype7 因为我是第二次安装mathtype7,所以我怀疑是因为没有卸载干净,于是我参考了下面这篇文章的做法 参考文章 1.首先重新卸载当前的…...
【Android面试八股文】在Java中传参数时是将值进行传递,还是传递引用?
在Java中传参数时是将值进行传递,还是传递引用? 这道题想考察什么? 是否了解什么是值传递和引用传递与真实场景使用,是否熟悉什么是值传递和引用传递在工作中的表现是什么? 考察的知识点 什么是值传递和引用传递的概念,两者对开发中编写的代码的影响 考生应该如何回…...
神经网络 torch.nn---Linear Layers(nn.Linear)
torch.nn - PyTorch中文文档 (pytorch-cn.readthedocs.io) torch.nn — PyTorch 2.3 documentation nn.Linear torch.nn.Linear(in_features, out_features, biasTrue, deviceNone, dtypeNone) 参数: in_features - 每个输入样本的大小out_features - 每个输出…...
PPT视频如何16倍速或者加速播放
有两种方式,一种是修改PPT本身,这种方式非常繁琐,不太推荐,还有一种就是修改视频本身,直接让视频是16倍速的视频即可。 如何让视频16倍速,我建议人生苦短,我用Python,几行代码&…...
【ai】DeepStream 简介
NVIDIA Metropolis 平台。 NVIDIA 大都会 利用视觉 AI 将来自数万亿物联网设备的数据转化为有价值的见解。 NVIDIA Metropolis 是一个应用程序框架、一套开发工具和合作伙伴生态系统,它将视觉数据和 AI 结合在一起,以提高各行各业的运营效率和安全性。它有助于理解数万亿个…...
如何学习使用淘宝API?淘宝API运营场景
学习使用淘宝API涉及对其功能、分类、调用方法及实际应用的综合理解。下面按部分详细解释如何系统地学习和掌握淘宝API的使用: 淘宝API接口入门 了解淘宝开放平台:淘宝开放平台为开发者提供了一个可以与淘宝数据进行交互的平台,涵盖了丰富的A…...
Java 面试题:Java 的动态代理是基于什么原理?
编程语言通常有各种不同的分类角度,动态类型和静态类型就是其中一种分类角度,简单区分就是语言类型信息是在运行时检查,还是编译期检查。 与其近似的还有一个对比,就是所谓强类型和弱类型,就是不同类型变量赋值时&…...
Python logging 模块详解
Python 的 logging 模块提供了一个强大而灵活的日志系统。它是 Python 标准库的一部分,因此可以在任何 Python 程序中使用。logging 模块提供了许多有用的功能,包括日志消息的级别设置、日志消息的格式设置、将日志消息输出到不同的目标,以及…...
http://account.battlenet.com.cn
http://account.battlenet.com.cn 魔兽战网 短信验证 查了下,我老早以前账号还在,纪念下,少玩游戏。...
别再手动写JSON Schema了!用智谱AI/DeepSeek的FunctionCall,5分钟搞定天气查询API对接
告别JSON Schema手写时代:用大模型FunctionCall极速对接天气API 开发聊天机器人时,最头疼的莫过于为每个新功能手动编写JSON Schema。上周我接手一个天气查询功能需求,原本预计要花半天时间定义参数结构、验证逻辑,结果用智谱AI的…...
L-SHADE算法实战:如何用线性种群缩减提升优化性能(附Python代码)
L-SHADE算法实战:如何用线性种群缩减提升优化性能(附Python代码) 在优化算法的世界里,差分进化(Differential Evolution, DE)一直以其简单高效著称。但传统DE算法在面对高维复杂问题时,常常陷入…...
收藏备用|大模型应用演进3阶段(React/Multi-agent+Spring AI Alibaba实战)
本文详细拆解大模型应用的三大演进阶段,从基础组件构建、工作流编排,到自主Agent落地,重点剖析React模式与Multi-agent模式的核心逻辑及实现原理。结合Spring AI Alibaba框架,手把手演示Java如何快速实现简单Multi-agent框架&…...
ssh远程登录的时候同一个秘钥可以用于多个不同服务器
可以看到:这2台服务器使用了同一个秘钥,现在都可以正常登录:可以看出来第二个云服务器有安全更新没有激活赶快要更新了。...
BilibiliDown:如何轻松搞定B站视频下载与批量管理的完整指南
BilibiliDown:如何轻松搞定B站视频下载与批量管理的完整指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mir…...
【实时场景复原 】实时光照校正方法,可在沙尘、水下及雾霾等退化场景中复原清晰场景研究附Matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…...
用噪音打破听觉恐怖谷:RTE 开发者社区发布 RealNoise™ TTS:全球首个原生合成动态声场的语音大模型
在过去的几年里,语音 AI 行业的内卷方向始终如一:更高的采样率、更低的延迟、更纯净的音质。我们不断训练模型去剔除哪怕最微小的背景杂音,追求实验室级别的完美信噪比(SNR)。 然而,当我们在真实的实时互动…...
用Manim做中文数学微课?先搞定MathTex颜色分染和ctex包配置(保姆级教程)
Manim中文数学微课实战:从零实现公式染色与中文混排 当你在B站刷到那些将复杂数学公式演绎成动画的艺术品时,是否好奇过它们是如何制作的?作为教育视频创作者,我最初被Manim的数学可视化能力吸引,却在尝试制作中文微课…...
从‘发快递’到‘收快递’:手把手拆解RocketMQ 5.x中Group、Topic、Queue的实战配置与避坑指南
从‘发快递’到‘收快递’:手把手拆解RocketMQ 5.x中Group、Topic、Queue的实战配置与避坑指南 想象一下你正在搭建一个电商系统,订单创建后需要实时通知库存服务扣减库存、支付服务生成账单、物流服务准备发货。这种异步解耦的场景正是消息队列的用武之…...
芯片设计Signoff前必看!数字后端工程师的5大验证避坑清单(含CTS实战案例)
芯片设计Signoff前必看!数字后端工程师的5大验证避坑清单(含CTS实战案例) 在数字后端设计的最后冲刺阶段,每个工程师都经历过那种如履薄冰的体验——明明所有检查项都已通过,却在流片前夜发现某个角落的时序违例。这种…...
