液晶屏驱动 U8g2 移植

发布于 2018-09-23 19:58:27
    本帖最后由 wuhanstudio 于 2019-4-21 22:24 编辑


u8g2_logo.png

U8g2 是一个我非常喜欢的单侧液晶屏驱动,所以试了一下能不能在 rt-thread 上运行。

U8g2 支持非常多的单色液晶屏驱动



Todo List: ( 完成了的部分我会随时在这里更新 )

[ ● ] 硬件 I2C / Hardware I2C
[ ● ] 硬件 SPI / Hardware SPI
[ ● ] 软件 I2C / Software I2C
[ ● ] 软件 SPI / Software SPI (感谢 #11 jzz 帮助)
[ ● ] 8080 & 6800
[ ● ] 不同单色屏配置模板




试了一下在 STM32F103RCT6 上成功运行 https://github.com/wuhanstudio/rt-u8g2
用的是 GPIO 模拟 I2C 总线,液晶屏旁边是 I2C 总线的 YL-40 模块,用来测试 I2C 总线是否正常工作。

IMG_20180923_192537.jpg

IMG_20181218_224628.jpg

st7920.jpg

因为我手头没有那么多开发板和液晶屏,所以没办法全部测试。
但我有时间会多测试一些的,欢迎大家一起帮忙测试不同的板子和液晶屏 :loveliness:



项目主页: https://github.com/wuhanstudio/rt-u8g2

相关项目: https://github.com/wuhanstudio/u8g2-arm-linux/
(在 Arm-Linux 上的移植)



查看更多

关注者
0
被浏览
9.3k
40 个回答
bernard
bernard 2018-09-24
欢迎加入到RT-Thread package中,这样大家可以通过env & menuconfig直接使用
armink
armink 2018-09-24
厉害,这个库还是挺实用的,期待作成软件包哈
wuhanstudio
wuhanstudio 2018-09-24
bernard 发表于 2018-9-24 11:00
欢迎加入到RT-Thread package中,这样大家可以通过env & menuconfig直接使用


因为手上只有 I2C 接口的液晶屏,之后我试下 GPIO 和 SPI 的 LCD,如果也能正常运行我提交一个 PR 把 ;)
wuhanstudio
wuhanstudio 2018-09-24
armink 发表于 2018-9-24 13:05
厉害,这个库还是挺实用的,期待作成软件包哈


谢谢 :) 我先多测试一些屏,比较稳定后我会提交一个 PR
armink
armink 2018-09-24
GPIO 和 SPI RT-Thread 也有设备框架,都使用框架后,这个软件包的通用性就非常强了。
wuhanstudio
wuhanstudio 2018-09-24
armink 发表于 2018-9-24 21:19
GPIO 和 SPI RT-Thread 也有设备框架,都使用框架后,这个软件包的通用性就非常强了。 ...


确实,硬件 I2C / SPI 我会尽量使用 rt-thread 的 API,软件 I2C / SPI 看样子 rt-thread 有提供。

我刚添加了要之后完成的部分列表,寒假左右应当会慢慢完成。
yushigengyu
yushigengyu 认证专家 2018-09-25
这个库我在多个平台移植过 可移植性很强
jzz
jzz 2018-11-30
    本帖最后由 jzz 于 2018-11-30 13:18 编辑


