当前位置: 首页 > news >正文

stm32 h5 串口采用DMA循环BUFF接收数据

当使用STM32H5系列的MCU进行串口(USART)通信,并希望使用DMA(Direct Memory Access)进行循环缓冲区(Circular Buffer)接收数据时,你需要进行以下配置步骤:

  1. 初始化串口(USART)

    • 设置串口波特率、数据位、停止位和校验位。
    • 使能串口接收中断(虽然DMA传输不需要CPU中断处理,但可能需要中断来检测DMA传输完成或其他状态)。
    • 配置串口DMA接收。
  2. 配置DMA

    • 初始化DMA句柄。
    • 设置DMA通道,对于USART通常是固定的(比如USART1_RX通常使用DMA2的某个通道)。
    • 设置DMA传输方向为内存到内存(实际上是从USART接收数据到内存),但这是DMA的一种抽象,实际上是从外设(USART)到内存。
    • 配置DMA为循环模式(Circular Mode),这样当缓冲区满时,DMA会自动回到缓冲区的起始地址继续接收数据。
    • 设置DMA优先级和其他相关参数。
  3. 配置循环缓冲区

    • 定义一个循环缓冲区结构体,包含起始地址、大小、读/写指针等。
    • 初始化循环缓冲区。
  4. 启动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配置

  1. 选择单片机型号:在STM32CubeMX中选择你使用的STM32H5系列单片机型号。

  2. 配置时钟:设置适当的系统时钟。

  3. 配置USART

    • 选择USART通道(例如USART1)。
    • 配置波特率、数据位、停止位和校验位。
    • 启用USART接收(RX)功能,并设置为循环模式(如果有这个选项)。
    • 关联USART的RX引脚到对应的GPIO引脚。
  4. 配置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 魔兽战网 短信验证 查了下,我老早以前账号还在,纪念下,少玩游戏。...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

centos 7 部署awstats 网站访问检测

一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...

深度学习习题2

1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)&#xff…...

快刀集(1): 一刀斩断视频片头广告

一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...