基于STM32G431嵌入式学习笔记——九、IIC总线(一)EEPROM

本文介绍了如何使用EEPROM进行数据的写入与读取操作。首先分析了EEPROM的基础原理,并在Keil环境下实现了具体的函数编写过程,包括写入数据与读取数据两个核心功能。最后通过测试验证了数据的持久存储能力。
一、基础原理剖析

先前的实验中我们都是通过程序设计语言去调用串口、定时器、引脚等硬件设备进行从0到有的功能实现,所有的指令以及数据均来自程序设计语言,而没有想计算机一样将一些必要数据存入存储器中。
IIC总线是我们嵌入式板子上进行数据传输的主要通道,因此如果我们了解其中内部原理,便可以实现数据存储功能以及实时时间获取的功能。
在这里插入图片描述
我们今天首先介绍EEPROM的使用方法。
(具体原理以及内核操作会在寒假进行系统化剖析)

二、环境创建

在比赛资源包中官方已经给我们提供了IIC总线例程,我们可以直接去选择调用:
在这里插入图片描述
选择现有的工作环境进行复制(配置好LED、KEY、LCD的任意环境均可),重命名为EEPROM

将例程文件复制到相应文件夹中
在这里插入图片描述打开keil,加入对应的.c文件,随后编译
在这里插入图片描述

在这里插入图片描述

三、函数书写

以下函数均写入i2c_hal.c文件中