我把u8g2的4线SPI模式ssd1306示例写好了,代码如下:
ssd1306_example_4wire_sw_spi.c
//这里就不写include了,和包里已经有的那个i2cexample一样就行
void ssd1306_example_4wire_sw_spi(int argc,char *argv[])
{
u8g2_t u8g2;

u8g2_Setup_ssd1306_128x64_noname_f( &u8g2, U8G2_R0, u8x8_byte_4wire_sw_spi, u8x8_rt_sw_spi_gpio_and_delay);

u8g2_InitDisplay(&u8g2);
u8g2_SetPowerSave(&u8g2, 0);

/* full buffer example, setup procedure ends in _f */
u8g2_ClearBuffer(&u8g2);
u8g2_SetFont(&u8g2, u8g2_font_baby_tf);
u8g2_DrawStr(&u8g2, 1, 18, "U8g2 on RT-Thread 中文");
u8g2_SendBuffer(&u8g2);

u8g2_SetFont(&u8g2, u8g2_font_unifont_t_symbols);
u8g2_DrawGlyph(&u8g2, 112, 56, 0x2603 );
u8g2_SendBuffer(&u8g2);

rt_thread_delay(2000);

u8g2_DrawBox(&u8g2,1,1,128,64);
u8g2_SendBuffer(&u8g2);
}
MSH_CMD_EXPORT(ssd1306_example_4wire_sw_spi, sw 4wire spi ssd1306 sample);
在u8g2_port.c中添加一个函数
uint8_t u8x8_rt_sw_spi_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:
//Function which implements a delay, arg_int contains the amount of ms
//set mode
rt_pin_mode(pin_clk,PIN_MODE_OUTPUT);//d0 a5 15 d1 a7 17 res b0 18 dc b1 19 cs a4 14
rt_pin_mode(pin_mosi,PIN_MODE_OUTPUT);
rt_pin_mode(pin_res,PIN_MODE_OUTPUT);
rt_pin_mode(pin_dc,PIN_MODE_OUTPUT);
rt_pin_mode(pin_cs,PIN_MODE_OUTPUT);
//set value
rt_pin_write(pin_clk,1);
rt_pin_write(pin_mosi,1);
rt_pin_write(pin_res,1);
rt_pin_write(pin_dc,1);
rt_pin_write(pin_cs,1);
break;

case U8X8_MSG_DELAY_MILLI:
//Function which implements a delay, arg_int contains the amount of ms
rt_thread_delay(arg_int);
break;

case U8X8_MSG_DELAY_10MICRO:
//Function which delays 10us
break;

case U8X8_MSG_DELAY_100NANO:
//Function which delays 100ns
break;

case U8X8_MSG_GPIO_SPI_CLOCK:
//Function to define the logic level of the clockline
if (arg_int) rt_pin_write(pin_clk,1);
else rt_pin_write(pin_clk,0);
break;

case U8X8_MSG_GPIO_SPI_DATA:
//Function to define the logic level of the data line to the display
if (arg_int) rt_pin_write(pin_mosi,1);
else rt_pin_write(pin_mosi,0);
break;

case U8X8_MSG_GPIO_CS:
// Function to define the logic level of the CS line
if(arg_int) rt_pin_write(pin_cs,1);
else rt_pin_write(pin_cs,0);
break;

case U8X8_MSG_GPIO_DC:
//Function to define the logic level of the Data/ Command line
if(arg_int) rt_pin_write(pin_dc,1);
else rt_pin_write(pin_dc,0);
break;

case U8X8_MSG_GPIO_RESET:
//Function to define the logic level of the RESET line
if (arg_int) rt_pin_write(pin_res,1);
else rt_pin_write(pin_res,0);
break;

default:
return 0; //A message was received which is not implemented, return 0 to indicate an error
}
return 1;
}
pin_dc,pin_cs之类的是gpio的定义,根据自己的引脚选择,我这里是
#define pin_clk                15
#define pin_mosi 17
#define pin_res 18
#define pin_dc 19
#define pin_cs 14
然后在对应的u8g2_port.h文件中添加声明,把新加的.c添加到sconscript脚本中去,编译就行,另外我有几个问题:
* 引脚定义宏能不能加入到Kconfig中去,然后c代码从中导入?

* 经过逻辑分析仪分析,我这个程序的效率比不使用图形库的裸机测试程序慢十倍左右,这正常吗,还是说底层回调函数不用rtt的gpio设备框架能快很多?

* 这里的多人协作是基于bsp的,然而我用的stm32f10x和官方bsp中的不一样,多处参数需要修改,这种情况下,做点小贡献怕是有点难?不知道怎么操作

* 这个软件包在楼主的仓库里面,如果其他人为这个软件包添砖加瓦是不是应该提交到楼主的仓库?

* 我这里用的c8t6flash有点紧张,有没有什么减小体积的方法,总感觉链接了一堆别的什么东西


AdamShen
AdamShen 2018-12-01
最近刚用u8g2做了个项目,效果挺好。针对flash空间紧张提点建议。

1、u8g2_DrawStr只能显示ascii字符,中文显示建议 'u8g2_DrawUTF8' , u8g2_DrawGlyph要输入unicode,不直观。

2、字库本身占了不少内存,flash体积小可删减大部分字库,需要添加新字库时参考下方链接自行生成
jzz
jzz 2018-12-01
AdamShen 发表于 2018-12-1 08:54
最近刚用u8g2做了个项目,效果挺好。针对flash空间紧张提点建议。

