基于STM32L4XX、HAL库的AT24C512 EEPROM 驱动程序设计

一、简介:

        AT24C512是一款512Kbit(64KB)的I2C接口EEPROM存储器,常用于存储配置数据、日志等。

二、硬件接口:

AT24C512通过I2C接口与STM32通信,硬件连接如下:

  • SCL: I2C时钟线,连接STM32的I2C_SCL引脚。

  • SDA: I2C数据线,连接STM32的I2C_SDA引脚。

  • VCC: 电源(2.7V - 5.5V)。

  • GND: 地。

  • A0, A1, A2: 地址引脚,用于设置设备地址(通常接地或接VCC)。

  • WP: 写保护引脚,接地时允许写操作,接VCC时禁止写操作。

AT24C512的设备地址为0xA0(写)或0xA1(读),具体地址由A0、A1、A2引脚决定。

三、初始化:

#include "stm32l4xx_hal.h"

I2C_HandleTypeDef hi2c1;

void I2C1_Init(void) {
    h

STM32 上**没有内置的 EEPROM**,但可以通过以下几种方式**模拟 EEPROM** 或使用**外部 EEPROM 芯片**。下面我们将详细讲解 STM32 中与 EEPROM 地址相关的概念和实现方式。 --- ## ✅ 一、STM32 没有内置 EEPROM STM32 系列微控制器(如 STM32F1、F4、G0、L4 等)**不包含独立的 EEPROM 存储器**,但可以使用**Flash 模拟 EEPROM**,或者通过 I²C/SPI 接口连接**外部 EEPROM 芯片**。 --- ## ✅ 二、方式一:使用 Flash 模拟 EEPROM(适用于内部存储) ### 原理: - STM32 的 Flash 可以用于存储数据。 - Flash 的擦写寿命有限(通常为 10 万次),因此需要**磨损均衡算法**。 - 每个 Flash 页的大小通常为 1KB 或 2KB。 ### EEPROM 地址 = Flash 地址 例如,使用 STM32F103C8T6: ```c #define EEPROM_START_ADDRESS (FLASH_BASE + 64 * 1024 - PAGE_SIZE) // 最后一页 Flash ``` ### 示例:写入 Flash 模拟 EEPROM ```c #include "stm32f1xx_hal.h" #define EEPROM_SIZE 256 #define PAGE_SIZE 0x400 // 1KB #define EEPROM_PAGE (63) // 使用第 63 页(最后一整页) uint32_t eeprom_address = FLASH_BASE + (EEPROM_PAGE * PAGE_SIZE); void write_to_eeprom(uint32_t address, uint16_t data) { HAL_FLASH_Unlock(); HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, address, data); HAL_FLASH_Lock(); } uint16_t read_from_eeprom(uint32_t address) { return *(uint16_t*)address; } ``` ### 注意事项: - Flash 写入前必须先擦除。 - 建议使用**双页法**或**磨损均衡算法**来延长 Flash 寿命。 - 使用 `__attribute__((section(".eeprom")))` 可以将变量分配到特定段。 --- ## ✅ 三、方式二:使用外部 EEPROM 芯片(如 24C02) ### 常见型号: | 型号 | 容量 | 接口 | 地址范围 | |------|------|------|----------| | 24C02 | 2Kbit | I²C | 0x00 ~ 0xFF | | 24C04 | 4Kbit | I²C | 0x00 ~ 0x1FF | | 24C08 | 8Kbit | I²C | 0x00 ~ 0x3FF | | 24C256 | 256Kbit | I²C | 0x0000 ~ 0x7FFF | ### 示例:使用 I²C 写入 24C02 EEPROM ```c #define EEPROM_I2C_ADDR 0xA0 // I²C 地址(7位地址为 0x50) void eeprom_write_byte(I2C_HandleTypeDef *hi2c, uint8_t mem_addr, uint8_t data) { HAL_I2C_Mem_Write(hi2c, EEPROM_I2C_ADDR, mem_addr, I2C_MEMADD_SIZE_8BIT, &data, 1, HAL_MAX_DELAY); } uint8_t eeprom_read_byte(I2C_HandleTypeDef *hi2c, uint8_t mem_addr) { uint8_t data; HAL_I2C_Mem_Read(hi2c, EEPROM_I2C_ADDR, mem_addr, I2C_MEMADD_SIZE_8BIT, &data, 1, HAL_MAX_DELAY); return data; } ``` ### 使用示例: ```c eeprom_write_byte(&hi2c1, 0x00, 0x55); // 写入地址 0x00 uint8_t val = eeprom_read_byte(&hi2c1, 0x00); // 读取地址 0x00 ``` --- ## ✅ 四、总结:EEPROM 地址的理解 | 类型 | 地址含义 | 示例 | |------|----------|------| | Flash 模拟 EEPROM | Flash 内存地址 | `0x0800FC00` | | 外部 EEPROM(I²C) | 芯片内部地址 | `0x00 ~ 0xFF` | | 外部 EEPROM(SPI) | 芯片内部地址 | `0x0000 ~ 0xFFFF` | --- ##
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

July工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值