stm32f105 i2c如何初始化?
时间: 2023-05-29 13:05:58 浏览: 143
以下是STM32F105 I2C初始化的步骤:
1. 配置GPIO:I2C通信需要两个GPIO引脚,一个是SCL(时钟线),另一个是SDA(数据线)。需要将这两个引脚配置为复用推挽输出模式。
2. 配置时钟:I2C时钟频率需要被配置为适合外设的速率。可以通过设置APB1时钟频率(通常为CPU时钟的一半)和I2C时钟分频来实现。
3. 配置I2C:需要配置I2C的寄存器,包括CR1、CR2、CCR和TRISE。这些寄存器的设置取决于I2C的速率、时钟频率和外设的要求。
4. 使能I2C:在所有设置都完成后,需要使能I2C外设才能开始通信。
下面是一个简单的初始化I2C的示例代码:
```
// GPIO配置
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7; // SCL和SDA引脚
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 复用推挽输出模式
GPIO_InitStruct.Pull = GPIO_PULLUP; // 上拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // 高速
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); // 初始化GPIO
// 时钟配置
__HAL_RCC_I2C1_CLK_ENABLE(); // 使能I2C1时钟
RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit;
RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_I2C1;
RCC_PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_PCLK1; // PCLK1时钟作为I2C1时钟
HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit); // 配置时钟
// I2C配置
I2C_HandleTypeDef hi2c1;
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000; // 时钟频率为100kHz
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; // 50%占空比
hi2c1.Init.OwnAddress1 = 0x00; // 从设备地址为0
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; // 7位地址模式
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; // 禁用双地址模式
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; // 禁用广播模式
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; // 禁用时钟拉伸
if (HAL_I2C_Init(&hi2c1) != HAL_OK) { // 初始化I2C
// 初始化失败
}
// 使能I2C
__HAL_I2C_ENABLE(&hi2c1);
```