1、u8g2_DrawStr只能显示ascii字符,中 ...


get到了,谢谢
wuhanstudio
wuhanstudio 2018-12-04
jzz 发表于 2018-11-30 13:09
我把u8g2的4线SPI模式ssd1306示例写好了,代码如下:
ssd1306_example_4wire_sw_spi.c
在u8g2_port.c中添加 ...


不好意思,最近在申请学校没怎么更新库,
可以在这里提交一个 Pull Request,我之后测试一下,把您的修改 merge 进来

https://github.com/wuhanstudio/rt-u8g2/pulls
wuhanstudio
wuhanstudio 2018-12-18
jzz 发表于 2018-11-30 13:09
我把u8g2的4线SPI模式ssd1306示例写好了,代码如下:
ssd1306_example_4wire_sw_spi.c
在u8g2_port.c中添加 ...


感谢您的帮助,我刚刚测试通过,并且已经更新了 4wire_sw_spi

https://github.com/wuhanstudio/rt-u8g2/blob/master/port/u8g2_port.c
jzz
jzz 2018-12-21
wuhanstudio 发表于 2018-12-18 23:01
感谢您的帮助,我刚刚测试通过,并且已经更新了 4wire_sw_spi

https://github.com/wuhanstudio/rt-u8g2/ ...


好多天没上论坛没看到,,,在这里祝楼主考研顺利了
wuhanstudio
wuhanstudio 2018-12-21
jzz 发表于 2018-12-21 22:32
好多天没上论坛没看到,,,在这里祝楼主考研顺利了


谢谢,不过其实我是申请国外的Ph.D. ;P 最近我试试移植硬件SPI
shao7936626
shao7936626 2019-05-06
楼主你好,我看/port目录下是cpp文件,我用keil5的话,如何解决编译的问题啊
wuhanstudio
wuhanstudio 2019-05-22
shao7936626 发表于 2019-5-6 15:58
楼主你好,我看/port目录下是cpp文件,我用keil5的话,如何解决编译的问题啊


您好,不好意思最近准备毕业答辩的事情没有关注论坛了,Keil 是可以支持 C++/CPP 混合编译的
wuhanstudio
wuhanstudio 2019-05-22
wuhanstudio 发表于 2019-5-22 15:58
您好,不好意思最近准备毕业答辩的事情没有关注论坛了,Keil 是可以支持 C++/CPP 混合编译的 ...


刚意识到原来您已经在 issue 解决了,哈哈

https://github.com/wuhanstudio/rt-u8g2/issues
wyzjoyful
wyzjoyful 2019-09-23
    本帖最后由 wyzjoyful 于 2019-9-24 00:34 编辑



wyzjoyful
wyzjoyful 2019-09-24
    本帖最后由 wyzjoyful 于 2019-9-24 00:54 编辑


/*
* Copyright (c) 2006-2018, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2018-11-5 SummerGift first version
*/

#ifndef __DRV_SPI_H_
#define __DRV_SPI_H_

#include
#include "rtdevice.h"
#include
#include
#include "drv_dma.h"

rt_err_t rt_hw_spi_device_attach(const char *bus_name, const char *device_name, GPIO_TypeDef* cs_gpiox, uint16_t cs_gpio_pin);

struct stm32_hw_spi_cs
{
GPIO_TypeDef* GPIOx;
uint16_t GPIO_Pin;
};

struct stm32_spi_config
{
SPI_TypeDef *Instance;
char *bus_name;
struct dma_config *dma_rx, *dma_tx;
};

struct stm32_spi_device
{
rt_uint32_t pin;
char *bus_name;
char *device_name;
};

#define SPI_USING_RX_DMA_FLAG (1<<0)
#define SPI_USING_TX_DMA_FLAG (1<<1)

/* stm32 spi dirver class */
struct stm32_spi
{
SPI_HandleTypeDef handle;
struct stm32_spi_config *config;
struct rt_spi_configuration *cfg;

struct
{
DMA_HandleTypeDef handle_rx;
DMA_HandleTypeDef handle_tx;
} dma;

rt_uint8_t spi_dma_flag;
struct rt_spi_bus spi_bus;
};

