你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

NUCELO-WBA65RI使用u8g2驱动OLED屏幕

[复制链接]
EPTmachine 发布时间:2025-7-3 23:15

NUCLEO-WBA65RI提供Arduino接口,可以通过其中的I2C接口控制OLED屏幕。

NUCLEO_Arduino_I2C.png

WBA65_I2C1_Settings.png

OLED屏幕选择使用SeedStudio的OLED-SSD1315屏幕

https://wiki.seeedstudio.com/Grove-OLED-Display-0.96-SSD1315/

u8g2移植简述

在SeeedStudio官方的使用手中,在Arduino平台上使用u8g2图形库来驱动OLED屏幕。u8g2代码中有C语言的驱动代码,用户只需要实现u8g2的接口函数,即可使用u8g2的功能来驱动OLED屏幕。

u8g2_port_0.png

u8g2_port_1.png

如手册中描述的,移植需要完成两个具体的回调函数,功能为:

  • 与控制器相关的GPIO控制以及Delay的回调函数实现;
  • 与通讯接口(比如I2C、SPI)相关的数据传输回调函数。

这两个函数的实现在u8g2 Wiki手册中可以找到相关的代码实现模板。

u8g2_GPIO_delay_template.png

u8g2_Communication_template.png

移植u8g2

在CubeMX中设置开发板的I2C1接口做用驱动OLED屏幕的接口。

I2C1_Settings.png

在工程的Drivers文件夹中,添加u8g2源码中的csrc文件夹中的源码文件

u8g2Ccode.png

在工程配置中添加源码的路径信息。

project_file_path.png

在代码中,根据模板代码,实现以下两个接口函数。

uint8_t u8x8_gpio_and_delay(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{
    switch(msg)
    {
    case U8X8_MSG_GPIO_AND_DELAY_INIT:
        HAL_Delay(1);
        break;
    case U8X8_MSG_DELAY_MILLI:
        HAL_Delay(arg_int);
        break;
    }
    return 1;
}

uint8_t u8x8_i2c(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{
  static uint8_t buffer[32];        /* u8g2/u8x8 will never send more than 32 bytes between START_TRANSFER and END_TRANSFER */
  static uint8_t buf_idx;
  uint8_t *data;

  switch(msg)
  {
    case U8X8_MSG_BYTE_SEND:
      data = (uint8_t *)arg_ptr;
      while( arg_int > 0 )
      {
        buffer[buf_idx++] = *data;
        data++;
        arg_int--;
      }
      break;
    case U8X8_MSG_BYTE_INIT:
      /* add your custom code to init i2c subsystem */

      break;
    case U8X8_MSG_BYTE_SET_DC:
      /* ignored for i2c */
      break;
    case U8X8_MSG_BYTE_START_TRANSFER:
      buf_idx = 0;
      break;
    case U8X8_MSG_BYTE_END_TRANSFER:
        HAL_I2C_Master_Transmit(&hi2c1,0x78,buffer,buf_idx,1000);
      break;
    default:
      return 0;
  }
  return 1;
}

在代码中添加以下代码来调用u8g2的函数来驱动OLED屏幕

#include "u8g2.h"

u8g2_t myDisplay;


int
{
...
  u8g2_Setup_ssd1306_i2c_128x64_vcomh0_f(&myDisplay,U8G2_R0,u8x8_i2c,u8x8_gpio_and_delay);//初始化u8g2实例,注册自定义的接口函数
  u8g2_InitDisplay(&myDisplay);
  u8g2_SetPowerSave(&myDisplay,0);

  u8g2_ClearDisplay(&myDisplay);
  u8g2_SetFont(&myDisplay,u8g2_font_wqy16_t_gb2312);    //选择字体
  u8g2_DrawUTF8(&myDisplay,0,16,"ST中文论坛");
  u8g2_DrawUTF8(&myDisplay,0,32,"年中福利");
  u8g2_SendBuffer(&myDisplay);

...  
}

完成上述代码的添加后,就可以在OLED屏幕上看到显示的文字信息。值得一提的是,在u8g2_d_setup.c中由很多针对ssd1306(兼容ssd1315)设备的初始化函数,这里使用该函数是可以点亮屏幕的,使用其他的则有问题。

u8g2_ssd1315_setup_select.png

OLED的屏幕显示效果如下。

OLED_Effect.jpg

总结

移植现有的u8g2图形库,完成需要的回调函数,在OLED屏幕上显示信息还是很方便的,可以很快地使用外设,便于在不同平台之间使用。

收藏 评论0 发布时间:2025-7-3 23:15

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版