DMA技术在STM32中优化UART、SPI和I2C通信性能的研究与实现

DMA(Direct Memory Access,直接存储器访问)技术可以在STM32微控制器上优化UART、SPI和I2C等通信性能。DMA可以实现数据的高速传输,减轻CPU的负担,提高系统性能。在本篇文章中,我将探讨DMA技术在STM32中优化这些通信协议的研究和实现。

一、DMA工作原理

DMA可以实现外设与存储器之间的直接数据传输,不需要CPU的干预。DMA控制器位于片内,独立于CPU,可以直接访问片外存储器,以及与UART、SPI和I2C等外设进行数据交换。

DMA工作的基本原理如下:
1. CPU配置DMA的控制寄存器,包括源地址、目的地址、传输长度和传输模式等。
2. 当满足触发条件时,DMA控制器开始进行数据传输。
3. DMA控制器从源地址读取数据,然后将数据传输到目的地址。
4. 数据传输完成后,DMA控制器产生中断或通知CPU。

通过使用DMA技术,外设与存储器之间的数据传输可以在不干扰CPU的情况下进行,从而提高系统性能。

二、DMA在STM32中的应用

1. UART通信中的DMA
在UART通信中,使用DMA技术可以高效地完成数据的发送和接收操作。

```c
#include "stm32f4xx.h"void UART_DMA_Init() {// 使能UART时钟和DMA时钟RCC->APB2ENR |= RCC_APB2ENR_USART1EN;RCC->AHB1ENR |= RCC_AHB1ENR_DMA2EN;// 配置UART和GPIO引脚// 配置UART的DMA模式和相关寄存器USART1->CR3 |= USART_CR3_DMAT | USART_CR3_DMAR; // 使能DMA发送和接收DMA2_Stream7->CR |= DMA_SxCR_DIR_0; // 设置DMA为内存到外设模式// 配置DMA传输相关寄存器和缓冲区DMA2_Stream7->PAR = (uint32_t)(&(USART1->DR)); // 外设地址为UART数据寄存器DMA2_Stream7->M0AR = (uint32_t)buffer; // 内存地址为数据缓冲区地址DMA2_Stream7->NDTR = sizeof(buffer); // 传输长度// 配置DMA传输模式、优先级等DMA2_Stream7->CR |= DMA_SxCR_MINC | DMA_SxCR_PINC; // 允许内存和外设地址自动增加DMA2_Stream7->CR |= DMA_SxCR_TCIE; // 使能传输完成中断// 使能DMA传输DMA2_Stream7->CR |= DMA_SxCR_EN;
}void DMA2_Stream7_IRQHandler() {if (DMA2->HISR & DMA_HISR_TCIF7) {// 数据传输完成// 清除标志位DMA2->HIFCR |= DMA_HIFCR_CTCIF7;}
}int main() {UART_DMA_Init();while (1) {// 向缓冲区写入数据// ...// 发起DMA传输DMA2_Stream7->CR |= DMA_SxCR_EN; // 手动启动DMA传输}
}
```

2. SPI通信中的DMA
在SPI通信中,DMA技术可以实现数据的高速传输、减少CPU的占用以及降低通信延迟。

```c
#include "stm32f4xx.h"void SPI_DMA_Init() {// 使能SPI时钟和DMA时钟RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;RCC->AHB1ENR |= RCC_AHB1ENR_DMA2EN;// 配置SPI和GPIO引脚// 配置SPI的DMA模式和相关寄存器SPI1->CR2 |= SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN; // 使能DMA发送和接收DMA2_Stream3->CR |= DMA_SxCR_DIR_0; // 设置DMA为内存到外设模式// 配置DMA传输相关寄存器和缓冲区DMA2_Stream3->PAR = (uint32_t)(&(SPI1->DR)); // 外设地址为SPI数据寄存器DMA2_Stream3->M0AR = (uint32_t)txBuffer; // 内存地址为发送数据缓冲区地址DMA2_Stream3->NDTR = sizeof(txBuffer); // 传输长度DMA2_Stream2->PAR = (uint32_t)(&(SPI1->DR)); // 外设地址为SPI数据寄存器DMA2_Stream2->M0AR = (uint32_t)rxBuffer; // 内存地址为接收数据缓冲区地址DMA2_Stream2->NDTR = sizeof(rxBuffer); // 传输长度// 配置DMA传输模式、优先级等DMA2_Stream3->CR |= DMA_SxCR_MINC; // 允许内存地址自动增加DMA2_Stream2->CR |= DMA_SxCR_MINC | DMA_SxCR_PL_1; // 允许内存地址自动增加,设置高优先级// 使能DMA传输DMA2_Stream3->CR |= DMA_SxCR_EN;DMA2_Stream2->CR |= DMA_SxCR_EN;
}void DMA2_Stream3_IRQHandler() {if (DMA2->LISR & DMA_LISR_TCIF3) {// 数据传输完成// 清除标志位DMA2->LIFCR |= DMA_LIFCR_CTCIF3;}
}void DMA2_Stream2_IRQHandler() {if (DMA2->LISR & DMA_LISR_TCIF2) {// 数据传输完成// 清除标志位DMA2->LIFCR |= DMA_LIFCR_CTCIF2;}
}int main() {SPI_DMA_Init();while (1) {// 向发送缓冲区写入数据// ...// 发起SPI的DMA发送DMA2_Stream3->CR |= DMA_SxCR_EN; // 手动启动DMA发送}
}
```

