STM32F103C8T6 硬件I2C1初始化函数 用寄存器和数字左移 不用库和HAL方式写代码
时间: 2024-10-27 21:04:31 浏览: 31
STM32F103C8T6使用HAL库创建0.96‘OLED模拟I2C显示例程
STM32F103C8T6是一款基于ARM Cortex-M内核的微控制器,它支持I2C通信协议。下面是一个使用寄存器和数字左移的方式初始化STM32F103C8T6硬件I2C1的示例代码。
```c
#include "stm32f1xx_hal.h"
#define I2C1_CLK_DELAY (uint32_t)RCC_APB1Periph_I2C1
#define I2C1_SCL_PIN GPIO_Pin_13
#define I2C1_SCL_GPIO GPIOB
#define I2C1_SCL_GPIO_PORT GPIO
#define I2C1_SCL_GPIO_CLK RCC_AHBPeriph_GPIOB
#define I2C1_SCL_PIN_BIT GPIO_PinBits(GPIOB->BSRR, I2C1_SCL_PIN)
void I2C1_Init(void) {
// 配置I2C1时钟和外设时钟
RCC->APB1ENR |= RCC_APB1Periph_I2C1;
RCC->AHB1ENR |= RCC_AHBPeriph_GPIOB;
// 配置I2C1的引脚配置
GPIOB->MODER &= ~GPIO_MODER_MODE13; // 将I2C1 SCL引脚设置为非复用模式
GPIOB->OTYPER &= ~I2C1_SCL_PIN; // 配置上拉/下拉输入复用功能
// 配置I2C1的时钟频率和数据传输速率
I2C->CR1 &= ~(I2C_CR1_FREQ); // 清零频率寄存器
I2C->CR1 |= I2C_CR1_FREQ(I2C_CR1_FREQ_I2C); // 设置I2C频率为标准模式下的默认值
// 初始化I2C总线,设置起始条件和停止条件时序参数
HAL_I2CInit(&I2C->Periph, I2C_Mode_I2C, I2C_DutyCycle_2, I2C_OwnAddress1(0), I2C_ClockSpeed(75000));
}
```
上述代码中,我们首先定义了与I2C相关的寄存器、引脚和外设时钟配置。然后,在`I2C1_Init()`函数中,我们配置了I2C的时钟频率和数据传输速率,并初始化了I2C总线。最后,我们使用`HAL_I2CInit()`函数对I2C外设进行初始化,设置了起始条件和停止条件时序参数。需要注意的是,在配置寄存器时,我们使用了数字左移的方式将所需的位或常量写入寄存器中。这种方法可以使代码更加简洁明了。
需要注意的是,上述代码中的寄存器、引脚和外设时钟配置需要根据具体的STM32F103C8T6型号和开发板进行适当的调整。此外,还需要根据实际应用场景进行适当的参数配置和代码优化。
阅读全文