STM32中usart使用DMA接受数据

在STM32微控制器中,USART(通用同步异步接收发射器)配合DMA(直接存储器访问)用于接收数据,可以大幅提升数据处理的效率,尤其是在接收大量数据时。通过利用DMA,CPU可以从数据传输过程中解放出来,专注于其他任务。以下是配置USART使用DMA接收数据的步骤:

1. 配置USART

首先,需要对USART进行基本配置,这包括设置波特率、数据位、停止位、奇偶校验等。必须确保USART的接收功能被使能。

2. 配置DMA

选择一个合适的DMA通道与USART接收请求相关联,并对该通道进行配置:

  • 设置DMA传输方向:由外设到内存。
  • 设置外设地址:USART数据寄存器的地址。
  • 设置内存地址:指向用于存储接收到的数据的缓冲区的指针。
  • 设置数据传输量:指定DMA传输的数据量,或者选择循环模式,DMA在达到指定数据量后会自动重新开始。
  • 设置外设和内存的数据宽度:通常为 8 位或 16 位,根据USART配置而定。
  • 配置增量模式:通常配置外设地址固定,内存地址增量

3. 使能DMA接收请求

在USART配置中,需要确保使能了DMA接收请求。这通常涉及到设置USART的相关CR(控制寄存器)中的位。

4. 配置DMA中断(可选)

可以配置DMA以在传输完成时产生中断,从而允许软件立即处理接收到的数据。这包括使能DMA通道的传输完成中断,并在NVIC中配置DMA中断。

5. 启动DMA传

最后,启动DMA传输。这通常通过设置DMA通道的相应控制寄存器启动。

以下是一个配置示例(以串口1 USART1 和 DMA通道 5 为例,具体寄存器请根据实际情况和微控制器参考手册调整)

// USART1 初始化(示例,需要根据实际情况调整)
USART_InitTypeDef USART_InitStruct;
USART_StructInit(&USART_InitStruct);
USART_InitStruct.USART_BaudRate = 9600; // 设置波特率
// 其他配置...
USART_Init(USART1, &USART_InitStruct);
USART_Cmd(USART1, ENABLE);
USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE); // 使能USART1的DMA接收请求// DMA 初始化(以DMA1_Channel5为例)
DMA_InitTypeDef DMA_InitStruct;
DMA_DeInit(DMA1_Channel5);
DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR;
DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)buffer; // buffer 是数据存储区
DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStruct.DMA_BufferSize = sizeof(buffer)/sizeof(buffer[0]);
// 其他配置...
DMA_Init(DMA1_Channel5, &DMA_InitStruct);
DMA_Cmd(DMA1_Channel5, ENABLE); // 启动DMA// 如有必要,配置中断...

如何配置DMA以在传输完成时产生中断?

要配置DMA在传输完成时产生中断,你需要执行以下步骤(假设使用STM32标准库):

1. 配置DMA通道

首先,初始化DMA通道并在初始化结构体中选择合适的参数,包括源和目的地址、数据传输方向、缓冲区大小等。

DMA_InitTypeDef DMA_InitStructure;// 假设为DMA1的Channel1(以STM32F1系列为例)
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(USART1->DR);
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)buffer; // buffer是数据接收的目的缓冲区
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = bufferSize;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; // 或者DMA_Mode_Circular,视情况而定
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);

2. 使能DMA传输完成中断

在DMA通道初始化之后,使能特定的DMA中断。这通常意味着传输完成中断(TC,Transfer Complete)。

DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);

3. 配置NVIC来使能DMA中断

接着,需要配置嵌套向量中断控制器(NVIC),以使能并设置DMA中断的优先级。

NVIC_InitTypeDef NVIC_InitStructure;// 为了使用DMA1_Channel1中断
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; // 预抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; // 响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

4. 实现DMA中断处理程序

在中断处理程序中,你需要检查传输完成标志,并且可能要清除该标志。此外,你可以在这一点上处理数据或者再次启动DMA传输。

