STM32F103C8T6 硬件I2C1初始化函数 用寄存器地址不用库和HAL方式写代码
时间: 2024-10-27 13:04:30 浏览: 27
基于STM32F103C8T6--通过HAL库实现STM32的ADC+DMA
5星 · 资源好评率100%
STM32F103C8T6是一款STM32系列微控制器,支持I2C接口。以下是硬件I2C1的初始化函数的一种可能实现,以寄存器地址方式进行,不使用HAL库函数。
```c
#include "stm32f1xx_hal.h"
void I2C1_Init(void)
{
// 配置I2C1相关寄存器
RCC->APB1ASAR &= ~(RCC_APB1ASAR_I2C1A); // 选择I2C1A作为外设
RCC->APB1BDCR |= RCC_APB1BDCR_I2C1S; // 设置I2C1时钟频率为最高频率
RCC->CR |= RCC_CR_I2S; // 使能I2C时钟
// 配置I2C相关寄存器
I2C1->CR1 &= ~(I2C_CR1_PE); // 禁止I2C总线
I2C1->CR2 &= ~(I2C_CR2_SADD); // 设置I2C设备地址
I2C1->DR = 0; // 清除数据寄存器
I2C1->BRR = 0; // 设置I2C总线时间
I2C1->SR1 |= I2C_SR1_SB; // 发送起始条件
// 配置DMA相关寄存器
DMA_DeInit(DMA1, DMA_CHANNEL_I2C1_RX); // 初始化DMA接收通道
DMA_Init(DMA1, DMA_CHANNEL_I2C1_RX, DMA_PERIPH_I2C1_DR, DMA_MINMAPTARGET(0)); // 设置DMA接收通道参数
DMA_Cmd(DMA1, DMA_CHANNEL_I2C1_RX, ENABLE); // 启动DMA接收通道
// 使能I2C时钟并且开始接收数据
I2C1->CR1 |= I2C_CR1_RE; // 使能接收功能
}
```
这段代码实现了基本的硬件初始化。这里用到的寄存器地址包括STM32F103的APB接口和系统控制和状态的相关寄存器,也包括了硬件相关的数据和接收控制寄存器。代码的具体操作主要围绕I2C相关寄存器的配置。使用DMA是因为STM32 F1系列的微控制器不支持直接的硬件FIFO操作,使用DMA能够更好的管理数据的接收。这段代码的主要功能就是初始化和启动I2C接口。具体如何使用,需要你根据你的具体需求在程序中添加适当的代码。
请注意,由于我没有具体知道你的具体需求,这段代码可能需要根据你的实际需要进行一些修改。另外,确保你已经了解STM32的寄存器地址以及这些寄存器的作用。你可以查阅STM32的官方文档或者参考相关的教程和示例代码来帮助你理解这段代码。
阅读全文