#endif /*__DRV_SPI_H_ */
刚还是学 rt_rhread 我在menuconfig
│ │ [ ] SSD1306: basic example for I2C OLED (software) │ │
│ │ SSD1306: basic example for SPI OLED (software) │ │
│ │ [ ] ST7920 : basic example for 8080 mode LCD

cons: done reading SConscript files.
scons: Building targets ...
scons: building associated VariantDir targets: build
CC build\packages\u8g2-v1.2.0\examples\ssd1306_12864_4wire_sw_spi_example.o
In file included from packages\u8g2-v1.2.0\port/u8g2_port.h:7:0,
from packages\u8g2-v1.2.0\examples\ssd1306_12864_4wire_sw_spi_example.c:4:
F:\rt-thread\rt-thread-master\rt-thread-master\bsp\stm32\libraries\HAL_Drivers/drv_spi.h:48:5: error: unknown type name 'SPI_HandleTypeDef'
SPI_HandleTypeDef handle;
^
scons: *** [build\packages\u8g2-v1.2.0\examples\ssd1306_12864_4wire_sw_spi_example.o] Error 1
scons: building terminated because of errors.

中 使用了 软件模拟 SPI 编译的时候 这个红色部分报错。 这部分代码是硬件的啊

wyzjoyful
wyzjoyful 2019-09-25
u8g2 的 C 代码中 没有 u8g2.begin(); 那是不是 像以下的这些 都不能用啊

uint8_t u8g2_UserInterfaceSelectionList(u8g2_t *u8g2, const char *title, uint8_t start_pos, const char *sl)

• Description: Display a list of scrollable and selectable options. The user can select one of the options.
• Arguments: ◦ u8g2: A pointer to the u8g2 structure.
◦ start_pos: The element, which is highlighted first (starts with 1).
◦ sl: List of options, one per line (Lines have to be separated with \n).

• Returns: 1 to n for if one of the buttons had been selected. 0 if the user has pressed the home/cancel button.
• See also: begin
•Example:
u8g2.userInterfaceSelectionList("Title", 2, "abcdef\nghijkl\nmnopqr");

