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.mfbz.cn/a/608547.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springcloud服务间调用 feign 的使用

引入依赖包 <!-- 服务调用feign --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>创建调用外部服务的接口 需要使用的地方注入 使用 启动类增…

CTFHUB-技能树-Web题-RCE(远程代码执行)-eval执行

CTFHUB-技能树-Web题-RCE&#xff08;远程代码执行&#xff09; 文章目录 CTFHUB-技能树-Web题-RCE&#xff08;远程代码执行&#xff09;eval执行解题方法&#xff1a;构造网址&#xff0c;查找当前目录文件并没有发现flag,接着查看上一级目录接着查看上一级接着查看上一级目录…

luceda ipkiss教程 66:金属线的钝角转弯

案例分享&#xff1a;金属线的135度转弯&#xff1a; 所有代码如下&#xff1a; from si_fab import all as pdk import ipkiss3.all as i3 from ipkiss.geometry.shape_modifier import __ShapeModifierAutoOpenClosed__ from numpy import sqrtclass ShapeManhattanStub(__…

一种快速H.264 NALU快速搜索算法

1. 引言 在播放H.264码流的时候,进行NALU的搜索的效率高低影响着系统的性能。有采用普通逐字节搜索的算法,有利用cpu的simd的单指令多数据操作的并行功能进行搜索的算法,今天要介绍的是一个非常简单而且高效的快速搜索算法,而且不需要利用simd指令,搜索的速度甚至快于我之…

Spring-依赖来源

依赖来源 1 Spring BeanDefinition&#xff08;xml,注解&#xff0c;BeanDefinitionBuilder, 还有API实现的单例对象&#xff09; 2 Spring 内建BeanDefinition 3 内建单例对象 依赖注入和依赖查找的区别 Context.refresh() 的时候会调用这个方法&#xff1a;prepareBeanF…

如何通过wifi网络将串口数据发送到多个设备

摘要&#xff1a;当lora电台的速率无法满足高速传输时&#xff0c;可以考虑用“串口服务器”。本文介绍一下如何使用TP-LINK的TL-CPE300D实现一对多的数据发送。 当前也有使用lora电台的&#xff0c;但是lora电台支持的速率有限&#xff0c;可能最大支持到9600&#xff0c;甚至…

[虚拟机+单机]梦幻契约H5修复版_附GM工具

本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人亲自搭建成功的&#xff0c;绝对是完整可运行的&#xff0c;踩过的坑都给你们填上了 视频演示 [虚拟机单…

【电路笔记】-Twin-T振荡器

Twin-T振荡器 文章目录 Twin-T振荡器1、概述2、Twin-T振荡器3、Twin-T放大4、Twin-T 振荡器示例5、总结Twin-T 振荡器是另一种 RC 振荡器电路,它使用两个并联的 RC 网络来产生单一频率的正弦输出波形。 1、概述 Twin-T 振荡器是另一种类型的 RC 振荡器,它产生正弦波输出,用…

PTP 对时协议 IEEE1588 网络对时 硬件基础

前言 在很多应用场景有精确对时的需求&#xff0c;例如车载网络&#xff0c;音视频流&#xff0c;工业网络。本文档将会阐述对时的硬件需求。 协议 流行的协议为 IEEE1588 标准指定的对时方法&#xff0c;名为 PTP 对时协议。 网卡硬件要求 找到某型网卡的特性描述&#x…

Antd Table组件,state改变,但是render并不会重新渲染

背景 在table上面&#xff0c;当鼠标放在cell上面的时候&#xff0c;需要去请求接口拉取数据&#xff0c;然后setList(res.result)后&#xff0c;希望render中的traceIds也能够实时更新渲染。 const [traceIds, setTraceIds] useState() // 需要展示在popover上面的数据&…

基于STM32F401RET6智能锁项目(环境搭建)

