应用实战精解系列(十五):基于RVB2601移植U8g2图形库

简介: 应用实战精解系列(十五):基于RVB2601移植U8g2图形库

编辑语:

芯片开放社区(OCC)面向广大开发者推出应用实战系列内容,通过分享开发者实战开发案例,总结应用开发经验,梳理开发中的常见问题及解决方案,为后续参与的开发者提供更多参考与借鉴。


在RVB2601的前期开发中,许多开发者都选择了移植LVGL库来实现OLED屏的功能展示,以此为后续创意应用开发奠定基础。而除了LVGL库外,U8g2库同样是一款非常优秀的图形库,由于其主要应用于嵌入式设备,所以也适用于RVB2601。为了给大家在创意应用开发中提供更多图形库的选择,本期内容我们就为大家分享如何将U8g2库移植到RVB2601中,并通过剑池CDK进行编译测试。


01 前言

RVB2601板子自带了一块128x64的OLED单色屏幕,可以用来进行图形和文字的显示。RVB2601的例程中,有使用LVGL库进行OLED显示的例程,LVGL也是一个十分优秀的图形库,支持彩色界面的设计。


由于前段时间刚好在用另一个支持单色显示的图形库——U8g2,所以就想着尝试将U8g2库移植到RVB2601板子中。


02 U8g2简介

U8g2 是一个用于嵌入式设备的单色图形库。U8g2支持单色OLED和LCD,并支持如SSD1306等多种类型的OLED驱动。


U8g2源码的开源库地址:

https://github.com/olikraus/u8g2

图片.png


03 移植步骤

首先下载U8g2的源码,因为RVB2601板子主要是使用C语言编程,所以只需关注源码中的C源码部分,即csrc文件夹下的文件。


1.精简c源码

U8g2支持多种显示驱动的屏幕,因为源码中也包含了各个驱动对应的文件,为了减小整个工程的代码体积,在移植U8g2时,可以删除一些无用的文件。


① 去掉无用的驱动文件

这些驱动文件通常是u8x8_d_xxx.c,xxx包括驱动的型号和屏幕分辨率。RVB2601板子的OLED,可以使用u8x8_ssd1306_128x64_noname.c这个文件,其它的屏幕驱动文件可以删掉。

图片.png


② 精简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_1就好,其它的可以删掉或注释掉


#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
}


2.编写移植函数

精简源码之后,还需要编写如下的配置函数。


因为RVB2601板子上的OLED是SPI接口,因此需要在函数中,调用对应引脚的高低电平设置函数,以实现U8g2对OLED的SPI引脚的控制。另外还要赋予U8g2一个oled的初始化函数,可以使用CDK中hello_world程序中的oled_init函数。最后还要赋予U8g2一个延时函数,可以使用CDK中hello_world程序中的Delay函数。


① u8x8_gpio_and_delay


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_SPI_DATA:
            lcd_sdin((uint8_t)arg_int); //SPI - MOSI
            break;
        case U8X8_MSG_GPIO_SPI_CLOCK: //SPI - CLK
            lcd_sclk(arg_int);
            break;
        case U8X8_MSG_GPIO_AND_DELAY_INIT:
            oled_init(); //OLED初始化
            Delay(1);
            break;
        case U8X8_MSG_DELAY_MILLI:
            Delay(arg_int); //延时
            break;
        case U8X8_MSG_GPIO_CS: //SPI - CS
            lcd_cs((uint8_t)arg_int);
        case U8X8_MSG_GPIO_DC:
            lcd_dc((uint8_t)arg_int); //SPI - MISO
            break;
        case U8X8_MSG_GPIO_RESET:
            break;
    }
    return 1;
}


② u8g2Init

U8g2的初始化,可以调用下面这个u8g2_Setup_ssd1306_128x64_noname_1函数(最后的1代表128字节页大小),该函数的4个参数含义:

  • u8g2:传入的U8g2结构体
  • U8G2_R0:默认使用U8G2_R0即可(用于配置屏幕是否要旋转)
  • u8x8_byte_4wire_sw_spi:使用4线的软件SPI驱动,该函数由U8g2源码提供
  • u8x8_gpio_and_delay:就是上面我们写的配置函数


void u8g2Init(u8g2_t *u8g2)
{
    u8g2_Setup_ssd1306_128x64_noname_f(u8g2, U8G2_R0, u8x8_byte_4wire_sw_spi, u8x8_gpio_and_delay);  // 初始化 u8g2 结构体
    u8g2_InitDisplay(u8g2); // 根据所选的芯片进行初始化工作,初始化完成后,显示器处于关闭状态
    u8g2_SetPowerSave(u8g2, 0); // 打开显示器
}


注:以上函数可以放到hello_world例程的oled.c文件中。


③ 显示测试函数

使用U8g2提供的测试函数,用于查看显示效果


