[STM32WBA] 【NUCLEO-WBA65RI 测评】+ 05硬件IIC驱动OLED屏幕

[复制链接]
50|26
聪聪哥哥 发表于 2026-1-8 20:17 | 显示全部楼层 |阅读模式
一:OLED的基础知识
OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display, OELD)。因为具备轻薄、省电等特性,因此从 2003 年开始,这种显示设备在 MP3 播放器上得到了广泛应用,而对于同属数码类产品的 DC 与手机,此前只是在一些展会上展示过采用 OLED 屏幕的工程样品。自 2007 年后,寿命得 到很大提高,具备了许多 LCD 不可比拟的优势。
GND:电源地 VCC:2.2V~5.5V SCL(D0):CLK 时钟 (高电平 2.2V~5.5V) SDA(D1):MOSI 数据(高电平 2.2V~5.5V) RST:复位(高电平 2.2V~5.5V) D/C:数据/命令(高电平 2.2V~5.5V) 兼容 3.3V 和 5V 控制芯片的 I/O 电平(无需任何设置,直接兼容)。
二:STM32 cube MX 软件配置
05-1.png 05-2.png
这里我所使用的是IIC1,使用的PB1,PB2 引脚,不过这里和STM32其他芯片配置有区别,需要设置一下高电平和低电平时,否则IIC的通讯存在问题。设置的时间,可以根据自己配置的通讯速度相关;
三:软件代码
3.1 底层函数如下所示:
  1. extern I2C_HandleTypeDef hi2c1;
  2. /***********************************************************************************************
  3.   * @brief   static unsigned char OLED_send_byteS(unsigned char *data, unsigned char length)
  4.   * @param    data:输入的数据  length:长度值,使用硬件IIC底层驱动函数
  5.   * @retval  无
  6.   * @author  聪聪哥哥
  7.   * @version V1.1.0
  8.   * @date     25-5-2025
  9. *************************************************************************************************/
  10. static unsigned char OLED_send_byteS(unsigned char *data, unsigned char length)
  11. {
  12.         if (HAL_I2C_Master_Transmit(&hi2c1, 0x78, data, length, 2) != HAL_OK)
  13.         {
  14.                 return 0;
  15.         }
  16.         return 1;
  17. }

  18. /***********************************************************************************************
  19.   * @brief   static void I2C_WriteByte(uint8_t addr, uint8_t value)
  20.   * @param    addr:IIC模块的地址,value :写入的数据
  21.   * @retval  无
  22.   * @author  聪聪哥哥
  23.   * @version V1.1.0
  24.   * @date     25-5-2025
  25. *************************************************************************************************/
  26. static void I2C_WriteByte(uint8_t addr, uint8_t value)
  27. {
  28.         unsigned char dta[2] = {0};
  29.         dta[0] = addr;
  30.         dta[1] = value;
  31.         OLED_send_byteS(dta, 2);
  32. }

  33. /***********************************************************************************************
  34.   * @brief   void WriteCmd(unsigned char I2C_Command)
  35.   * @param    I2C_Command : IIC的命令
  36.   * @retval  无
  37.   * @author  聪聪哥哥
  38.   * @version V1.1.0
  39.   * @date     25-5-2025
  40. *************************************************************************************************/
  41. void WriteCmd(unsigned char I2C_Command)
  42. {
  43.         I2C_WriteByte(0x00, I2C_Command);
  44. }

  45. /***********************************************************************************************
  46.   * @brief   void WriteDat(unsigned char I2C_Data)
  47.   * @param    I2C_Data : IIC的数据
  48.   * @retval  无
  49.   * @author  聪聪哥哥
  50.   * @version V1.1.0
  51.   * @date     25-5-2025
  52. *************************************************************************************************/
  53. void WriteDat(unsigned char I2C_Data)//写数据
  54. {
  55.         I2C_WriteByte(0x40, I2C_Data);
  56. }
3.2 显示部分:
  1.         OLED_Init();
  2.         OLED_ColorTurn(0);//0?????????1 ??????
  3.         OLED_DisplayTurn(0);//0??????? 1 ?????????
  4.         OLED_Refresh();
  5.         OLED_Clear();

  6.         OLED_ShowCN(16, 0, 0);
  7.         OLED_ShowCN(32, 0, 1);
  8.         OLED_ShowCN(48, 0, 2);
  9.         OLED_ShowCN(64, 0, 3);

  10.         OLED_ShowCN(16, 2, 4);
  11.         OLED_ShowCN(32, 2, 4);

  12.         OLED_ShowCN(48, 2, 5);
  13.         OLED_ShowCN(64, 2, 5);


  14.         OLED_ShowStr(20, 4, (uint8_t *)test_str, 2);
  15.         OLED_ShowStr(40, 6, (uint8_t *)test_str1, 2);
四:实物如下所示:

05-2.png


