1. 项目代码框架 (Project Structure)

该项目采用了典型的嵌入式 CMake 工程结构,基于 PY32F0xx SDK 开发。

  • 根目录:
    • CMakeLists.txt: CMake 构建脚本,用于定义编译源文件、头文件路径及链接库。
    • README.md: 项目说明文档。
  • Src (Source Code): 存放核心业务代码和驱动实现。
    • main.c: 主程序入口。包含系统初始化、外设初始化、主循环 (While Loop)。
    • py32f0xx_it.c: 中断服务函数。处理 SysTick、UART 等硬件中断。
    • py32f0xx_hal_msp.c: 板级支持包 (MSP)。负责初始化具体引脚 (GPIO)、时钟 (RCC) 等硬件底层。
    • system_py32f0xx.c: 系统时钟配置。
    • ina219.c: INA219 驱动。负责通过 I2C 读取电流、电压、功率寄存器。
    • ssd1306.c: OLED 屏幕驱动。负责 I2C 发送显存数据、画点、画字等。
    • i2c.c (通常存在): I2C 通信的底层实现(可能是软件模拟 I2C 或硬件 I2C HAL 库封装)。
  • Inc (Headers): 存放对应的头文件 (.h),声明函数接口和宏定义。
  • Libs: 包含 PY32F0 系列的芯片固件库 (DriversMiddlewares)。

2. 核心代码逻辑分析

2.1 主循环逻辑 (main.c)

系统的“心脏”,采用 轮询模式

  1. 初始化阶段:
    • 配置系统时钟 (System Clock)。
    • 初始化 GPIO、I2C 接口。
    • 初始化 OLED 屏幕 (清屏、点亮)。
    • 初始化 INA219 (写入校准寄存器)。
  2. 主循环 (While 1):
    • 读取数据: 每隔一定时间(如 100ms-500ms),调用 INA219 驱动读取 Bus Voltage (总线电压) 和 Shunt Voltage (分流电阻压降 -> 计算电流)。
    • 数据处理: 计算功率 (P=U×IP = U \times I),并进行格式化字符串 (sprintf)。
    • 显示更新: 将格式化后的电压、电流、功率字符串写入 OLED 显存缓冲,并调用 OLED_Refresh() 刷新屏幕。
    • 串口输出 (可选): 如果开启了 UART debug,将数据通过串口打印到电脑。

2.2 INA219 驱动模块 (ina219.c)

核心是 I2C 寄存器操作

  • 配置: 写入 Configuration Register (0x00),设置增益 (Gain) 和 ADC 精度 (如 12-bit)。
  • 校准: 这里的关键是 Calibration Register (0x05)。代码中会根据采样电阻(2mΩ)计算一个校准值写入该寄存器,使得芯片能直接返回正确的电流值,或者读取原始电压值在 MCU 内部计算。
    • Wiki 提示: 项目文档提到需要修改 main.c 中的 CURRENT_CALIBRATION 宏,这通常是用于微调最终的电流读数系数。

2.3 OLED 显示模块 (ssd1306.c)

典型的 FrameBuffer (显存缓冲) 机制。

  • MCU 内存中开辟一个 128 * 32 / 8 字节的数组作为显存 (GRAM)。
  • 绘图函数: OLED_ShowString(), OLED_ShowNum() 等函数只修改这个数组。
  • 刷新函数: OLED_UpdateScreen()OLED_Refresh() 通过 I2C DMA 或阻塞方式,将整个数组一次性发送给 SSD1306 屏幕驱动芯片。