STM32HAL库学习笔记--硬件I2C读写AT24C512

本文详细介绍了如何使用STM32F103C8T6微控制器通过硬件I2C接口与AT24C512 EEPROM芯片进行数据读写操作。包括CubeMx配置、读取数据手册了解芯片内存结构、调用HAL库接口实现读写,以及在连续读写过程中需要注意的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

摘要:由于需要实现掉电存储功能,在无线传输模块上增加了一块EEPROM芯片,因为工程使用CubeMx配置并生成,为了方便不再使用IO口模拟I2C,而是使用f1自带的硬件I2C来实现。配置和调试过程和遇到一些问题,在此记录如下。

MCU储存芯片CubeMx版本
STM32F103C8T6AT24C5125.0.1

关键词:硬件I2C,HAL库,EEPROM存取

一、CubeMx配置

开启I2C1,其余参数默认

在旧版本的CubeMx中,HAL库实现的I2C初始化带有一些BUG,比如需要在I2C引脚复用GPIO配置前加上I2C的时钟使能,不过这些BUG在新版本的CubeMx中似乎得到了解决,直接使用其生成的初始化程序和HAL库的I2C接口就可以实现成功的读写操作

二、读AT24C512DataSheet

AT24Cxx系列芯片内存大小各异,页数和每页字节数也不同,要根据数据手册来确定该型号芯片的内存结构(Memory Organization)

由DS可知AT24C512的内存一共有 512 Pages x 128 Bytes = 65536 Bytes = 512 kbits,同时地址是16位数据字,范围是0x0000~0xFFFF

和同系列其他芯片一样,器件地址为8位,前5位固定,最低位为读/写标志,第二、三位为总线地址。电路中A0、A1引脚接地,故读、写的器件地址分别为0xA1,0xA0

三、调用HAL库接口实现读写

HAL库将I2C操作封装后提供了直接操作EEPROM的接口:

//EEPORM写函数
HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
//EEPORM读函数
HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)

参数表

参数类型含义
hi2cI2C_HandleTypeDef *HAL库I2C结构体指针
DevAddressuint16_t器件地址
MemAddressuint16_t内存地址
MemAddSizeuint16_t内存地址大小(8或16)
pDatauint8_t *缓冲区头指针
Sizeuint16_t缓冲区大小
Timeoutuint32_t超时时间

返回值

HAL_OK成功
HAL_TIMEOUT等待超时
HAL_BUSY总线繁忙
HAL_ERROR其他错误

读写的实现

#define ADDR_AT24C02_Write 0xA0
#define ADDR_AT24C02_Read 0xA1

int16_t AT24C512_Write_nBytes(uint8_t *data, uint16_t addr, uint16_t length)
{
    if( HAL_I2C_Mem_Write( &hi2c1, ADDR_AT24C02_Write, addr, I2C_MEMADD_SIZE_16BIT, data, length, 1000 ) == HAL_OK )
        return 0;
    else
        return -1;
}

int16_t AT24C512_Read_nBytes(uint8_t *data, uint16_t addr, uint16_t length)
{
    if( HAL_I2C_Mem_Read( &hi2c1, ADDR_AT24C02_Write, addr, I2C_MEMADD_SIZE_16BIT, data, length, 1000 ) == HAL_OK )
        return 0;
    else
        return -1;
}

连续读写测试

void E2PROMTestTask(void const * argument)
{
    uint8_t write_buff[18] = "read & write test";
    uint8_t read_buff[18] = {0};
    
    AT24C512_Write_nBytes( &write_buff[0], 0, 10 );
    HAL_Delay( 10 ); //这里的延时是必要的
    AT24C512_Write_nBytes( &write_buff[10], 10, 8 );
    HAL_Delay( 10 );
    AT24C512_Read_nBytes( read_buff, 0, 18 );

    printf( "%s\r\n", read_buff );

    uint8_t long_write_buff[256];
    uint8_t long_read_buff[256] = {0};
    for( size_t i = 0; i < 256; ++i )
    {
        long_write_buff[i] = i;
    }

    //写入有页限制
    AT24C512_Write_nBytes( &long_write_buff[0], 0, 128 );
    HAL_Delay( 10 );
    AT24C512_Write_nBytes( &long_write_buff[128], 128, 128 );
    HAL_Delay( 10 );
    //读出没有页限制
    AT24C512_Read_nBytes( long_read_buff, 0, 256 );

    for( size_t i = 0; i < 256; ++i )
    {
        printf("0x%02X  ",long_read_buff[i]);
    }

}

