[002] [ESP32开发笔记] u8g2移植到esp32-idf

本文介绍了如何在ESP32开发环境中,使用VSCode和ESP-IDF插件配置u8g2库来驱动SSD1306 OLED显示屏。通过下载源码、删除不必要的驱动、修改CMakeLists.txt、定制回调函数以及初始化显示,实现了软件模拟SPI通信。最后展示了初始化OLED和显示 HelloWorld 的示例代码。
摘要由CSDN通过智能技术生成

芯片型号:ESP32-S2-MINI-1
开发环境:VS Code + ESP-IDF插件

  • 从官方下载u8g2源码:u8g2
  • 复制csrc文件夹到工程目录下
    在这里插入图片描述
  • 将不必要的外设驱动(u8x8_d_xxx.c)删除,只保留需要使用的驱动(u8g2_d_memory.cu8g2_d_setup.c要保留),下面以ssd1306为例,保留u8x8_d_ssd1306_128x64_noname.c文件
    在这里插入图片描述
  • 删除后,将c/h文件独立放在两个文件夹下:
u8g2
    ├─inc
    │      mui.h
    │      mui_u8g2.h
    │      u8g2.h
    │      u8x8.h
    │      
    └─src
            mui.c
            mui_u8g2.c
            u8g2_bitmap.c
            u8g2_box.c
            u8g2_buffer.c
            u8g2_button.c
            u8g2_circle.c
            u8g2_cleardisplay.c
            u8g2_d_memory.c
            u8g2_d_setup.c
            u8g2_font.c
            u8g2_fonts.c
            u8g2_hvline.c
            u8g2_input_value.c
            u8g2_intersection.c
            u8g2_kerning.c
            u8g2_line.c
            u8g2_ll_hvline.c
            u8g2_message.c
            u8g2_polygon.c
            u8g2_selection_list.c
            u8g2_setup.c
            u8log.c
            u8log_u8g2.c
            u8log_u8x8.c
            u8x8_8x8.c
            u8x8_byte.c
            u8x8_cad.c
            u8x8_capture.c
            u8x8_debounce.c
            u8x8_display.c
            u8x8_d_ssd1306_128x64_noname.c
            u8x8_fonts.c
            u8x8_gpio.c
            u8x8_input_value.c
            u8x8_message.c
            u8x8_selection_list.c
            u8x8_setup.c
            u8x8_string.c
            u8x8_u16toa.c
            u8x8_u8toa.c
  • u8g2文件夹放在components组件下
    在这里插入图片描述
  • 修改components组件的CMakeLists.txt
