STM32F103 驱动I2C的OLED屏

STM32F103C8T6 最小系统开发板使用 HAL 库驱动 I2C OLED 屏

1. 项目概述

在本项目中,我们将使用 STM32F103C8T6 最小系统开发板,通过 HAL(Hardware Abstraction Layer)库 驱动 I2C OLED 屏(128x64 SSD1306),并在屏幕上显示字符和图像。

2. 硬件设计

1. 硬件需求

  • STM32F103C8T6 最小系统开发板
  • STLink-V2 下载器(用于烧录程序)
  • 128x64 I2C OLED 屏(SSD1306 驱动芯片)
  • 杜邦线

2. 硬件连接

  1. STM32F103C8T6 I2C1_SCL(PB6) → OLED SCL
  2. STM32F103C8T6 I2C1_SDA(PB7) → OLED SDA
  3. GND → GND
  4. 3.3V → VCC

3. I2C 协议原理

I2C(Inter-Integrated Circuit)是一种 双线串行通信协议,主要特点:

  • 主从架构:主设备(STM32)控制从设备(OLED)。
  • 时钟同步:SCL 负责数据传输时序。
  • 双向数据传输:SDA 传输数据。
  • 地址寻址:每个 I2C 设备都有唯一地址(SSD1306 默认地址 0x3C)。

4. 软件设计

1. STM32 HAL 库简介

HAL 库是 ST 官方提供的 硬件抽象库,封装了底层寄存器操作,使开发更加简单。

2. 工程创建步骤(基于 STM32CubeMX)

  1. 打开 STM32CubeMX,创建新工程,选择 STM32F103C8T6
  2. 配置 I2C1 接口
    • PB6 设为 I2C1_SCL
    • PB7 设为 I2C1_SDA
    • 模式选择 Fast Mode (400kHz)
  3. 时钟配置(默认 72MHz,无需修改)。
  4. 生成代码,选择 IDE 为 STM32CubeIDE 或 Keil

5. 代码实现

1. main.c 代码

#include "main.h"
#include "ssd1306.h"

I2C_HandleTypeDef hi2c1;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_I2C1_Init(void);

int main(void)
{
    HAL_Init();            // 初始化系统时钟、时钟源、时钟分频等
    SystemClock_Config();  // 初始化时钟
    MX_GPIO_Init();        // 初始化 GPIO
    MX_I2C1_Init();        // 初始化 I2C1

    SSD1306_Init();        // 初始化 OLED

    SSD1306_Clear();
    SSD1306_GotoXY(10, 10);
    SSD1306_Puts("Hello STM32!", &Font_7x10, 1);
    SSD1306_UpdateScreen();
    
    while (1)
    {
        HAL_Delay(1000);
    }
}

static void MX_I2C1_Init(void)
{
    hi2c1.Instance = I2C1;                                  // 选择 I2C1
    hi2c1.Init.ClockSpeed = 400000;                         // 设置时钟频率为 400kHz
    hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;                 // 设置时钟频率为 400kHz
    hi2c1.Init.OwnAddress1 = 0;                             // 不设置own address
    hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;    // 设置7位地址模式
    hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;   // 不使用dual address mode
    hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;   // 不使用general call mode
    hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;       // 不使用stretch mode
    HAL_I2C_Init(&hi2c1);                                   // 初始化 I2C1
}

2. 代码解析

  • SSD1306_Init():初始化 OLED 屏幕。
  • SSD1306_GotoXY(x, y):设置光标位置。
  • SSD1306_Puts():在 OLED 屏幕上显示文本。
  • SSD1306_UpdateScreen():刷新屏幕。

6. 烧录与测试

stlink

  1. 连接 STLink-V2
    • STLink-V2 SWDIO → STM32 SWDIO
    • STLink-V2 SWCLK → STM32 SWCLK
    • STLink-V2 GND → STM32 GND
    • STLink-V2 3.3V → STM32 3.3V
  2. 使用 STM32CubeProgrammer 或 Keil 进行烧录
  3. 烧录完成后,按下 RESET 运行程序

2. 观察 OLED 显示

  1. OLED 屏幕应显示 "Hello STM32!"
  2. 若屏幕无显示,检查 I2C 连接。

7. 总结

本教程介绍了 STM32F103C8T6 最小系统开发板 使用 HAL 库驱动 I2C OLED 屏,包括 I2C 协议原理、硬件设计、软件配置、代码编写、烧录步骤,适用于 STM32 HAL 库 开发。希望能帮助你快速入门 STM32 的 I2C OLED 屏应用!

posted @ 2025-02-07 15:06  jeikerxiao  阅读(1388)  评论(0)    收藏  举报