1. 项目背景与硬件准备
对于参加蓝桥杯嵌入式组比赛的同学来说,掌握IIC总线通信是必备技能。STM32G431作为比赛指定开发平台,其IIC接口可以同时连接多个外设,这在比赛中非常实用。我们这次要构建的系统包含两个关键器件:24C02 EEPROM存储芯片和MCP4017数字电位器。前者用于保存比赛中的关键数据,后者可以用来动态调节电路参数。
国信长天M4开发板已经为我们准备好了硬件连接。从原理图可以看到,PB6(SCL)和PB7(SDA)这两个引脚被配置为IIC接口,总线上挂着两个设备:24C02的器件地址是0xA0,MCP4017的地址是0x5E。这种多设备共用总线的情况在实际项目中很常见,也是比赛重点考察的内容。
在开始编程前,建议准备好以下工具和环境:
- Keil MDK开发环境(建议使用5.25以上版本)
- STM32CubeMX(用于引脚配置检查)
- 逻辑分析仪(调试IIC波形非常有用)
- 万用表(测量MCP4017电阻变化)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. IIC底层驱动实现
2.1 GPIO模拟IIC时序
虽然STM32有硬件IIC外设,但在比赛中更常使用GPIO模拟的方式。这样做有两个好处:一是时序完全可控,二是可以避开硬件IIC的一些兼容性问题。我们首先需要实现基本的IIC信号控制函数:
c复制// SDA线设置为输入模式
void SDA_Input_Mode() {
GPIO_InitTypeDef GPIO_InitStructure = {0};
GPIO_InitStructure.Pin = GPIO_PIN_7;
GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
GPIO_InitStructure.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
}
// SDA线设置为输出模式
void SDA_Output_Mode() {
GPIO_InitTypeDef GPIO_InitStructure = {0};
GPIO_InitStructure.Pin = GPIO_PIN_7;
GPIO_InitStructure
