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 魔兽战网 短信验证 查了下,我老早以前账号还在,纪念下,少玩游戏。...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
