STM32F103初始化IIC
时间: 2024-08-27 20:02:58 浏览: 55
STM32F103系列微控制器集成有SPI/I2C模块,用于实现I2C通信。初始化I2C通常涉及到配置相关的寄存器以及设置正确的时序。这里以Keil MDK(μVision IDE)为例,使用STM32CubeMX生成的初始化代码作为参考:
首先,在STM32CubeMX中配置好I2C端口,选择合适的I2C参数(例如,I2C1的频率、模式等)。然后,在C代码中执行以下步骤:
```c
#include "stm32f1xx_hal.h"
void i2c1_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct;
// 1. 配置SCL和SDA GPIO
RCC_APB1PeriphClockCmd(RCC_APB1Periph_GPIOB, ENABLE); // 开启GPIOB时钟
GPIO_InitStruct.Pin = GPIO_Pin_6; // SCL引脚
GPIO_InitStruct.Mode = GPIO_Mode_AF_OD; // 输入输出推挽模式
GPIO_InitStruct.Pull = GPIO_NOPULL; // 上拉
GPIO_InitStruct.Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.OType = GPIO_OType_PP; // push-pull
GPIO_InitStruct.Alternate = GPIO_AF10_I2C1; // 功能映射到I2C1
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_Pin_7; // SDA引脚
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// 2. 初始化I2C
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000; // 设置I2C速度,单位是Hz
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; // 负占空比
hi2c1.Init.OwnAddress1 = 0x00; // 设定I2C设备的从地址(一般为0)
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; // 7位寻址
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; // 非广播寻址
hi2c1.Init.NoStretchMode = DISABLE; // 不进行延时
HAL_I2C_Init(&hi2c1);
// 3. 确保通信有效
HAL_Delay(100); // 让I2C完成初始化过程
// 通知其他任务I2C已准备好
__HAL_I2C_ENABLE_IT(&hi2c1, I2C_IT_RXNE | I2C_IT_TXE); // 开启接收和发送中断
}
// 在主循环或相应位置调用i2c1_Init()
```
阅读全文