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

这篇具有很好参考价值的文章主要介绍了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中优化UART、SPI和I2C通信性能的研究与实现,stm32,单片机,嵌入式硬件

二、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; // 使能DMA
  DMA1_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传输。在实际应用中,需要根据具体需求和外设功能进行配置,以实现最佳的性能和稳定性。

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

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

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

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

点击领取更多详细资料文章来源地址https://www.toymoban.com/news/detail-807179.html

到了这里,关于DMA技术在STM32中优化UART、SPI和I2C通信性能的研究与实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32学习笔记(十)丨I2C通信(使用I2C实现MPU6050和STM32之间通信)

    ​  本次课程采用单片机型号为STM32F103C8T6。(鉴于笔者实验时身边只有STM32F103ZET6,故本次实验使基于ZET6进行的) ​  课程链接:江协科技 STM32入门教程   往期笔记链接:   STM32学习笔记(一)丨建立工程丨GPIO 通用输入输出   STM32学习笔记(二)丨STM32程序调试

    2024年01月19日
    浏览(27)
  • STM32——I2C通信

            I2C(Inter IC Bus)是由Philips公司开发的一种通用数据总线,它是两线式串行总线,它具有两根通信线: SCL(Serial Clock)、SDA(Serial Data) ,多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。I2C是同步半双

    2024年01月25日
    浏览(21)
  • 10:STM32------I2C通信

    目录 一:I2C通信协议 1:I2C简历 2:硬件电路 3:I2C时序基本单元 A : 开/ 终条件 2:发送一个字节 3:接收一个字节 4:应答机制  4:I2C时序  1:指定地址写 2:当前地址读 3: 指定地址读 二:MPU6050 1:简历 2:参数 3:硬件电路 4:框图 5:寄存器地址 三:案例 A:软件I2C读写 MPU6050 1:连接图 2:代码 B:硬

    2024年02月20日
    浏览(25)
  • 【【STM32----I2C通信协议】】

    我们会发现I2C有两根通信线: SCL和SDA 同步 半双工 带数据应答 支持总线挂载多设备(一主多从,多主多从) 硬件电路 所有I2C设备的SCL连在一起,SDA连在一起 设备的SCL和SDA均要配置成开漏输出模式 SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右 左边的CPU就是主机,他的权

    2024年02月12日
    浏览(17)
  • STM32硬件I2C通信外设

    本文主要介绍stm32自带的I2C通信外设,对比与软件模拟I2C,硬件I2C可以自动生成时序,时序的操作更加及时规范,可以实现更加高性能的IIC通信。 本文内容与I2C软件通信有诸多类似之处,I2C软件通信可见:https://blog.csdn.net/qq_53922901/article/details/136662006?spm=1001.2014.3001.5501 在8位指

    2024年04月08日
    浏览(59)
  • HAL STM32 HW I2C DMA + SSD1306/SH1106驱动示例

    📍硬件I2C DMA驱动参考: https://blog.csdn.net/weixin_45065888/article/details/118225993 🔖本工程基于 STM32F103VCT6 ,驱动程序独立,可以移植到任意STM32型号上使用。 📑字体大小说明 🌿该驱动程序ASCII字符集类型大小包含:6X8、8X16,12X6 三种。其中6X8和8X16共用一个API函数调用,形参不同

    2024年02月22日
    浏览(23)
  • 【STM32】STM32学习笔记-I2C通信外设(34)

    I2C(Inter-Integrated Circuit)总线 是一种由NXP(原PHILIPS)公司开发的两线式串行总线,用于连接微控制器及其外围设备。多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。 串行的 8 位双向数据传输位速率在标准模式下可

    2024年01月17日
    浏览(26)
  • 【STM32】STM32学习笔记-I2C通信协议(31)

    I2C(Inter-Integrated Circuit)总线 是一种由NXP(原PHILIPS)公司开发的两线式串行总线,用于连接微控制器及其外围设备。多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。 串行的 8 位双向数据传输位速率在标准模式下可

    2024年01月23日
    浏览(26)
  • 【单片机】UART、I2C、SPI、TTL、RS232、RS422、RS485、CAN、USB、SD卡、1-WIRE、Ethernet等常见通信方式

    在单片机开发中,UART、I2C、RS485等普遍在用,这里做一个简单的介绍 UART口指的是一种物理接口形式(硬件)。 UART是异步(指不使用时钟同步,依靠帧长进行判断),全双工(收发可以同时进行)串口总线。它比同步串口复杂很多。有两根线,一根TXD用于发送,一根RXD用于接收

    2024年02月11日
    浏览(18)
  • day9 STM32 I2C总线通信

            I2C(Inter-Integrated Circuit)总线(也称IIC或I2C)是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备,是微电子通信控制领域广泛采用的一种总线标准。         它是同步通信的一种特殊形式,具有接口线少,控制方式简单,期间封装形式少,通

    2024年02月12日
    浏览(19)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包