stm32 I2C_TypeDef
时间: 2024-08-15 18:02:15 浏览: 106
STM32 I2C_TypeDef是一个结构体别名,通常在STM32微控制器的I2C(Inter-Integrated Circuit,即串行总线)驱动库中使用。它代表了I2C控制器的数据类型,用于配置、初始化和管理I2C通信。通过这个枚举类型,开发者可以访问I2C的不同功能寄存器,比如通用控制寄存器(GPIO端口配置)、数据寄存器等,来进行发送和接收数据操作,以及设置设备地址、速度和其他I2C特性。
例如,在编写STM32的I2C驱动程序时,可能会看到类似这样的声明:
```c
I2C_HandleTypeDef hi2c; // 定义一个I2C handle结构,其中hi2c.Instance就是I2C_TypeDef类型的实例
```
这里的`Instance`通常是I2C控制器的具体名称,如`I2C1`, `I2C2`等。
相关问题
I2C_TypeDef I2C_InitStructure的成员变量都有什么
### 关于 `I2C_TypeDef` 结构体及其初始化配置
在 STM32 的硬件抽象层 (HAL) 库中,`I2C_TypeDef` 是用于定义 I2C 接口寄存器映射的结构体。此结构体包含了控制和状态寄存器,这些寄存器允许开发者通过软件访问并操作 I2C 总线上的设备。
#### 成员变量列表
以下是 `I2C_TypeDef` 中的主要成员变量:
- **CR1**: 控制寄存器 1,包含启动条件、停止条件以及应答模式等位。
- **CR2**: 控制寄存器 2,设置频率、地址长度和其他高级特性。
- **OAR1**: 自己的地址寄存器 1,存储主/从机自己的第一个七位或十位地址。
- **OAR2**: 自己的地址寄存器 2,当启用双寻址功能时使用。
- **DR**: 数据移位寄存器,读写数据缓冲区。
- **SR1**: 状态寄存器 1,报告各种事件标志的状态。
- **SR2**: 状态寄存器 2,提供额外的状态信息。
- **CCR**: 配置计数器重载寄存器,设定 SCL 时钟周期。
- **TRISE**: 上升时间寄存器,规定最大上升时间为 tRise[^1].
对于具体的初始化参数,则通常由另一个结构体 `I2C_InitTypeDef` 来指定,它包括但不限于以下几个重要字段:
- **Timing**: 定义了 I2C 通信的速度及时序参数。
- **OwnAddress1**: 设置本机作为从设备时使用的唯一地址。
- **AddressingMode**: 设定地址模式(7-bit 或者 10-bit 地址)。
- **DualAddressMode**: 启用双重地址匹配机制。
- **GeneralCallMode**: 是否响应广播呼叫。
- **NoStretchMode**: 不拉伸 SCL 信号选项。
为了初始化一个 I2C 实例,一般会调用如下形式的 API 函数:
```c
void MX_I2C1_Init(void)
{
hi2c1.Instance = I2C1;
hi2c1.Init.Timing = 0x20909CEC;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c1) != HAL_OK)
{
Error_Handler();
}
}
```
这段代码展示了如何利用上述提到的各种属性来完成一次典型的 I2C 外设实例化过程[^2]。
解释这段代码怎么实现I2C发送的void I2C_SendBytes(I2C_TypeDef *I2Cx, uint8_t *Src, uint32_t len) { DMA_TypeDef *DMAx; _ASSERT(IS_I2C(I2Cx)); _ASSERT(len < 0xfffff); I2Cx->CTRL2.bit.RESTART = I2C_WRITE_FUNC; DMAx = (DMA_TypeDef *)((uint32_t)I2Cx - sizeof(DMA_TypeDef)); DMAx->SRC_ADDR.reg = (uint32_t)Src; DMAx->LEN_LOW.bit.TX_LEN_L = len & 0xffff; DMAx->CTRL.bit.TX_LEN_H = len >> 16; DMAx->LEN_LOW.bit.RX_LEN_L = 0; DMAx->CTRL.bit.RX_LEN_H = 0; DMAx->CTRL.bit.START = 1; while (DMAx->STATUS.bit.DONE != 1); }
这段代码实现了使用DMA进行I2C发送。具体实现步骤如下:
1. 首先进行了一些断言判断,确保传入的I2C和数据长度符合要求。
2. 将I2C的CTRL2寄存器中的RESTART位设置为I2C_WRITE_FUNC,表示接下来要进行I2C写操作。
3. 通过I2Cx指针计算出DMAx指针,因为在STM32系列中,I2C和DMA的寄存器是相邻的,所以可以通过这种方式计算出DMA的寄存器地址。
4. 通过DMAx指针设置DMA的源地址为Src,即要发送的数据缓存区地址。
5. 设置DMA的传输长度为len,即要发送的数据长度。
通过以上步骤,就可以使用DMA进行I2C发送了。这种方法相对于软件方式来说,可以大大提高数据传输的效率和可靠性,特别是在需要大量数据传输的场合下,可以有效减少CPU的占用率。
阅读全文