From ce0b1bd48a7d4ead539c263df803cba164cf35c8 Mon Sep 17 00:00:00 2001 From: helei Date: Sun, 20 Sep 2026 11:12:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=87=E8=AF=86=E7=AC=A6=E9=87=8D=E5=91=BD?= =?UTF-8?q?=E5=90=8D:=E5=AD=97=E5=BA=93=E5=BC=95=E8=84=9A=E5=AE=8F?= =?UTF-8?q?=E6=94=B9ROM=5F=E5=89=8D=E7=BC=80(ROM=5FCLK/DI/DO/CS),=E5=B1=8F?= =?UTF-8?q?=E5=B9=95=E5=8F=AA=E7=95=99OLED=5FI2C=5FADDR;=E5=AF=B9=E5=BA=94?= =?UTF-8?q?=E5=8E=9F=E7=90=86=E5=9B=BEOLED=5FSCL/OLED=5FSDA=E5=91=BD?= =?UTF-8?q?=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- STM32F103_App1/HardWare/OLED/oled.c | 57 +++++++++++++++-------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/STM32F103_App1/HardWare/OLED/oled.c b/STM32F103_App1/HardWare/OLED/oled.c index 86b9219..41a81e1 100644 --- a/STM32F103_App1/HardWare/OLED/oled.c +++ b/STM32F103_App1/HardWare/OLED/oled.c @@ -1,8 +1,9 @@ /* oled.c - 128x64 OLED(SSD1306, I2C) + 晶联讯 GB2312 字库 IC(SPI) 驱动 - * 屏幕: I2C 接口, 与 EEPROM 共用软件 I2C 总线(SCL=PB5 SDA=PB4), 无 RST 脚; + * 屏幕: I2C 接口(原理图网络 OLED_SCL/OLED_SDA), 与 EEPROM 共用软件 I2C 总线 + * (SCL=PB5 SDA=PB4, 见 iic.h), 无 RST 脚; 地址 OLED_I2C_ADDR=0x78; * 与 24C02 的跨任务互斥用 storage_lock(每个完整显示事务内) - * 字库: SPI, 与 W25Q64 共用三线(CLK=PB6 DI=PB7 DO=PB9), CS2=PC12 独立片选; - * DO(PB9) 固定为输入(W25Q64_Init 已配置), 字库读取需持 storage_lock 与 Flash 互斥 */ + * 字库: SPI, 与 W25Q64 共用三线(ROM_CLK=PB6 ROM_DI=PB7 ROM_DO=PB9), ROM_CS=PC12 独立片选; + * ROM_DO(PB9) 固定为输入(W25Q64_Init 已配置), 字库读取需持 storage_lock 与 Flash 互斥 */ #include "oled.h" #include "qrcodegen.h" @@ -10,19 +11,19 @@ #include "app_loop.h" /* storage_lock/unlock */ #include -#define OLED_CLK_PORT GPIOB -#define OLED_CLK_PIN GPIO_PIN_6 /* 字库 CLK, 与 W25Q64 CLK 共线 */ -#define OLED_MOSI_PORT GPIOB -#define OLED_MOSI_PIN GPIO_PIN_7 /* 字库 DI, 与 W25Q64 DI 共线 */ -#define OLED_FSO_PORT GPIOB -#define OLED_FSO_PIN GPIO_PIN_9 /* 字库 DO(FSO), 与 W25Q64 DO 共线, 恒为输入 */ -#define OLED_CS2_PORT GPIOC -#define OLED_CS2_PIN GPIO_PIN_12 +#define ROM_CLK_PORT GPIOB +#define ROM_CLK_PIN GPIO_PIN_6 /* 字库 CLK, 与 W25Q64 CLK 共线 */ +#define ROM_DI_PORT GPIOB +#define ROM_DI_PIN GPIO_PIN_7 /* 字库 DI, 与 W25Q64 DI 共线 */ +#define ROM_DO_PORT GPIOB +#define ROM_DO_PIN GPIO_PIN_9 /* 字库 DO(FSO), 与 W25Q64 DO 共线, 恒为输入 */ +#define ROM_CS_PORT GPIOC +#define ROM_CS_PIN GPIO_PIN_12 -#define lcd_mosi(a) HAL_GPIO_WritePin(OLED_MOSI_PORT, OLED_MOSI_PIN, (GPIO_PinState)(a)) -#define lcd_clk(a) HAL_GPIO_WritePin(OLED_CLK_PORT, OLED_CLK_PIN, (GPIO_PinState)(a)) -#define rom_cs2(a) HAL_GPIO_WritePin(OLED_CS2_PORT, OLED_CS2_PIN, (GPIO_PinState)(a)) -#define ROM_OUT HAL_GPIO_ReadPin(OLED_FSO_PORT, OLED_FSO_PIN) +#define rom_di(a) HAL_GPIO_WritePin(ROM_DI_PORT, ROM_DI_PIN, (GPIO_PinState)(a)) +#define rom_clk(a) HAL_GPIO_WritePin(ROM_CLK_PORT, ROM_CLK_PIN, (GPIO_PinState)(a)) +#define rom_cs(a) HAL_GPIO_WritePin(ROM_CS_PORT, ROM_CS_PIN, (GPIO_PinState)(a)) +#define ROM_DO_READ HAL_GPIO_ReadPin(ROM_DO_PORT, ROM_DO_PIN) static uint8_t s_row = 0; /* 当前页地址(16px 行 × 2) */ static uint8_t s_col = 0; /* 当前列(像素) */ @@ -39,11 +40,11 @@ static void oled_gpio_init(void) /* 屏幕 I2C 不占 GPIO; 字库 CLK(PB6)/DI(PB7) 与 W25Q64 共线(其 Init 已配为输出), * DO(PB9) 恒为输入(其 Init 已配), 这里只配字库独立片选 CS2(PC12), 默认拉高不选中 */ - HAL_GPIO_WritePin(OLED_CS2_PORT, OLED_CS2_PIN, GPIO_PIN_SET); + HAL_GPIO_WritePin(ROM_CS_PORT, ROM_CS_PIN, GPIO_PIN_SET); g.Mode = GPIO_MODE_OUTPUT_PP; g.Pull = GPIO_PULLUP; g.Speed = GPIO_SPEED_FREQ_LOW; - g.Pin = OLED_CS2_PIN; HAL_GPIO_Init(OLED_CS2_PORT, &g); + g.Pin = ROM_CS_PIN; HAL_GPIO_Init(ROM_CS_PORT, &g); } /*==== SSD1306 I2C 传输(与 EEPROM 共用软件 I2C 总线) ====*/ @@ -177,7 +178,7 @@ void oled_init(void) { HAL_Delay(400); /* 等屏幕/字库上电稳定(I2C 屏无 RST 脚, 靠上电延时) */ oled_gpio_init(); - rom_cs2(1); + rom_cs(1); oled_write(0, 0xAE); /* display off */ oled_write(0, 0x20); /* 寻址模式 */ oled_write(0, 0x10); /* 水平寻址 */ @@ -241,10 +242,10 @@ static void display_graphic_8x16(uint8_t page, uint8_t column, const uint8_t *dp static void rom_write_byte(uint8_t dat) { for (int i = 0; i < 8; i++) { - lcd_mosi(dat & 0x80); + rom_di(dat & 0x80); dat <<= 1; - lcd_clk(0); - lcd_clk(1); + rom_clk(0); + rom_clk(1); } } @@ -252,12 +253,12 @@ static void rom_write_byte(uint8_t dat) static uint8_t rom_read_byte(void) { uint8_t ret = 0; - lcd_clk(1); + rom_clk(1); for (int i = 0; i < 8; i++) { - lcd_clk(0); + rom_clk(0); ret <<= 1; - if (ROM_OUT) ret |= 1; - lcd_clk(1); + if (ROM_DO_READ) ret |= 1; + rom_clk(1); } return ret; } @@ -266,14 +267,14 @@ static uint8_t rom_read_byte(void) static void rom_read_n(uint8_t ah, uint8_t am, uint8_t al, uint8_t *buf, uint8_t len) { storage_lock(); /* 与 W25Q64 共用 SPI 三线, 与 Flash 读写互斥 */ - rom_cs2(0); - lcd_clk(0); + rom_cs(0); + rom_clk(0); rom_write_byte(0x03); /* 读指令 */ rom_write_byte(ah); rom_write_byte(am); rom_write_byte(al); for (uint8_t i = 0; i < len; i++) buf[i] = rom_read_byte(); - rom_cs2(1); + rom_cs(1); storage_unlock(); }