3. I2C通信中的DMA
在I2C通信中,DMA技术可以实现数据的高速传输、减少CPU的占用以及提高通信的稳定性。

```c
#include "stm32f4xx.h"void I2C_DMA_Init() {// 使能I2C时钟和DMA时钟RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;RCC->AHB1ENR |= RCC_AHB1ENR_DMA1EN;// 配置I2C和GPIO引脚// 配置I2C的DMA模式和相关寄存器I2C1->CR2 |= I2C_CR2_DMAEN; // 使能DMADMA1_Stream6->CR |= DMA_SxCR_DIR_1; // 设置DMA为外设到内存模式// 配置DMA传输相关寄存器和缓冲区DMA1_Stream6->PAR = (uint32_t)(&(I2C1->DR)); // 外设地址为I2C数据寄存器DMA1_Stream6->M0AR = (uint32_t)rxBuffer; // 内存地址为接收数据缓冲区地址DMA1_Stream6->NDTR = sizeof(rxBuffer); // 传输长度// 配置DMA传输模式、优先级等DMA1_Stream6->CR |= DMA_SxCR_MINC | DMA_SxCR_PL_1; // 允许内存地址自动增加,设置高优先级// 使能DMA传输DMA1_Stream6->CR |= DMA_SxCR_EN;
}void DMA1_Stream6_IRQHandler() {if (DMA1->HISR & DMA_HISR_TCIF6) {// 数据传输完成// 清除标志位DMA1->HIFCR |= DMA_HIFCR_CTCIF6;}
}int main() {I2C_DMA_Init();while (1) {// 向I2C发送数据// ...// 发起I2C的DMA发送DMA1_Stream6->CR |= DMA_SxCR_EN; // 手动启动DMA发送}
}
```

三、总结
DMA技术在STM32上的应用可以显著提高UART、SPI和I2C等通信协议的性能和效率,减轻CPU的负担,提高系统的稳定性。
通过上述代码示例,可以实现UART、SPI和I2C的DMA传输。在实际应用中,需要根据具体需求和外设功能进行配置,以实现最佳的性能和稳定性。

✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

代码获取、问题探讨及文章转载可私信。

 ☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇

点击领取更多详细资料

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

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

相关文章

【计算机组成原理】

【第一章】计算机系统概述 【第二章】进程管理

RDMA编程实践-SEND-RECEICVE原语应用

RDMA编程实践 本文描述了RDMA编程过程中的SEND-RECEIVE双边原语的代码实现。包含多个版本,1、client向server发送消息,server回复client收到消息(ACK),然后两边断开连接。2、server端循环等待客户端建立连接,client发送一次消息后…

Javaweb之SpringBootWeb案例员工管理之删除员工的详细解析

3.3 删除员工 查询员完成之后,我们继续开发新的功能:删除员工。 3.3.1 需求 当我们勾选列表前面的复选框,然后点击 "批量删除" 按钮,就可以将这一批次的员工信息删除掉了。也可以只勾选一个复选框,仅删除一…

超详细的 pytest 钩子函数 —— 之初始钩子和引导钩子来啦!

前几篇文章介绍了 pytest 点的基本使用,学完前面几篇的内容基本上就可以满足工作中编写用例和进行自动化测试的需求。从这篇文章开始会陆续给大家介绍 pytest 中的钩子函数,插件开发等等。 仔细去看过 pytest 文档的小伙伴,应该都有发现 pyt…

