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 魔兽战网 短信验证 查了下,我老早以前账号还在,纪念下,少玩游戏。...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