void DMA1_Channel1_IRQHandler(void)
{// 检查是否DMA1_Channel1传输完成if(DMA_GetITStatus(DMA1_IT_TC1)){DMA_ClearITPendingBit(DMA1_IT_TC1); // 清除中断标志位// 传输完成,处理数据}
}
  • 对于循环传输模式(DMA_Mode_Circular),请注意处理数据的速度要跟得上DMA传输的速度,避免数据丢失。
  • 中断处理程序名(例如DMA1_Channel1_IRQHandler)是固定的,根据DMA通道而决定,参考相应的微控制器参考手册确定准确的名称。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/9195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

太速科技-FMC377_双AD9361 射频收发模块

FMC377_双AD9361 射频收发模块 FEATURES: ◆ Coverage from 70M ~ 6GHz RF ◆ Flexible rate 12 bit ADC/DAC ◆ Fully-coherent 4x4 MIMO capability, TDD/FDD ◆ RF ports: 50Ω Matched ◆ support both internal reference and exter…

算法人生(17):从“课程学习”到“逐步暴露心理疗法”

课程学习(Curriculum Learning)是一种机器学习里常用的策略,它的灵感来源于人类学习方式:学习从简单的概念开始,逐步过渡到更复杂的问题。它通过模仿教育领域中课程安排的思想,设计了一系列有序的任务或数据…

微信小程序网格布局