# components组件编译时会被自动构建(依据idf_component_register包含的头文件)
file(GLOB_RECURSE SOURCES u8g2/src/*.c)
idf_component_register(SRCS ${SOURCES}
                       INCLUDE_DIRS "u8g2/inc") 
  • 删除u8g2_d_setup.c中不必要的内容,只保留u8g2_Setup_ssd1306_128x64_noname_f函数
#include "u8g2.h"

/* ssd1306 f */
void u8g2_Setup_ssd1306_128x64_noname_f(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb)
{
  uint8_t tile_buf_height;
  uint8_t *buf;
  u8g2_SetupDisplay(u8g2, u8x8_d_ssd1306_128x64_noname, u8x8_cad_001, byte_cb, gpio_and_delay_cb);
  buf = u8g2_m_16_8_f(&tile_buf_height);
  u8g2_SetupBuffer(u8g2, buf, tile_buf_height, u8g2_ll_hvline_vertical_top_lsb, rotation);
}
  • 删除u8g2_d_memory.c中不必要的内容,只保留u8g2_m_16_8_f函数
#include "u8g2.h"

uint8_t *u8g2_m_16_8_f(uint8_t *page_cnt)
{
  #ifdef U8G2_USE_DYNAMIC_ALLOC
  *page_cnt = 8;
  return 0;
  #else
  static uint8_t buf[1024];
  *page_cnt = 8;
  return buf;
  #endif
}
  • main组件中新建oled.coled.h
  • oled.h包含如下头文件
#ifndef __OLED_H_
#define __OLED_H_

#include "u8g2.h"
#include "u8x8.h"

void oled_init(void);

#endif
  • oled.c编写u8g2的GPIO和延时回调函数,下面以软件模拟spi为例
#define OLED_SCK    (36U)
#define OLED_SDA    (35U)
#define OLED_RST    (34U)
#define OLED_DC     (33U)

u8g2_t u8g2;

static void oled_gpio_init(void)
{
    gpio_config_t io_conf = {
        .pin_bit_mask = (1ULL << OLED_SCK) | (1ULL << OLED_SDA) | (1ULL << OLED_RST) | (1ULL << OLED_DC),
        .mode = GPIO_MODE_OUTPUT,
        .pull_up_en = GPIO_PULLUP_DISABLE,
        .pull_down_en = GPIO_PULLDOWN_ENABLE,
        .intr_type = GPIO_INTR_DISABLE          // GPIO interrupt type 
    };
    gpio_config(&io_conf);
}

uint8_t gpio_and_delay_cb(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{
    switch (msg)
    {
    case U8X8_MSG_GPIO_AND_DELAY_INIT:
        oled_gpio_init();                    
        break;
    case U8X8_MSG_GPIO_SPI_DATA:
        gpio_set_level(OLED_SDA, arg_int);
        break;
    case U8X8_MSG_GPIO_SPI_CLOCK:
        gpio_set_level(OLED_SCK, arg_int);
        break;        
    case U8X8_MSG_GPIO_CS:  // CS默认接地
        break;
    case U8X8_MSG_GPIO_DC:
        gpio_set_level(OLED_DC, arg_int);
        break;
    case U8X8_MSG_GPIO_RESET:
        gpio_set_level(OLED_RST, arg_int);
        break;
    case U8X8_MSG_DELAY_MILLI:
        vTaskDelay(arg_int / portTICK_PERIOD_MS);	// 1000hz
        break;
    default:
        return 0;   //A message was received which is not implemented, return 0 to indicate an error
    }
  return 1;
}
  • 然后调用u8g2_Setup_ssd1306_128x64_noname_f函数初始化u8g2
u8g2_Setup_ssd1306_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_4wire_sw_spi, gpio_and_delay_cb);
旋转/镜像描述
U8G2_R0无旋转,横向
U8G2_R190度顺时针旋转
U8G2_R2顺时针旋转 180 度
U8G2_R3270度顺时针旋转
U8G2_MIRROR无旋转、横向、显示内容镜像(v2.6.x)

其中u8x8_byte_4wire_sw_spi是u8g2帮我们编写好的软件模拟spi驱动代码,此外,还自带以下几种传输字节的方式:

字节程序描述
u8x8_byte_4wire_sw_spi标准 8 位 SPI 通信,带“四针”(SCK、MOSI、DC、CS)
u8x8_byte_3wire_sw_spi9 位“三针”通信(SCK、MOSI、CS)
u8x8_byte_8bit_6800mode并行接口,6800格式
u8x8_byte_8bit_8080mode并行接口,8080格式
u8x8_byte_sw_i2c两线制,I2C 通信
u8x8_byte_ks0108KS0108控制器专用接口

函数内部宏的含义为:

信息描述
U8X8_MSG_BYTE_INIT在显示的初始化阶段发送一次。
U8X8_MSG_BYTE_SET_DC设置数据/命令引脚的电平。arg_int包含预期的输出水平。用于u8x8_gpio_SetDC(u8x8, arg_int)向 GPIO 过程发送消息。
U8X8_MSG_BYTE_START_TRANSFER在此处设置片选线。 u8x8->display_info->chip_enable_level包含预期水平。用于u8x8_gpio_SetCS(u8x8, u8x8->display_info->chip_enable_level)调用 GPIO 过程。
U8X8_MSG_BYTE_SEND发送一个或多个字节,位于arg_ptrarg_int包含字节数。
U8X8_MSG_BYTE_END_TRANSFER取消选择设备。从这里使用 CS 级别:u8x8->display_info->chip_disable_level.

硬件通信需要自己实现,文末会给出参考链接。

  • 最后对oled进行初始化
void oled_init(void)
{
    u8g2_Setup_ssd1306_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_4wire_sw_spi, gpio_and_delay_cb);  // 初始化u8g2

    u8g2_InitDisplay(&u8g2);                // 初始化显示器
    u8g2_SetPowerSave(&u8g2, 0);            // 唤醒显示器
    u8g2_ClearBuffer(&u8g2);                // 清空缓冲区的内容
}
  • 测试hello world
u8g2_SetFont(&u8g2, u8g2_font_6x12_mr); // 设置英文字体
u8g2_DrawStr(&u8g2, 0, 30, "hello world");
u8g2_SendBuffer(&u8g2);		// 一定要发送buffer

在这里插入图片描述


参考:

  1. 移植到新的 MCU 平台
  2. ESP32 U8G2 library support
  3. 移植u8g2单色图形库驱动OLED
  4. YouTube教程
  • 5
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
乐鑫ESP32 ESP-IDF是一个开源的物联网开发框架,用于开发和编程ESP32芯片。在Windows操作系统上安装乐鑫ESP32 ESP-IDF需要进行以下几个步骤: 1. 首先,你需要下载ESP-IDF Windows Installer。官方提供了一个下载链接,你可以通过该链接下载安装程序。 2. 安装ESP-IDF插件和其他相关插件。这些插件可以帮助你更好地使用ESP-IDF开发框架。 3. 在安装过程中,如果勾选了"Run ESP-IDF PowerShell Environment"选项,安装程序会在所选提示符窗口中启动ESP-IDF。这将为你提供一个命令行环境,方便你进行ESP32开发和编程。 通过以上步骤,你就可以成功安装乐鑫ESP32 ESP-IDF,并开始使用该框架进行物联网项目的开发了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [【WiFi模组】乐鑫ESP32 基于ESP-IDF的原生SDK二次开发](https://blog.csdn.net/qq_33033059/article/details/125695660)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [【乐鑫ESP32】ESP-IDF+VSCode环境搭建](https://blog.csdn.net/weixin_45381001/article/details/123121765)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柯西的彷徨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值