PSP - 提取 UniRef 数据库搜索的 MSA 序列物种 (Species) 信息

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/135702185 UniRef库:UniProt参考聚类(UniRef)的简称,提供了从UniProt知识库(包括异构体…

[力扣 Hot100]Day7 接雨水

题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 出处 思路 就是寻找“凹”形区间,找使得左右两端点为最大的两个值的最长区间。这里我分了两种情况,右边大于等于左边…

MySQL深度分页优化问题

☆* o(≧▽≦)o *☆嗨~我是小奥🍹 📄📄📄个人博客:小奥的博客 📄📄📄CSDN:个人CSDN 📙📙📙Github:传送门 📅&a…

RenderDoc 增加 DXBC to HLSL 的 shader viewer

目的 便于后续抓帧出来的 DXBC 转为 HLSL,提高可读性 原因 编写的原因,因为按照网上的大佬的BLOG,发现某个 etnlGD/HLSLDecompiler 上的工具使用上是有问题的 (有可能是以前的 render doc 版本没有问题,而我现在是在…

KubeSphere平台使用

KubeSphere官网地址:https://kubesphere.io/zh/ KubeKey一键部署K8S集群:https://kubesphere.io/zh/docs/v3.4/installing-on-linux/introduction/multioverview/ 一台master node(初始化主节点)、两台 work node( joi…

SCI好看的配图-汇总

文章目录 图源:Sustainable Cities and Society【期刊】条形图2热力图-地图 图源:Sustainable Cities and Society【期刊】 引自:A machine learning-driven spatio-temporal vulnerability appraisal based on socio-economic data for COV…

如何编写一个好的测试用例?才能防止背黑锅

如何编写一个好的测试用例?才能防止背黑锅 什么是测试用例?一个好的测试用例包含什么?测试用例的编写思路总结 什么是测试用例? 在这之前,思考一个问题,下面这个简单的QQ登录页面,一共又多少条…

关于运维·关于Zabbix监控平台的面试点

目录 引言:明人不说暗话,今天分享几个在面试的时候常被问到关于Zabbix监控平台的面试点 1、zabbix的优点 2、zabbix的缺点 3、zabbix的监控模式 4、zabbix自定义监控怎么做 5、zabbix的自动发现功能 6、zabbix分布式监控有什么特点 引言&#xff1…

专业130+总分380+哈尔滨工程大学810信号与系统考研经验水声电子信息与通信

今年专业课810信号与系统130,总分380顺利考上哈尔滨工程大学,一年的努力终于换来最后的录取,期中复习有得有失,以下总结一下自己的复习经历,希望对大家有帮助,天道酬勤,加油!专业课&…

入门设计者不容错过!5款网页原型设计工具推荐!

即时设计 即时设计是一种支持团队合作的原型设计工具,不限于设备和人群的使用,浏览器可以打开和使用。在即时设计中,您可以从0到1创建一个Web页面原型,具有钢笔、矩形、矢量编辑、轮廓、文本、色彩填充等设计功能,足以…

达梦数据库入门语法:从基础到进阶的指南

目录 博客前言: 达梦数据库语法介绍 一.创建表空间 1.图形化创建 2.语法创建 ​编辑​编辑 3.修改表空间参数 图形化修改 ​编辑​编辑 语法修改 4.设置加密算法、密码 二.创建用户 1.图形化 2.sql执行 ​编辑 3.授予权限 授予用户 DBA 权限 授予用户…

三、RHCE--时间服务器

三、RHCE--时间服务器 一、简介二、软件安装三、配置时间服务器客户端四、配置时间服务器服务端五、示例: 一、简介 NTP 是网络时间协议(Network Time Protocol)的简称,通过 udp 123 端口进行网络时钟同步。 Chrony是一个开源自由…

k8s---ingress对外服务(traefik)

目录 ingress的证书访问 traefik traefik的部署方式: deamonset deployment nginx-ingress与traefix-ingress相比较 nginx-ingress-controller ui访问 deployment部署 ingress的证书访问 ingress实现https代理访问: 需要证书和密钥 创建证书 密钥 secre…

将 SQL Server 2022 数据库备份到 MinIO

Microsoft 在将 S3 连接器和 Polybase 添加到 SQL Server 2022 时取得了重大飞跃。因此,企业可以利用他们保存到对象存储中的大量数据,并使用它来丰富 SQL Server 表。他们还可以利用对象存储来备份 SQL Server,这是开放性和云原生灵活性的又…

UE4 添加按键输入事件 并在蓝图中使用按键输入节点

绑定按键 选择Edit/ProjectSettings/Engine/Input 在bindings中可以选择添加ActionMappings或则AxisMappings ActionMappings:按键事件,有按下和抬起两个事件,需要分别用两个键触发AxisMappings:输入事件,返回值为float,对于键盘…

每日OJ题_算法_滑动窗口⑤_力扣904水果成篮

目录 力扣904. 水果成篮 解析及代码1(使用容器) 解析及代码2(开数组) 力扣904. 水果成篮 904. 水果成篮 - 力扣(LeetCode) 难度 中等 你正在探访一家农场,农场从左到右种植了一排果树。这…