工程搭建 MDK&#xff0c;固件库&#xff0c;芯片包下载 下载keil5&#xff0c;stm32f4xx的固件库以及stm32f4的芯片包 keil官网&#xff1a;https://www2.keil.com/mdk5/ stm32中国官网&#xff1a;https://www.stmcu.com.cn/ 创建工程 1、新建一个工程文件夹&#xff0c;…

漫威争锋Marvel Rivals怎么搜索 锁区怎么搜 游戏搜不到怎么办

即将问世的《漫威争锋》&#xff08;Marvel Rivals&#xff09;作为一款万众期待的PvP射击游戏新星&#xff0c;荣耀携手漫威官方网站共同推出。定档5月11日清晨9时&#xff0c;封闭Alpha测试阶段将正式揭开序幕&#xff0c;持续时间长达十天之久。在此首轮测试窗口&#xff0c…

加速科技突破2.7G高速数据接口测试技术

随着显示面板分辨率的不断提升&#xff0c;显示驱动芯片&#xff08;DDIC&#xff09;的数据接口传输速率越来越高&#xff0c;MIPI、LVDS/mLVDS、HDMI等高速数据接口在DDIC上广泛应用。为满足高速数据接口的ATE测试需求&#xff0c;作为国内少数拥有完全自研的LCD Driver测试解…

Facebook消息群发脚本的制作思路!

在数字化社交日益盛行的今天&#xff0c;Facebook作为全球最大的社交平台之一&#xff0c;为企业和个人提供了广阔的交流与合作空间。 然而&#xff0c;手动向大量用户发送消息既耗时又低效&#xff0c;因此&#xff0c;开发一款能够自动群发消息的脚本成为了许多人的需求&…

JavaWeb之Servlet(上)

前言 1. 什么是Servlet (1) Servlet介绍 (2) Servlet运行于支持Java的应用服务器中。 (3) Servlet工作模式&#xff1a; 2. Servlet API 3. 第一个Servlet (1) 创建一个类实现Servlet接口,重写方法。或继承HttpServlet亦可 (2) 在web.xml文档中配置映射关系 标签的执行…

48. UE5 RPG 实现攻击伤害数字显示

在前面的文章中&#xff0c;我们实现了对敌人的攻击的受击效果&#xff0c;并且能够降低目标的血量&#xff0c;实现死亡效果。相对于正常的游戏&#xff0c;我们还需要实现技能或者攻击对敌人造成的伤害数值&#xff0c;并直观的显示出来。 所以&#xff0c;接下来&#xff0c…

电商核心技术揭秘52:数字化内容营销创新

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘相关系列文章合集&#xff08;3&#xff09; 电商技术揭秘四十一&#xff1a;电商平台的营销系统浅析 电商技术揭秘四十二&#…

通过Docker Compose部署GitLab和GitLab Runner(一)

GitLab 是一个用于版本控制、项目管理和持续集成的开源软件平台&#xff0c;它提供了一整套工具&#xff0c;能够帮助团队高效地协作开发。而 GitLab Runner 则是 GitLab CI/CD 的执行者&#xff0c;用于运行持续集成和持续交付任务。 在本文中&#xff0c;我们将使用 Docker …

虚拟机装CentOS镜像

起先&#xff0c;是先安装一个VM虚拟机&#xff0c;再去官方网站之类的下载一些镜像&#xff0c;常见镜像有CentOS镜像&#xff0c;ubantu镜像&#xff0c;好像还有一个树莓还是什么的&#xff0c;软件这块&#xff0c;日新月异&#xff0c;更新太快&#xff0c;好久没碰&#…

C程序内存分布及static变量

C程序内存分布及static变量 C语言中程序的内存分布 [&#x1f517;1](https://www.cnblogs.com/miaoxiong/p/11021827.html)[&#x1f517;2](https://blog.csdn.net/chen1083376511/article/details/54930191)c/c编译连接后二进制文件的存储动静态存储方式和存储区动态存储方式…
最新文章