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.hqwc.cn/news/416107.html

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

相关文章

【数据开发】BI数据报表之数据可测试性设计与分析

文章目录 1、什么是BI&数据报表2、什么是可测试性3、数据测试与方法3.1 数据准确性与对比(重要)3.2 数据安全性 1、什么是BI&数据报表 数据报表是一种数据可视化工具 用于将数据以图表、表格和其他可视化形式呈现出来,以便用户可以…

学习响应式编程中遇到的奇奇怪怪的问题

spring项目无法启动 Description: Web application could not be started as there was no org.springframework.boot.web.reactive.server.ReactiveWebServerFactory bean defined in the context. Action: Check your application’s dependencies for a supported react…

Linux的网络文件共享服务之FTP服务

一.存储类型 1.1 存储类型分为三种 直连式存储:Direct-Attached Storage,简称DAS 存储区域网络:Storage Area Network,简称SAN(可以使用空间,管理也是你来管理) 网络附加存储:Net…

【Python_PySide6学习笔记(三十一)】基于PySide6实现自定义串口设备连接界面类:可实现串口连接断开、定时发送等功能

基于PySide6实现自定义串口设备连接界面类:可实现串口连接关闭、定时发送等功能 基于PySide6实现自定义串口设备连接界面类:可实现串口连接关闭、定时发送等功能前言一、界面布局二、串口相关功能实现三、完整代码四、调用方法五、实现效果基于PySide6实现自定义串口设备连接…

十、Three场景实现多个物体的合并

Three场景实现多个物体的合并 目的 产品需求是让物体的光柱墙包含一个多边形的区域,二而我的多边形只能使用原型,方向,多边形。那么再研究的时候就需要将这些多边形合并成为一个形状,那么就行实现了。 原先的图形 如上图,是两个mesh组成的。首先寻找mesh合并的方法。 第…

算法练习-长度最小的子数组(思路+流程图+代码)

难度参考 难度:简单 分类:数组 难度与分类由我所参与的培训课程提供,但需要注意的是,难度与分类仅供参考。以下内容均为个人笔记,旨在督促自己认真学习。 题目 给定一个含有个正整数的数组和一个正整数s,找…

redisson的延时队列机制简述

概述 业务中经常会遇到一些延迟执行的需求;通常想到的都是rabbitmq或者rocketmq的延迟消息; 但是系统中不一定集成了mq,但为了控制分布式下的并发,一般redis都是有集成的; redis的key过期监听那个时间不准确&#xff…

在 wsl-ubuntu 里通过 docker 启动 gpu-jupyter

在 wsl-ubuntu 里通过 docker 启动 gpu-jupyter 0. 背景1. 安装 docker-ce2. 安装 NVIDIA Container Toolkit3. 使用 nvidia-ctk 命令配置容器运行4. 通过 docker 运行 nvidia-smi5. 运行 gpu-jupyter6. 访问 gpu-jupyter7. 测试 gpu-jupyter 是否可以访问 cuda 0. 背景 今天突…

Mysql详细安装步骤

Linux 安装 MySQL【超详细版】 ​编辑 我叫BuGu    2023-05-11 16:48:10 发布 一、安装 MySQL 的准备工作 1. 查看系统版本 cat /etc/redhat-release2. 查看系统是否已经安装过 MySQL 查看是否安装了 MySQL rpm -qa | grep mysql查看是否有安装 mariadb,该软件与 MySQ…

qt学习:进度条,水平滑动条,垂直滑动条+rgb调试实战

目录 水平滑动条,垂直滑动条 常用信号 进度条 常用信号 修改进度条 例子 rgb调色 配置ui界面 编写3个进度条的事件函数 添加链表容器和按钮索引 在.h里的类定义 初始化链表容器和按钮索引 编写添加颜色的按钮点击事件函数 效果 水平滑动条&#xff0c…

ChatGPT正确打开方式与GPT-4.5的key最新获取方式

前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言4.5key价格泄漏ChatGPT4.0使用地址ChatGPT正确打开方式最新功能语音助手存档…

【REMB 】翻译:草案remb-03

REMB REMB消息 以及 绝对时间戳选项 在带宽估计中的使用 :an absolute-value timestamp option for use in bandwidth estimatoin. 接收方带宽估计的RTCP消息 REMB 这位大神翻译的更好。 RTCP message for Receiver Estimated Maximum Bitrate draft-alvestrand-rmcat-remb-03…