公羊子丹 发表于 2026-1-9 07:29 | 显示全部楼层
我用 NUCLEO-WBA65RI 做 IIC 驱动 OLED 时,发现默认的 I2C 速度 100kHz 在显示中文时偶尔会闪屏,后来把频率降到 50kHz,再给 SDA/SCL 引脚并上 10k 上拉电阻,稳定性一下就上来了。
周半梅 发表于 2026-1-9 07:29 | 显示全部楼层
楼主提到的引脚配置差异太真实了!之前用其他 STM32 芯片直接套配置,结果 IIC 一直通讯失败,后来才发现 WBA 系列要单独设置高低电平时间,建议大家配置完后用示波器测下波形是否正常。
帛灿灿 发表于 2026-1-9 07:30 | 显示全部楼层
想问下楼主,你的 OLED 显示中文时有没有遇到字体模糊的情况?我之前调的时候,因为没在 WriteDat 函数里加短暂延时,导致字符显示错位,后来加了 10us 延时就好了,你代码里是不是也做了类似处理?
童雨竹 发表于 2026-1-9 07:31 | 显示全部楼层
哈哈哈,这代码我可太眼熟了!之前抄过类似的底层函数,不过建议在 OLED_send_byteS 里加个重发机制,万一 IIC 传输失败能自动重试,实际项目中稳定性会更靠谱,亲测有效。
万图 发表于 2026-1-9 07:32 | 显示全部楼层
分享个实操小技巧:用 CubeMX 配置 IIC 时,记得开启 Analog Filter,再把超时时间设为 50ms,这样能有效过滤电源干扰导致的通讯异常,我在 10 个项目里都这么配,基本没出过问题。
Wordsworth 发表于 2026-1-9 07:33 | 显示全部楼层
楼主用的是 0x78 这个 IIC 地址,是不是默认没接 SA0 引脚呀?如果想扩展多个 OLED,只要把 SA0 引脚接 VCC,地址就变成 0x7A 了,这样就能在同一个 IIC 总线上挂两个屏幕,很方便。
Bblythe 发表于 2026-1-9 07:34 | 显示全部楼层
我怀疑楼主的 OLED_clear 函数是不是没刷新显存?之前遇到过清屏后还有残影的情况,后来在清屏后强制调用一次 OLED_Refresh (),问题就解决了,你可以试试看有没有这个小细节。
Pulitzer 发表于 2026-1-9 07:35 | 显示全部楼层
有没有大佬试过用 DMA 方式传输 IIC 数据?我想在显示大量数据时提升速度,不知道 WBA65RI 的 IIC DMA 配置和其他 STM32 系列有没有区别,会不会出现数据丢失的情况?
Uriah 发表于 2026-1-9 07:36 | 显示全部楼层
之前调试时遇到过 IIC 一直返回 HAL_ERROR,查了半天发现是 PB1 和 PB2 引脚被其他功能占用了,建议大家配置前先查下芯片手册,确认引脚没有复用冲突,省得走弯路。
Clyde011 发表于 2026-1-9 07:37 | 显示全部楼层
建议楼主测试下低功耗模式下的表现!OLED 本身很省电,但 IIC 的时钟配置可能影响休眠电流,你可以试试在休眠前关闭 IIC 外设,唤醒后重新初始化,看看能不能进一步降低功耗。
zhuomuniao110 发表于 2026-1-9 11:04 | 显示全部楼层
这种显示设备在 MP3 播放器上得到了广泛应用
eefas 发表于 2026-1-11 10:10 | 显示全部楼层
硬件连接的“坑”:上拉电阻              
robincotton 发表于 2026-1-11 11:21 | 显示全部楼层
硬件 I²C   是一个常见但容易“踩坑”的任务。
febgxu 发表于 2026-1-11 12:19 | 显示全部楼层
硬件上注意  接线和 上拉电阻              
abotomson 发表于 2026-1-11 17:07 | 显示全部楼层
STM32 的 I2C 引脚通常是开漏输出,必须依靠外部上拉才能拉高电平。
nomomy 发表于 2026-1-13 09:54 | 显示全部楼层
I²C 外设配置、引脚复用、时序匹配 等细节若处理不当,极易导致 通信超时或死锁。
rosemoore 发表于 2026-1-13 12:44 | 显示全部楼层
STM32WBA 是一款无线 MCU。
robertesth 发表于 2026-1-16 11:23 | 显示全部楼层
必须串联4.7kΩ 上拉电阻:WBA65 的 I2C 外设为开漏输出,上拉电阻保证总线电平稳定,阻值过小会增大功耗,过大会降低通信速度
sesefadou 发表于 2026-1-16 12:20 | 显示全部楼层
I2C引脚需要配置为开漏输出,且必须外接上拉电阻
您需要登录后才可以回帖 登录 | 注册

本版积分规则

142

主题

377

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部
0