【STM32 CubeMX】I2C中断方式与DMA方式

文章目录


前言

在STM32 CubeMX环境中,I2C(Inter-Integrated Circuit)通信协议的实现可以采用中断方式或DMA(Direct Memory Access)方式。中断方式通过触发中断来处理数据传输,而DMA方式则利用直接内存访问技术来实现数据传输,减轻了CPU的负担。在选择I2C通信方式时,开发者需要根据具体的应用需求和性能要求来选择合适的方式。STM32 CubeMX提供了图形化配置工具,使得配置I2C通信方式变得更加便捷。


一、I2C中断方式

1.1 CubeMX配置I2C中断

找到连接,I2C,然后点击NVIC设置,使能中断(框框里面的要打勾):

设置完后,生成代码即可

1.2 I2C中断函数使用

Master模式

我们可以使用下面的函数进行Master模式的中断读写:

c 复制代码
HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, 
uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, 
uint8_t *pData, uint16_t Size);

参数说明:

I2C_HandleTypeDef *hi2c 使用哪个 I2C 控制器

uint16_t DevAddress 设备地址,需要把 7 位地址左移 1 位

uint8_t *pData 数据 buffer

uint16_t Size 数据个数

返回值 HAL_OK:成功

HAL_BUSY:总线忙

这些IT后缀的函数,他只是使能中断,发出Start信号,他会立刻返回

当我们的回调函数调用,代码他传输完成了

回调函数:

如果传输完成或出错,如下回调函数会被调用:

c 复制代码
/* 主设备发送完成回调函数 */
void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c);
/* 主设备接收完成回调函数 */
void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c);
/* 出错回调函数 */
void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c)

Mem模式

可以使用下面的函数进行Mem模式中断的发送:

c 复制代码
HAL_StatusTypeDef HAL_I2C_Mem_Write_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, 
uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Mem_Read_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t 
MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size);

如果传输完成或出错,如下回调函数会被调用:

c 复制代码
/* MEM模式发送完成回调函数 */
void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c);
/* MEM模式接收完成回调函数 */
void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c);
/* 出错回调函数 */
void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c)

1.3 DMA方式发送和接收

CubeMX配置IIC DMA方式

我们打开I2C设置界面,点击DMA设置,添加DMA通道I2C_TX,I2C_RX

Master模式

使用 DMA 方式写 I2C 设备、读 I2C 设备函数原型如下:

c 复制代码
HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, 
uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, 
uint8_t *pData, uint16_t Size);

DMA的中断回调和普通的Master回调函数是一致的。

Mem模式

使用 DMA Mem 方式写 I2C 设备、读 I2C 设备函数原型如下

c 复制代码
HAL_StatusTypeDef HAL_I2C_Mem_Write_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, 
uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, 
uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size);

DMA的中断回调和普通的Mem回调函数是一致的。


总结

在STM32 CubeMX环境中,可以选择中断方式或DMA方式来实现I2C通信,每种方式都有其特点和适用场景。中断方式适用于对实时性要求较高、数据量较小的情况,而DMA方式则适用于大数据量传输和减轻CPU负担的场景。通过STM32 CubeMX提供的图形化配置工具,开发者可以根据具体需求选择合适的通信方式,并进行相应的配置,从而更加高效地实现I2C通信功能。

相关推荐
AA陈超2 小时前
Lyra学习004:GameFeatureData分析
c++·笔记·学习·ue5·虚幻引擎
xlq223222 小时前
22.多态(下)
开发语言·c++·算法
silno2 小时前
图解 STM32 USB CDC虚拟串口 的实现
stm32·单片机·stm32f103c8t6·cdc虚拟串口
不会c嘎嘎3 小时前
【数据结构】AVL树详解:从原理到C++实现
数据结构·c++
Silicore_Emma3 小时前
芯谷科技—D8227 双通道音频功率放大集成电路产品简介与应用推广
单片机·音视频·功率放大器·芯谷科技·便携式音频设备·双通道音频·车载音频系统
唐·柯里昂7983 小时前
野火鲁班猫5使用正点原子 RTL8188EUS Wifi模块驱动移植(Linux5.10 Debian系统) 解决zsh报错
linux·c语言·mcu·物联网·ubuntu·硬件工程·软件构建
AKDreamer_HeXY3 小时前
ABC434E 题解
c++·算法·图论·atcoder
罗湖老棍子3 小时前
完全背包 vs 多重背包的优化逻辑
c++·算法·动态规划·背包
potato_may4 小时前
C++ 发展简史与核心语法入门
开发语言·c++·算法
爱装代码的小瓶子4 小时前
【cpp知识铺子】map和set的前身-二叉搜索树
c++·算法