效果图 实现 wxml <!-- 订单内容 --><view class"father"><!-- 订单item --><view class"childs" wx:for"{{List}}" wx:key"{{ index }}"></view></view> wxss .father{display: grid;grid-tem…

从零开始打造个性化生鲜微信商城小程序

随着移动互联网的普及&#xff0c;小程序商城已经成为越来越多商家的选择。本文将通过实战案例分享&#xff0c;教您如何在五分钟内快速搭建个性化生鲜小程序商城。 步骤一&#xff1a;登录乔拓云网后台&#xff0c;进入商城管理页面 打开乔拓云官网&#xff0c;点击右上角的“…

Kubernetes学习-集群搭建篇(一) 搭建Master结点

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Kubernetes渐进式学习-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1. 前言 2. 集群搭建方式 3. 环境说明 4. 利用kubeadm初始化Ma…

5月9日作业

1&#xff0c;创建一对父子进程&#xff1a;父进程负责向文件中写入 长方形的长和宽子进程负责读取文件中的长宽信息后&#xff0c;计算长方形的面积。 1 #include <stdio.h> 2 #include <string.h> 3 #include <unistd.h> 4 #include <stdlib.h> 5 #…

Fortinet的安全愿景SASO概述

FTNT SASE的独特方法&#xff0c;使其成为一家适应性极强的厂商&#xff0c;能够应对不断变化的网络和网络安全环境。FTNT开发了一种名为Secure Access Service Omni&#xff08;SASO&#xff09;的变体&#xff0c;以更准确地反映FTNT在融合网络和安全功能方面的实力。我们预计…

【C++】string类的使用②(容量接口Capacity || 元素获取Element access)

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; STL || C 目录 前言&#x1f525;容量接口&#xff08;Capacity&#xff09;size和lengthcapacitymax_sizereserveresizeclearemptyshrink_to_fit &#x1f525;元素获取&#xff08;Ele…

3D 打印为压铸行业的带来新动力

近年来&#xff0c;随着多家车企的积极引领&#xff0c;一体化压铸技术已逐渐成为汽车行业的一大趋势。该技术不仅简化了车身的制造流程&#xff0c;而且优化了供应链环节&#xff0c;成为汽车制造业中的一次创新&#xff0c;同时显著提升了经济效益。 压铸技术&#xff0c;简而…

数据平台—邮件服务

数据平台—邮件服务 数据平台一个比较常见的场景就是将每天的汇总数据通过邮件的形式发送出去,所以我们需要一个比较通用的邮件服务 主要实现的功能是通过提供一段SQL, 将该SQL 获取的数据通过邮件的形式进行发送。主要包含两个模块,第一个是邮件模块,第二个是获取数据模…

【C++】学习笔记——stack和queue

文章目录 九、stack和queue1. stack和queue的介绍2. stack和queue的使用3. stack和queue的模拟实现4. deque的简单了解 未完待续 九、stack和queue 1. stack和queue的介绍 stack 就是我们常说的 栈 &#xff0c;而 queue 就是 队列 。栈就是 后进先出 的数据结构&#xff0c;队…

《大数据分析-数据仓库项目实战》学习笔记

目录 基本概念 数据仓库 数据仓库整体技术架构 数据仓库主题 数据集市 数据仓库的血缘关系 数据仓库元数据管理 数据仓库的指标 数据仓库维度概念 HDFS Flume Hadoop Kafka 数据仓库分层模型 Superset 即席查询 Sqoop Atlas元数据管理 项目需求描述 系统目标…

一天吃透Spring面试八股文

目录&#xff1a; Spring的优点Spring 用到了哪些设计模式&#xff1f;什么是AOP&#xff1f;AOP有哪些实现方式&#xff1f;Spring AOP的实现原理JDK动态代理和CGLIB动态代理的区别&#xff1f;Spring AOP相关术语Spring通知有哪些类型&#xff1f;什么是IOC&#xff1f;IOC的…

贪心算法--将数组和减半的最小操作数

本题是力扣2208---点击跳转题目 思路&#xff1a; 要尽快的把数组和减小&#xff0c;那么每次挑出数组中最大的元素减半即可&#xff0c;由于每次都是找出最值元素&#xff0c;可以用优先队列来存储这些数组元素 每次取出最值&#xff0c;减半后再放入优先队列中&#xff0c;操…

光峰科技2023年营收、净利润均双位数下滑,新一年延续?

近日&#xff0c;深圳光峰科技股份有限公司&#xff08;688007.SH&#xff0c;下称“光峰科技”&#xff09;对外公布了2023年和2024年一季度的经营“成绩单”。 透视财报不难看出&#xff0c;虽然光峰科技在降低成本、提振销售等层面下足了功夫&#xff0c;但受制于市场需求式…

Vue 问题集

Q:MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 connection listeners added. Use emitter.setMaxListeners() to increase limit A: 可能由多个问题导致&#xff0c;我的是情况1 1. vue.config.js - devServer 代理设置只能添加10个&#…

JavaEE >> Spring MVC(1)

MVC MVC&#xff1a;Model View Controller 的缩写&#xff0c;是一种软件架构模式&#xff0c;将软件系统分为模型、视图和控制器三个部分。 Mode&#xff08;模型&#xff09;&#xff1a;是应⽤程序中⽤于处理应⽤程序数据逻辑的部分。通常模型对象负责在数据库中存取数据…

C++类与对象(1)

1&#xff0c;结构体到类过渡 c兼容c语言&#xff0c;结构用法可以继续使用&#xff0c;同时struct也升级成了类。 struct Stack { //成员变量 int* a; int top; int capacity; //成员函数 void Init() { a nullptr; top capacity…

【科普系列】到底什么是语义通信?语义通信跟现有通信有什么区别?

语义通信&#xff1a;信息传输的未来 在探讨什么是语义通信之前&#xff0c;我们先回顾一下传统的通信方式。传统通信&#xff0c;如电话、电视或因特网&#xff0c;主要关注的是如何高效、准确地传输信号或数据。例如&#xff0c;无论是语音通话还是文件传输&#xff0c;传统…

哈希题目总结

以下列举了可以用哈希方法&#xff08;包括但不限于用HashMap和HashSet&#xff09;的题目&#xff0c;实质上是把东西丢给这些数据结构去维护。请注意有些题目中用哈希是最优解&#xff0c;有些题目中不是最优解&#xff0c;可以自行探索其时间复杂度和空间复杂度的区别&#…