STM32F103 驱动I2C的EEPROM

STM32F103C8T6 最小系统开发板使用 HAL 库驱动 I2C EEPROM

1. 项目概述

在本项目中,我们将使用 STM32F103C8T6 最小系统开发板,通过 HAL(Hardware Abstraction Layer)库 驱动 I2C EEPROM(AT24Cxx),实现数据的读写操作。

2. 硬件设计

1. 硬件需求

  • STM32F103C8T6 最小系统开发板
  • STLink-V2 下载器(用于烧录程序)
  • AT24Cxx I2C EEPROM
  • 杜邦线

2. 硬件连接

  1. STM32F103C8T6 I2C1_SCL(PB6) → EEPROM SCL
  2. STM32F103C8T6 I2C1_SDA(PB7) → EEPROM SDA
  3. GND → GND
  4. 3.3V → VCC

3. I2C 协议原理

I2C(Inter-Integrated Circuit)是一种 双线串行通信协议,主要特点:

  • 主从架构:主设备(STM32)控制从设备(EEPROM)。
  • 时钟同步:SCL 负责数据传输时序。
  • 双向数据传输:SDA 传输数据。
  • 地址寻址:EEPROM 的地址通常为 0x50~0x57(取决于硬件配置)。

4. 软件设计

1. STM32 HAL 库简介

HAL 库是 ST 官方提供的 硬件抽象库,封装了底层寄存器操作,使开发更加简单。

2. 工程创建步骤(基于 STM32CubeMX)

  1. 打开 STM32CubeMX,创建新工程,选择 STM32F103C8T6
  2. 配置 I2C1 接口
    • PB6 设为 I2C1_SCL
    • PB7 设为 I2C1_SDA
    • 模式选择 Fast Mode (400kHz)
  3. 时钟配置(默认 72MHz,无需修改)。
  4. 生成代码,选择 IDE 为 STM32CubeIDE 或 Keil

5. 代码实现

1. main.c 代码

#include "main.h"

I2C_HandleTypeDef hi2c1;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_I2C1_Init(void);

#define EEPROM_ADDRESS 0x50  // AT24Cxx I2C 地址

void EEPROM_Write(uint16_t addr, uint8_t data)
{
    uint8_t buffer[2] = {(uint8_t)(addr >> 8), (uint8_t)(addr & 0xFF), data};
    HAL_I2C_Master_Transmit(&hi2c1, EEPROM_ADDRESS << 1, buffer, 3, HAL_MAX_DELAY);
    HAL_Delay(5);
}

uint8_t EEPROM_Read(uint16_t addr)
{
    uint8_t buffer[2] = {(uint8_t)(addr >> 8), (uint8_t)(addr & 0xFF)};
    uint8_t data;
    HAL_I2C_Master_Transmit(&hi2c1, EEPROM_ADDRESS << 1, buffer, 2, HAL_MAX_DELAY);
    HAL_I2C_Master_Receive(&hi2c1, EEPROM_ADDRESS << 1, &data, 1, HAL_MAX_DELAY);
    return data;
}

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_I2C1_Init();

    EEPROM_Write(0x0000, 0x55);  // 写入数据
    HAL_Delay(10);
    uint8_t value = EEPROM_Read(0x0000);  // 读取数据
    
    while (1)
    {
        HAL_Delay(1000);
    }
}

static void MX_I2C1_Init(void)
{
    hi2c1.Instance = I2C1;
    hi2c1.Init.ClockSpeed = 400000;
    hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
    hi2c1.Init.OwnAddress1 = 0;
    hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
    hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
    hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
    hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
    HAL_I2C_Init(&hi2c1);
}

2. 代码解析

  • EEPROM_Write(addr, data):向 EEPROM 指定地址写入数据。
  • EEPROM_Read(addr):从 EEPROM 指定地址读取数据。

6. 烧录与测试

  1. 连接 STLink-V2
    • STLink-V2 SWDIO → STM32 SWDIO
    • STLink-V2 SWCLK → STM32 SWCLK
    • STLink-V2 GND → STM32 GND
    • STLink-V2 3.3V → STM32 3.3V
  2. 使用 STM32CubeProgrammer 或 Keil 进行烧录
  3. 烧录完成后,按下 RESET 运行程序

2. 观察 EEPROM 读写结果

  1. 写入数据 0x55 到 EEPROM 地址 0x0000
  2. 读取 EEPROM 地址 0x0000 的数据,应得到 0x55。
  3. 若读取数据不正确,检查 I2C 连接。

7. 总结

本教程介绍了 STM32F103C8T6 最小系统开发板 使用 HAL 库驱动 I2C EEPROM,包括 I2C 协议原理、硬件设计、软件配置、代码编写、烧录步骤,适用于 STM32 HAL 库 开发。希望能帮助你快速入门 STM32 的 I2C EEPROM 应用!

posted @   jeikerxiao  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示