wuhanstudio
wuhanstudio 2019-09-25
wyzjoyful 发表于 2019-9-24 00:31
/*
* Copyright (c) 2006-2018, RT-Thread Development Team
*


这个是不是 CubeMX 里忘记配置 SPI 了,还需要在 RT-Thread 的 menuconfig 里面打开 SPI
wyzjoyful
wyzjoyful 2019-09-26
wuhanstudio 发表于 2019-9-25 17:22
这个是不是 CubeMX 里忘记配置 SPI 了,还需要在 RT-Thread 的 menuconfig 里面打开 SPI ...


这个问题 我来回试了几次好了, 我用的是软件模拟的 SPI 不需要在 CubeMx 里配置的。
wyzjoyful
wyzjoyful 2019-09-26
U8G2 是不是不用 C++ 版本, 按键 还有 print 等等 功能 不能用啊
wuhanstudio
wuhanstudio 2019-09-27
wyzjoyful 发表于 2019-9-26 23:43
U8G2 是不是不用 C++ 版本, 按键 还有 print 等等 功能 不能用啊


是的,v1.x.x 是 C 版本,但是 C 发布的时候我还没有移植按键部分,参照 v2.x.x 的 C++ 版本加上就好了
Chaser
Chaser 2019-10-23
    本帖最后由 Chaser 于 2019-10-23 14:55 编辑


AdamShen 发表于 2018-12-1 08:54
最近刚用u8g2做了个项目,效果挺好。针对flash空间紧张提点建议。

1、u8g2_DrawStr只能显示ascii字符,中 ...

我在STM32上测试程序,LCD12864用u8g2库时不能显示中文,只能数字和字母,是怎么回事?谢谢
~BE}%VBZA{B5]49B9AZYGWI.png
IMG_20191023_140112.jpg
wyzjoyful
wyzjoyful 2019-10-25
#ifndef __U8G_PORT_H__
#define __U8G_PORT_H__

#include
#include
#include
//#include

使用软件模拟SPI 的 楼主 要把我注释的那个 去掉,要不然会报错
wuhanstudio
wuhanstudio 2019-10-27
Chaser 发表于 2019-10-23 14:53
我在STM32上测试程序,LCD12864用u8g2库时不能显示中文,只能数字和字母,是怎么回事?谢谢 ...


这个是编译器和文本编辑器对中文处理的原因,可以用 VSCode编辑代码,Keil 编译
xp187oo
xp187oo 2019-11-04
大神~~~~这个U8G2有C版本的吗?只能在C++中调用吗?
wuhanstudio
wuhanstudio 2019-11-04
xp187oo 发表于 2019-11-4 17:21
大神~~~~这个U8G2有C版本的吗?只能在C++中调用吗?


现在有 C 和 C++ 两个版本了,在 env/ 里 pkgs --upgrade 一下, menuconfig 在 version 里就可以看到 C 和 C++ 选项了
921742079
921742079 2019-11-05
显示中文的时候,有的字不能显示出来,有的可以,应该怎么处理?
921742079
921742079 2019-11-05
921742079 发表于 2019-11-5 11:20
显示中文的时候,有的字不能显示出来,有的可以,应该怎么处理?


换字体解决了
xp187oo
xp187oo 2019-11-05
wuhanstudio 发表于 2019-11-4 21:32
现在有 C 和 C++ 两个版本了,在 env/ 里 pkgs --upgrade 一下, menuconfig 在 version 里就可以看到 C ...


大神~~~看到了
wyzjoyful
wyzjoyful 2019-12-15
件 SPI[img=300,0][/img] 在 menuconfig 下选了 [img=300,0]https://www.rt-thread.org/qa/forum.php?mod=image&aid=12702&size=300x300&key=e26409928097678d&nocache=yes&type=fixnone[/img]


#define OLED_SPI_PIN_RES GET_PIN(B, 6)
#define OLED_SPI_PIN_DC GET_PIN(B, 4)
#define OLED_SPI_PIN_CS GET_PIN(B, 7)
static void ssd1306_12864_4wire_hw_spi_example(int argc,char *argv[])
{
u8g2_t u8g2;

// Initialization
u8g2_Setup_ssd1306_128x64_noname_f( &u8g2, U8G2_R0, u8x8_byte_rt_4wire_hw_spi, u8x8_rt_gpio_and_delay);
u8x8_SetPin(u8g2_GetU8x8(&u8g2), U8X8_PIN_CS, OLED_SPI_PIN_CS);
u8x8_SetPin(u8g2_GetU8x8(&u8g2), U8X8_PIN_DC, OLED_SPI_PIN_DC);
u8x8_SetPin(u8g2_GetU8x8(&u8g2), U8X8_PIN_RESET, OLED_SPI_PIN_RES);
[img=300,0]https://www.rt-thread.org/qa/forum.php?mod=image&aid=12703&size=300x300&key=8d20feff034601b8&nocache=yes&type=fixnone[/img]
运行直接崩溃。
这个是哪里的问题!
rt_thread 使用的是 3.1.3
在menuconfig 中 pkgs --update 更新下来就改了个管脚配置。


wuhanstudio
wuhanstudio 2019-12-16
wyzjoyful 发表于 2019-12-15 22:37
件 SPI 在 menuconfig 下选了




看截图里面在崩溃前还打印了 the voltage is ... the electricity is ...
说实话提供的信息太少了很难定位问题,如果你用的是 stm32,建议可以用 CMBacktrace 软件包定位一下具体的错误
wyzjoyful
wyzjoyful 2019-12-16
    本帖最后由 wyzjoyful 于 2019-12-16 22:16 编辑


wuhanstudio 发表于 2019-12-16 18:09
看截图里面在崩溃前还打印了 the voltage is ... the electricity is ...
说实话提供的信息太少了很难定 ...

那个是串口输出的东西, 和那个没关系。666.png,单步调试 死在了这里,用的是STM32F103C8T6,软件模拟的SPI 运行没有问题。应该不是硬件问题。

AdamShen
AdamShen 2019-12-19
Chaser 发表于 2019-10-23 14:53
我在STM32上测试程序,LCD12864用u8g2库时不能显示中文,只能数字和字母,是怎么回事?谢谢 ...


1、确认编辑器编码格式为utf-8 ,不是GB2312
2、如果还是不能显示,建议自己建一个字库试一下
AdamShen
AdamShen 2019-12-19
Chaser 发表于 2019-10-23 14:53
我在STM32上测试程序,LCD12864用u8g2库时不能显示中文,只能数字和字母,是怎么回事?谢谢 ...


新建中文字库我写了个简单教程,供你参考:D

下载附件[U8G2 创建中文字库并映射到代码操作步骤.pdf]

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览