4178|18

291

帖子

5

TA的资源

纯净的硅(中级)

楼主
 

【平头哥RVB2601创意应用开发】实践2-移植U8g2图形库 [复制链接]

 
 

RVB2601板子自带了一块128x64的OLED单色屏幕,可以用来进行图形和文字的显示。RVB2601的例程中,有使用LVGL库进行OLED显示的例程,LVGL也是一个十分优秀的图形库,支持彩色界面的设计。由于前段时间刚好在用另一个支持单色显示的图形库——U8g2,所以就想着尝试将U8g2库移植到RVB2601板子中。

U8g2简介

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

U8g2源码的开源库地址:

链接已隐藏,如需查看请登录或者注册

移植步骤

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

精简c源码

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

去掉无用的驱动文件

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

精简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
}

编写移植函数

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

因为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");
}

源码加入到CDK编译

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

添加u8g2源码到工程

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

主函数

在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;
}


 

测试效果

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

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


 

总结

本篇介绍了如何将U8g2图形库移植到RVB2601板子中,通过CDK开发环境进行编译测试。

最新回复

内容很不错!请问可以麻烦作者同步在平头哥芯片开放社区的博文板块吗~   详情 回复 发表于 2023-7-5 09:44
点赞 关注
 
 

回复
举报

6828

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

 

 
 
 

回复

7062

帖子

11

TA的资源

版主

板凳
 
可以呀,这个相比LVGL占用资料要少很多吧,我原来想用wifi就用不了lvgl.

点评

确实,我现在把LVGL加进来,就RAM不够了,这块芯片RAM还是太小  详情 回复 发表于 2022-4-19 21:15
具体占用多少还没太关注,不过U8g2是专为单色屏设计的,代码量更少  详情 回复 发表于 2022-3-28 23:24
 
 
 

回复

291

帖子

5

TA的资源

纯净的硅(中级)

4
 
lugl4313820 发表于 2022-3-27 22:35 可以呀,这个相比LVGL占用资料要少很多吧,我原来想用wifi就用不了lvgl.

具体占用多少还没太关注,不过U8g2是专为单色屏设计的,代码量更少

点评

我也得学会使用U8G2了,支持彩色显示吗?  详情 回复 发表于 2022-3-28 23:43
 
 
 

回复

7062

帖子

11

TA的资源

版主

5
 
DDZZ669 发表于 2022-3-28 23:24 具体占用多少还没太关注,不过U8g2是专为单色屏设计的,代码量更少

我也得学会使用U8G2了,支持彩色显示吗?

点评

貌似不支持彩色  详情 回复 发表于 2022-3-29 22:50
 
 
 

回复

291

帖子

5

TA的资源

纯净的硅(中级)

6
 
lugl4313820 发表于 2022-3-28 23:43 我也得学会使用U8G2了,支持彩色显示吗?

貌似不支持彩色

 
 
 

回复

7062

帖子

11

TA的资源

版主

7
 
我按你的教程移植了一下,可是还是不行,能不能看看你的工程,谢谢了。
 
 
 

回复

291

帖子

5

TA的资源

纯净的硅(中级)

8
 
lugl4313820 发表于 2022-4-2 01:37 我按你的教程移植了一下,可是还是不行,能不能看看你的工程,谢谢了。

工程代码已分享至gitee仓库:

链接已隐藏,如需查看请登录或者注册

点评

非常感谢,下载可以运行了,谢谢!  详情 回复 发表于 2022-4-4 23:59
 
 
 

回复

7062

帖子

11

TA的资源

版主

9
 
DDZZ669 发表于 2022-4-4 21:10 工程代码已分享至gitee仓库:https://gitee.com/xxpcb/rbv2601-test

非常感谢,下载可以运行了,谢谢!

 
 
 

回复

309

帖子

0

TA的资源

纯净的硅(初级)

10
 

感觉比LVGL好用多了

 
 
 

回复

553

帖子

3

TA的资源

纯净的硅(初级)

11
 
lugl4313820 发表于 2022-3-27 22:35 可以呀,这个相比LVGL占用资料要少很多吧,我原来想用wifi就用不了lvgl.

确实,我现在把LVGL加进来,就RAM不够了,这块芯片RAM还是太小

点评

   我的开发板变砖了,没办法再继续了,你们加油吧!  详情 回复 发表于 2022-4-19 22:38
 
 
 

回复

7062

帖子

11

TA的资源

版主

12
 
xinmeng_wit 发表于 2022-4-19 21:15 确实,我现在把LVGL加进来,就RAM不够了,这块芯片RAM还是太小

   我的开发板变砖了,没办法再继续了,你们加油吧!

 
 
 

回复

218

帖子

0

TA的资源

一粒金砂(高级)

13
 

请问一下我移植的时候出undefined reference to `u8g2_FirstPage'这种错误是怎么回事?

 

点评

需要#include "u8g2.h"  详情 回复 发表于 2022-4-25 23:52
 
 
 

回复

291

帖子

5

TA的资源

纯净的硅(中级)

14
 
打破传统 发表于 2022-4-25 16:20 请问一下我移植的时候出undefined reference to `u8g2_FirstPage'这种错误是怎么回事?  

需要#include "u8g2.h"

点评

解决了,刚我重新在工程右键下添加了源文件目录。编译通过了,是不是我添加源文件方式有问题么?不知道怎么回事!谢谢你提供的图像界面移植工程  详情 回复 发表于 2022-4-26 17:03
刚开始我也以为是,加了也一样,总感觉这个软件找不到这个头文件似的,但是按照你的方法我也在project settings中添加了搜索目录的,奇怪的是我下载你的工程编译没问题,把你的工程里的源文件拷贝到我的工程目录下编  详情 回复 发表于 2022-4-26 16:53
 
 
 

回复

218

帖子

0

TA的资源

一粒金砂(高级)

15
 
DDZZ669 发表于 2022-4-25 23:52 需要#include "u8g2.h"

刚开始我也以为是,加了也一样,总感觉这个软件找不到这个头文件似的,但是按照你的方法我也在project settings中添加了搜索目录的,奇怪的是我下载你的工程编译没问题,把你的工程里的源文件拷贝到我的工程目录下编译还是报这个错

 
 
 

回复

218

帖子

0

TA的资源

一粒金砂(高级)

16
 
DDZZ669 发表于 2022-4-25 23:52 需要#include "u8g2.h"

解决了,刚我重新在工程右键下添加了源文件目录。编译通过了,是不是我添加源文件方式有问题么?不知道怎么回事!谢谢你提供的图像界面移植工程

 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

17
 

 请问一下,这是个什么情况?NO rule make target.....

 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(中级)

18
 

内容很不错!请问可以麻烦作者同步在平头哥芯片开放社区的博文板块吗~

点评

当时参加活动的时候已经同步过了呢  详情 回复 发表于 2023-7-7 23:40
 
 
 

回复

291

帖子

5

TA的资源

纯净的硅(中级)

19
 
平头哥小助手 发表于 2023-7-5 09:44 内容很不错!请问可以麻烦作者同步在平头哥芯片开放社区的博文板块吗~

当时参加活动的时候已经同步过了呢

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表