1.向EEPROM中写入数据
//EEPROM的写操作
void EEPROM_Write(unsigned char *pucBuf, unsigned char ucAddr, unsigned char ucNum)
{
   
   
	I2CStart
<think>首先,用户查询是关于STM32G431使用STM32CubeMX配置HAL库进行硬件IIC开发的相关内容。用户提到了几个引用,但提醒我这些引用仅供参考,不是用户的真正需求。我需要参考用户上次的问题和我的回答,但在这个对话中是第次交互,所以没有历史上下文。用户说:"上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上次的问题和你的回答。" 但在系统提示中,这是第条消息,所以没有"上次的问题"。 用户消息是:"我想查找关于STM32G431使用CubeMX配置HAL库进行硬件IIC开发的相关内容 请问STM32G431使用CubeMX配置HAL库进行硬件IIC开发"。用户提供了几个引用作为背景,但指定不要过多依赖它们。 引用内容: - 引用[1]: STM32G030F6P6基于HAL库硬件IIC驱动OLED屏幕。 - 引用[2]: STM32CubeMX + HAL实现硬件IIC读写AT24C02 EEPROM。 - 引用[3]: STM32CubeMX配置STM32G071 UART+DMA收发数据。 - 引用[4]: 蓝桥杯嵌入式STM32G431使用EEPROM,涉及I2C操作。 用户的具体查询是STM32G431使用CubeMX和HAL库进行硬件IIC开发。 我的回答需要遵循系统级指令: 1. 行内数学表达式使用$...$格式 – 但在这个主题中,可能没有数学表达式。 2. 独立公式使用$$...$$格式 – 同样,可能不需要。 3. LaTeX语法正确 – 确保任何代码块格式正确。 4. 使用中文回答。 5. 生成相关问题 – 在回答结束后添加相关问题部分。 6. 回答中引用的段落末尾自然地添加引用标识,如[^1]。 回答结构:清晰、逐步解决问题,保证真实可靠。 主题是关于STM32G431微控制器使用STM32CubeMX工具配置硬件I²C接口,使用HAL(Hardware Abstraction Layer)库开发。 关键点: - STM32G431STM32G4系列的部分,支持I²C外设。 - STM32CubeMX是STMicroelectronics的图形化配置工具,用于初始化代码生成。 - HAL库提供抽象层函数简化开发。 - 硬件IIC指的是使用微控制器内置的I²C控制器,而不是软件模拟。 根据引用[2]和[4],硬件IIC开发通常涉及EEPROM读写,如AT24C02。 步骤总结: 1. **硬件IIC初始化**:使用CubeMX配置I²C引脚、时钟、参数。 2. **HAL库函数使用**:如HAL_I2C_Mem_Write, HAL_I2C_Mem_Read等。 3. **通信示例**:读写外部设备如EEPROM。 在回答中,我应该: - 解释CubeMX配置步骤。 - 提供代码示例。 - 讨论常见问题或注意事项。 引用用户提供的引用,自然地添加引用标识。例如,引用[2]讨论EEPROM读写,可以引用它。 生成相关问题在最后。 回答用中文。 大纲回答: 1. **介绍**:简要说明STM32G431使用硬件IIC开发。 2. **CubeMX配置步骤**: - 开启I²C外设。 - 配置时钟、速度、地址模式等。 - 设置GPIO引脚。 3. **代码开发**: - 使用HAL函数初始化。 - 示例读写EEPROM。 4. **注意事项**:如时序、中断处理、错误处理。 5. **引用**:基于提供的引用,自然地添加。 6. **相关问题**:生成几个相关问题。 代码示例:由于引用[4]提到STM32G431使用I2C操作EEPROM,我可以基于它提供示例。 确保真实可靠:基于标准STM32开发知识。 </think>### STM32G431使用CubeMX配置HAL库进行硬件IIC开发 STM32G431微控制器属于STM32G4系列,支持硬件I²C(Inter-Integrated Circuit)外设,这使得它可以直接通过硬件控制器高效地与其他I²C设备通信(如EEPROM、传感器等)。使用STM32CubeMX工具和HAL库简化了硬件IIC的开发过程:CubeMX图形化界面用于配置外设参数和生成初始化代码,HAL库则提供抽象函数处理底层通信。硬件IIC相比软件模拟IIC(如引用[1]中的模拟IIC驱动OLED)具有更高的效率和稳定性,尤其适用于实时性要求高的应用[^2]。 以下我将逐步解释开发过程,包括CubeMX配置、HAL库函数使用、代码示例和注意事项。内容基于STM32标准开发实践(如引用[2]和[4]的原理),并结合STM32G431的特性整理而成。 #### 步骤1: STM32CubeMX硬件IIC配置 STM32CubeMX允许可视化配置I²C外设。以下是针对STM32G431的配置步骤: 1. **创建新工程**: - 打开CubeMX,选择STM32G431系列微控制器型号。 - 在“Pinout & Configuration”视图中,启用I²C外设(如I2C1或I2C2,根据硬件设计选择)。 2. **配置I²C参数**: - 在“I2C”选项卡中,设置基本参数: - **时钟源**:选择内部时钟(如HSI),确保时钟频率匹配(默认100kHz或400kHz标准模式)。 - **模式**:选择“I2C”(标准模式)。 - **时钟速度**:根据目标设备(如AT24C02 EEPROM)设置,例如100kHz。 - **地址模式**:设备地址为7位或10位(常用7位)。 - **GPIO设置**:自动分配SCL(Serial Clock)和SDA(Serial Data)引脚(如PB6/PB7对应I2C1)。确认引脚模式为“Alternate Function Open Drain”。 3. **生成代码**: - 在“Project Manager”中,设置工程路径和IDE(如STM32CubeIDE)。 - 点击“Generate Code”,CubeMX会自动生成初始化的HAL库代码,包括`i2c.c`和`i2c.h`文件。 此配置确保硬件IIC外设准备好,而CubeMX生成的代码简化了底层设置(类似于引用[3]中UART的DMA配置原理)[^2][^4]。 #### 步骤2: HAL库函数使用与代码开发 HAL库提供了套函数处理I²C通信。核心函数包括读写操作:`HAL_I2C_Mem_Write`用于写入数据,`HAL_I2C_Mem_Read`用于读取数据。以下是针对EEPROM(如AT24C02)的读写示例,基于STM32G431开发。 **初始化代码**: 在CubeMX生成的代码基础上,添加初始化调用。例如,在`main.c`文件中: ```c /* 包含头文件 */ #include "stm32g4xx_hal.h" #include "i2c.h" /* 定义EEPROM设备地址:AT24C02地址为0xA0(7位模式) */ #define EEPROM_ADDRESS 0xA0 int main(void) { HAL_Init(); // 初始化HAL库 SystemClock_Config(); // 配置系统时钟 MX_I2C1_Init(); // 初始化I2C1外设(CubeMX生成) // 其他初始化,如LCD(参考引用[4]) LCD_Init(); HAL_Delay(100); /* 向EEPROM写入个字节:地址0处写入数据0x55 */ uint8_t writeData = 0x55; HAL_I2C_Mem_Write(&hi2c1, EEPROM_ADDRESS, 0, I2C_MEMADD_SIZE_8BIT, &writeData, 1, HAL_MAX_DELAY); /* 读取EEPROM数据:地址0读取个字节 */ uint8_t readData; HAL_I2C_Mem_Read(&hi2c1, EEPROM_ADDRESS, 0, I2C_MEMADD_SIZE_8BIT, &readData, 1, HAL_MAX_DELAY); /* 显示读取数据到LCD(参考引用[4]) */ char text[20]; sprintf(text, "EEPROM Data: %d", readData); LCD_DisplayStringLine(Line5, (uint8_t *)text); while (1) { // 主循环 } } ``` **关键函数说明**: - **`HAL_I2C_Mem_Write`**: 写入数据到指定内存地址(如EEPROM)。参数: - `&hi2c1`: I²C句柄(CubeMX生成)。 - `EEPROM_ADDRESS`: 设备地址(7位)。 - `0`: 目标设备内部地址(如EEPROM的偏移地址)。 - `I2C_MEMADD_SIZE_8BIT`: 地址大小(8位或16位)。 - `&writeData`: 数据缓冲区指针。 - `1`: 数据长度(字节)。 - `HAL_MAX_DELAY`: 超时时间(使用最大延时阻塞模式)。 - **`HAL_I2C_Mem_Read`**: 类似写操作,用于读取数据。 - **错误处理**:检查返回状态(如`HAL_OK`),使用`HAL_I2C_GetError()`诊断故障。 此代码基于引用[4]中的EEPROM操作逻辑,但适配了硬件IIC函数(避免软件模拟的开销)[^2][^4]。 #### 注意事项 开发硬件IIC时,需注意以下常见问题: 1. **时序问题**:硬件IIC依赖微控制器时钟配置。如果通信失败,检查CubeMX中的时钟树设置(如I²C外设时钟是否使能)。 2. **地址对齐**:设备地址(如AT24C02的0xA0)必须左移位(7位模式),HAL库自动处理。 3. **跨页写入**:EEPROM写入时若地址跨页,需分多次操作(类似引用[2]的跨页功能)。 4. **中断与DMA**:为提高效率,可启用I²C中断或DMA(如引用[3]的UART+DMA模式),但需在CubeMX中额外配置。 5. **硬件设计**:确保SCL/SDA线路上拉电阻(通常4.7kΩ)正确连接。 6. **调试工具**:使用逻辑分析仪或STM32 ST-Link调试器监控I²C波形。 硬件IIC开发在STM32G431上性能稳定,适用于工业控制、数据采集等场景(如蓝桥杯嵌入式项目)[^4]。 #### 相关问题
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值