void draw(u8g2_t *u8g2)
{
    u8g2_SetFontMode(u8g2, 1); /*字体模式选择*/
    u8g2_SetFontDirection(u8g2, 0); /*字体方向选择*/
    u8g2_SetFont(u8g2, u8g2_font_inb24_mf); /*字库选择*/
    u8g2_DrawStr(u8g2, 0, 20, "U");
    u8g2_SetFontDirection(u8g2, 1);
    u8g2_SetFont(u8g2, u8g2_font_inb30_mn);
    u8g2_DrawStr(u8g2, 21,8,"8");
    u8g2_SetFontDirection(u8g2, 0);
    u8g2_SetFont(u8g2, u8g2_font_inb24_mf);
    u8g2_DrawStr(u8g2, 51,30,"g");
    u8g2_DrawStr(u8g2, 67,30,"\xb2");
    u8g2_DrawHLine(u8g2, 2, 35, 47);
    u8g2_DrawHLine(u8g2, 3, 36, 47);
    u8g2_DrawVLine(u8g2, 45, 32, 12);
    u8g2_DrawVLine(u8g2, 46, 33, 12);
    u8g2_SetFont(u8g2, u8g2_font_4x6_tr);
    u8g2_DrawStr(u8g2, 1,54,"github.com/olikraus/u8g2");
}


3.源码加入到CDK编译

在CDK的hello_world例程的基础上进行修改。


① 添加u8g2源码到工程

左侧工程目录添加U8g2源码,然后工程上右键,第一个Options for xxx,继续进行工程的配置,主要是添加U8g2的头文件搜寻目录,如下:

图片.png


② 主函数

在hello_world例程的基础上,修改主函数,主要就是去掉原来的oled_init,改用u8g2Init,while(1)中调用U8g2的测试函数


#include <stdlib.h>
#include <string.h>
#include <aos/aos.h>
#include "aos/cli.h"
#include "main.h"
#include "app_init.h"
#include "oled.h"
#define TAG "app"
int main(void)
{
    board_yoc_init();
    LOGD(TAG, "%s\n", aos_get_app_version());
    //oled_init();
    u8g2_t u8g2;
    u8g2Init(&u8g2);
    while (1) 
    {
        //LOGD(TAG, "Hello world! YoC");
        u8g2_FirstPage(&u8g2);
        do
        {
            draw(&u8g2);
        } while (u8g2_NextPage(&u8g2));
        //aos_msleep(1000);
    }
    return 0;
}


04 测试效果

CDK中编译程序,下载运行,效果如下:

图片.png


利用U8g2库,可以方便的进行图形的和字符的显示,测试视频:

图片.png


05 下期预告

U8g2库的成功移植,为RVB2601的开发提供了更多图形库的选择,期待大家在不同的应用场景中灵活移植和应用这两个图形库。下期内容我们将为大家介绍如何移植KV组件到RVB2601欢迎大家持续关注应用实战精解系列内容。

目录
打赏
0
0
0
0
1042
分享
相关文章
开放下载!《平头哥剑池CDK快速上手指南》
自定义自己平台的 SDK,平头哥芯片开放社区第三本系列电子书《平头哥剑池CDK快速上手指南》现已开放下载,立即下载阅读吧!
30041 0
开放下载!《平头哥剑池CDK快速上手指南》
阿里云搭建图片服务器
网站开发过程中对于图片的存储,我选择使用fastdfs分布式文件系统存储图片,图片信息(访问路径,文件名称,文件大小......)保存在mysql数据库。
阿里云搭建图片服务器
服务网格容灾系列场景(二):使用服务网格应对可用区级故障容灾
文章介绍了如何使用阿里云服务网格ASM和容器服务Kubernetes版ACK应对可用区级故障容灾,通过多可用区部署、流量管理和可观测性保障业务连续性,确保在单个可用区故障时,其他可用区仍能正常提供服务。
异步日志:性能优化的金钥匙
本文主要介绍了Log4j2框架的核心原理、实践应用以及一些实用的小Tips,力图揭示Log4j2这一强大日志记录工具在现代分布式服务架构运维中的关键作用。
2025年2月阿里云服务器价格与选购指南
随着云计算技术的普及,阿里云在2025年推出了多款高性价比的云服务器产品。本文基于《2025年阿里云服务器收费价格表》,从配置选择、适用场景到优惠活动,为您提供全面的购买参考。涵盖入门级轻量应用服务器、经济型e实例、企业级通用算力型u1实例、高性能服务器及GPU服务器等,适合个人开发者到大型企业的不同需求。详细对比各类配置的价格与性能,并提供抢购秒杀、续费优惠及代金券组合使用等省钱策略,助您降低上云成本。立即访问云小站活动页面领取最新折扣,开启高效云端之旅!
来咯,他来咯 看GitHub Codespaces 如何帮助缩短开发设置时间
来咯,他来咯 看GitHub Codespaces 如何帮助缩短开发设置时间
467 0
go 基于gin编写encode、decode、base64加密接口
go 基于gin编写encode、decode、base64加密接口
125 2
STM32CubeMX FreeRTOS u8g2图片菜单制作
STM32CubeMX FreeRTOS u8g2图片菜单制作
455 8
内网/局域网IP地址申请https证书方法
为内网/局域网IP地址申请HTTPS证书,可增强数据传输的安全性。首先确定固定的内网IP地址,选择可信的证书颁发机构,注册并申请免费或付费SSL证书,提交相关信息,支付费用(如有)。证书申请成功后,下载并配置于服务器,确保通过浏览器访问时显示为安全连接。注意定期更新证书,确保持续的安全保障。此过程适用于局域网内部通信加密,提升内网服务的安全水平。
【那些反爬和反反爬】JA3指纹
【那些反爬和反反爬】JA3指纹
1023 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问