四、需要注意的问题

1. 写操作结束后,MCU会向EEPROM发送一个停止位,在发出下一个起始位之前,EEPORM芯片会进入写周期(internally-timed write cycle),这段时间内不能进行任何输入,所以在两个写操作或写操作与读操作之间需要有一个保证wirte cycle的延时,一般5~10ms即可

2. 调用HAL库自带的HAL_I2C_Mem_Write函数时,需要注意一次写入的字节数不能大于EEPROM芯片的页字节数,否则会回滚覆盖低位地址的数据

<think>好的,我需要帮用户找到铁头山羊STM32笔记相关的代码示例或下载资源。首先,我应该回忆一下用户提供的引用内容,看看是否有相关的线索。 用户提到的引用[1]是关于STM32CubeMX教程和IIC读取AT24C02的HAL代码,这可能与铁头山羊的内容相关,因为很多STM32教程会覆盖类似的外设操作。引用[2]是正点原子的HAL开发视频,引用[3]和[4]涉及错误处理和FLASH地址定义,但没直接提到铁头山羊。 铁头山羊可能是一个比较小众的昵称或特定作者的笔记,我需要确认是否有公开的资源。常见的平台如优快云、GitHub、B站或者电子论坛可能会有相关的内容。用户提到的杨桃电子笔记在引用[4]中出现,可能与铁头山羊有关联,或者是同一作者的不同命名? 接下来,我应该建议用户搜索优快云、GitHub、B站等平台,使用准确的关键词组合,比如“铁头山羊 STM32 笔记 代码”。同时,检查是否有官方提供的下载链接,或者联系作者获取资源。另外,参考已有的STM32代码示例,如引用[1]中的I2C代码,也能帮助用户进行开发。 需要提醒用户注意代码的兼容性和验证,确保与他们的硬件匹配。如果找不到具体资源,建议他们参考其他可靠的STM32教程,如正点原子或野火的资料,这些通常有详细的代码示例和文档支持。</think>关于寻找“铁头山羊STM32笔记”相关的代码示例或下载资源,以下是分步解答和建议: --- ### **步骤1:确认资源名称和来源** - **名称核对**:请确认“铁头山羊”是否为特定作者或教程的昵称。例如,引用[4]中提到的“杨桃电子笔记”可能与“铁头山羊”相关,或是同一作者的不同命名。 - **来源平台**:STM32学习资料常见于以下平台: - **优快云博客**(如引用[1]中的HAL教程)[^1] - **Bilibili视频教程**(如引用[2]中正点原子的视频)[^2] - **GitHub/Gitee代码仓** - **电子论坛**(如电子工程世界、STM32中文社区) --- ### **步骤2:针对性搜索方法** 1. **平台搜索**: -优快云中搜索:`site:csdn.net 铁头山羊 STM32 笔记 代码` - 在B站搜索:`铁头山羊 STM32 教程` - 在GitHub搜索:`TieTouShanYang STM32` 或 `铁头山羊 STM32` 2. **验证作者身份**: - 如果“铁头山羊”是个人博主,检查其是否在多个平台同步更新(如个人博客、GitHub)。 --- ### **步骤3:替代方案与参考代码** 若无法找到直接资源,可参考以下相似教程的代码实现: 1. **I2C读写AT24C02**(引用[1]的代码片段): ```c // HALI2C读取AT24C02示例 HAL_I2C_Mem_Read(&hi2c1, 0xA0, 0x00, I2C_MEMADD_SIZE_8BIT, buffer, 1, 100); ``` 2. **FLASH操作**(引用[4]的地址定义): ```c #define FLASH_START_ADDR 0x0801f000 // STM32 FLASH写入地址定义 HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr, data); ``` [^4] --- ### **步骤4:注意事项** 1. **代码兼容性**:确保代码与你的STM32型号(如F1/F4系列)及HAL版本匹配。 2. **报错处理**:若遇到类似`Error:C9555E`的编译错误,检查工程配置和芯片型号是否一致[^3]。 --- ### **步骤5:主动联系作者** - 若在优快云/B站等平台找到相关文章或视频,可通过私信或评论区联系作者索取代码。 ---
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值