STM32F103C8T6 硬件I2C1初始化函数 用寄存器地址和数字不用库和HAL方式写代码
时间: 2024-10-27 09:04:32 浏览: 37
STM32F103C8T6是一款基于ARM Cortex-M内核的微控制器,它支持I2C通信协议。要初始化I2C1接口,可以使用STM32的硬件寄存器进行配置,而不使用HAL库或其他库函数。以下是一个简单的示例代码,用于初始化STM32F103C8T6的I2C1接口:
```c
#include "stm32f1xx_hal.h"
#define I2C1_CLK RCC_APB1Periph_I2C1
#define I2C1_SCL GPIO_Pin_13
#define I2C1_SCL_PORT GPIOB
#define I2C1_SCL_PIN GPIO_PinSource13
#define I2C1_SCL_GPIO_CLK RCC_AHB1Periph_GPIOB
#define I2C1_SCL_AF GPIO_AF_I2C1
// ...其他配置定义
void I2C1_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB1PeriphClockCmd(I2C1_CLK, ENABLE); // 启用I2C时钟
GPIO_InitStruct.GPIO_Pin = I2C1_SCL_PIN; // 设置I2C使能引脚
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; // 设置引脚模式为模拟输出模式
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // 设置引脚速度为50MHz
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; // 设置输出类型为推挽输出
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; // 设置上拉或下拉电阻,这里不拉电阻
HAL_GPIO_Init(I2C1_SCL_PORT, &GPIO_InitStruct); // 初始化I2C使能引脚
// 配置I2C时钟频率和总线模式等参数
I2C_InitTypeDef I2C_InitStruct = {0};
I2C_InitStruct.I2C_ClockSpeed = 400000; // 设置I2C时钟频率为40kHz
I2C_InitStruct.I2C_Mode = I2C_Mode_I2C; // 设置I2C模式为I2C模式,也就是正常的数据传输模式
I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2; // 设置占空比为高电平的周期占比为50%
I2C_InitStruct.I2C_OwnAddress1 = 0x48; // 设置设备的唯一地址为0x48
I2C_InitStruct.I2C_AddHeader = 0x48; // 添加强制头信息(此处可设为任何其他值)
I2C->CR1 = I2C_InitStruct.I2C_Mode | I2C_InitStruct.I2C_DutyCycle | \
I2C_InitStruct.I2C_OwnAddress1 | I2C->CR1 & ~I2C_InitStruct.I2C_AddHeader; // 应用配置寄存器并清零之前的设置值
// ...其他配置项(例如从设备地址等)
}
```
在上述代码中,首先通过定义寄存器地址和引脚配置来初始化GPIO引脚,用于控制I2C使能信号。然后,使用STM32的硬件寄存器来配置I2C接口的时钟频率、总线模式等参数。最后,根据实际需求进行其他配置项的设置。请注意,上述代码仅为示例,具体实现可能因硬件和软件环境而异。在实际应用中,请根据具体情况进行适当的修改和调整。
阅读全文