IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> [002] [ESP32开发笔记] u8g2移植到esp32-idf -> 正文阅读

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

芯片型号: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教程
  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-02-24 15:30:20  更:2022-02-24 15:31:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:21:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码