stm32g431rbt6 oled
时间: 2025-05-17 16:22:28 浏览: 22
### STM32G431RBT6 驱动 OLED 的配置及代码示例
#### 一、硬件连接
STM32G431RBT6 是一款基于 ARM Cortex-M4 内核的微控制器,具有丰富的外设资源。为了驱动 OLED 显示屏,通常会使用 I2C 或 SPI 接口进行通信。以下是常见的硬件连接方式:
- **I2C 连接**:
- SDA (OLED 数据线) → PB7 (STM32G431RBT6 I2C1_SDA)
- SCL (OLED 时钟线) → PB6 (STM32G431RBT6 I2C1_SCL)
- VCC → 3.3V
- GND → 地
- **SPI 连接**:
- MOSI (主设备发送/从设备接收) → PA7 (STM32G431RBT6 SPI1_MOSI)
- SCLK (串行时钟信号) → PA5 (STM32G431RBT6 SPI1_SCK)
- CS (片选信号) → 自定义 GPIO 引脚
- DC (数据/命令控制) → 自定义 GPIO 引脚
- RST (复位信号) → 自定义 GPIO 引脚
- VCC → 3.3V
- GND → 地
#### 二、软件配置
在 HAL 库中实现 OLED 驱动需要初始化相应的接口(I2C 或 SPI),并编写驱动函数。
##### 1. 使用 I2C 初始化 OLED
以下是一个简单的 I2C 初始化过程[^4]:
```c
#include "stm32g4xx_hal.h"
// 定义 OLED 设备地址
#define OLED_I2C_ADDR 0x3C
void OLED_Init(void) {
// 启用 I2C 外设
__HAL_RCC_I2C1_CLK_ENABLE();
// 配置 I2C 引脚为 Alternate Function 模式
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; // 开漏模式
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// 初始化 I2C
I2C_HandleTypeDef hi2c1;
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000;
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if(HAL_I2C_Init(&hi2c1) != HAL_OK){
Error_Handler(); // 错误处理
}
// 发送初始化指令到 OLED
uint8_t init_cmd[] = {0xAE, 0xD5, 0x80, 0xA8, 0x3F, 0xD3, 0x00, 0x40,
0x8D, 0x14, 0x20, 0x00, 0xAF}; // 基础初始化序列
HAL_I2C_Master_Transmit(&hi2c1, OLED_I2C_ADDR << 1, init_cmd, sizeof(init_cmd), HAL_MAX_DELAY);
}
```
##### 2. 使用 SPI 初始化 OLED
对于 SPI 方式的初始化,可以参考如下代码[^5]:
```c
#include "stm32g4xx_hal.h"
#include <string.h>
// 定义 OLED 控制引脚
#define OLED_CS_Port GPIOA
#define OLED_DC_Port GPIOA
#define OLED_RST_Port GPIOA
#define OLED_CS_Pin GPIO_PIN_4
#define OLED_DC_Pin GPIO_PIN_5
#define OLED_RST_Pin GPIO_PIN_6
void OLED_SPI_WriteByte(uint8_t data_or_command, uint8_t value) {
HAL_GPIO_WritePin(OLED_DC_Port, OLED_DC_Pin, data_or_command ? GPIO_PIN_SET : GPIO_PIN_RESET);
HAL_GPIO_WritePin(OLED_CS_Port, OLED_CS_Pin, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1, &value, 1, HAL_MAX_DELAY);
HAL_GPIO_WritePin(OLED_CS_Port, OLED_CS_Pin, GPIO_PIN_SET);
}
void OLED_Init(void) {
// 设置默认状态
HAL_GPIO_WritePin(OLED_CS_Port, OLED_CS_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(OLED_DC_Port, OLED_DC_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(OLED_RST_Port, OLED_RST_Pin, GPIO_PIN_RESET);
HAL_Delay(100); // 等待复位结束
HAL_GPIO_WritePin(OLED_RST_Port, OLED_RST_Pin, GPIO_PIN_SET);
HAL_Delay(100);
// 发送初始化指令
const uint8_t init_cmds[] = {0xAE, 0xD5, 0x80, 0xA8, 0x3F, 0xD3, 0x00, 0x40,
0x8D, 0x14, 0x20, 0x00, 0xAF};
for(int i=0;i<sizeof(init_cmds);i++) {
OLED_SPI_WriteByte(0, init_cmds[i]);
}
}
```
#### 三、显示字符或图像
通过调用 `OLED_SPI_WriteByte` 函数,可以在屏幕上绘制像素点或写入字符串。例如,要显示一个字符 “H”,可以通过逐字节传输其 ASCII 编码来实现。
```c
void OLED_ShowChar(uint8_t x, uint8_t y, char ch) {
static uint8_t buffer[8];
Font_Lookup(ch, buffer); // 获取字体数据
for(int i=0;i<8;i++) {
OLED_SetCursor(x,y+i);
OLED_SPI_WriteByte(1,buffer[i]); // 将缓冲区中的每一行写入屏幕
}
}
```
---
###
阅读全文
相关推荐


















