液晶屏驱动 U8g2 移植

发表在 Devices2018-9-23 19:58 [复制链接] 17 1321

本帖最后由 wuhanstudio 于 2019-4-21 22:24 编辑 8 X+ {% y! \: {1 L7 `& G9 a
% f' s( |( v* D/ @2 B2 M0 e
u8g2_logo.png ! k# s2 e; ?' |
% U+ l' |$ Y6 J: o
U8g2 是一个我非常喜欢的单侧液晶屏驱动,所以试了一下能不能在 rt-thread 上运行。$ V! n) Z$ r% K" k( M4 H) l
: ~/ p% C+ p+ k- U) c8 v! h# `& e) C
U8g2 支持非常多的单色液晶屏驱动 https://github.com/olikraus/u8g2/wiki
$ A* A, b) C; l5 C( o& W, {" f# a; m# M! v# F1 L2 H

3 o7 |3 b4 `& Q* z" }+ ^1 H4 C/ m4 q' U) e  H# ^+ h
Todo List:  ( 完成了的部分我会随时在这里更新 )& M; t& t) S4 X' E% f

* t- Q3 ~- @- K& V4 k9 j[ ● ] 硬件 I2C / Hardware I2C
/ m/ Z2 L* s- m" S) D[ ● ] 硬件 SPI / Hardware SPI* X( U# E8 j* J" D- W" ~5 O
[ ● ] 软件 I2C / Software I2C
% n5 ?/ N& ~  w( {+ `* y2 k  Y* @" ^8 R[ ● ] 软件 SPI / Software SPI  (感谢 #11 jzz 帮助)
5 J0 P; m& e. T' }1 D! r6 N[ ● ] 8080 & 6800) z8 S6 n1 Q% Z8 C, d4 b' `
[ ● ] 不同单色屏配置模板
* R$ A6 Q; x0 S& p: _; y$ @- J9 M
  C! }& v* Y$ F1 E9 _; h! Y& v) T/ N
% s0 x5 Z$ G7 F! |# M9 n

+ p8 f0 y  q% p0 v9 K# H2 O2 h试了一下在 STM32F103RCT6 上成功运行 https://github.com/wuhanstudio/rt-u8g2
3 J1 }" ^/ V, m! |" h* F0 O用的是 GPIO 模拟 I2C 总线,液晶屏旁边是 I2C 总线的 YL-40 模块,用来测试 I2C 总线是否正常工作。
% X" w: G/ d: a( e) b; E, [& p! d1 J, g' d$ w1 E  g1 a- w

U9g2 on rt-thread

U9g2 on rt-thread
% J, N% W; [# _+ O% J

+ L. f8 ^7 `( J0 B4 M; O( @/ ]- a IMG_20181218_224628.jpg
. X5 U4 k- [5 a  [
% j+ z" `- F" ]) R5 m) P st7920.jpg
2 h7 w6 \/ m' ]5 s# f" B. m: O, b1 C8 d4 s' z0 B1 s
因为我手头没有那么多开发板和液晶屏,所以没办法全部测试。
$ l' {* j$ E* H% [6 J7 G' U# X但我有时间会多测试一些的,欢迎大家一起帮忙测试不同的板子和液晶屏 :loveliness:
2 G$ h5 U* G  R0 M  Z. _4 P6 t* V1 s6 s) g) }$ {; t$ N" {$ N

# Y- b# U# A1 i  o9 \! E+ T4 l8 b
项目主页: https://github.com/wuhanstudio/rt-u8g2% a% z+ x* b" u/ x5 ?

% K  Z9 w& N& f相关项目: https://github.com/wuhanstudio/u8g2-arm-linux/      
& z0 l8 U6 O% Q+ |8 n+ c (在 Arm-Linux 上的移植)
$ _, D" j- E0 G1 A* ?/ A& G( a" N, s

5 a+ Y' @# M( k* M/ o" X& Z7 k" X
" y, ?  ^; C( L; H: m4 i  I/ [
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2018-9-24 11:00:12 | 显示全部楼层
欢迎加入到RT-Thread package中,这样大家可以通过env & menuconfig直接使用
使用道具 举报 回复
发表于 2018-9-24 13:05:08 | 显示全部楼层
厉害,这个库还是挺实用的,期待作成软件包哈
使用道具 举报 回复
发表于 2018-9-24 20:18:51 | 显示全部楼层
bernard 发表于 2018-9-24 11:00
/ C# F4 r/ p6 e3 @( W欢迎加入到RT-Thread package中,这样大家可以通过env & menuconfig直接使用
, Q! q% s  G  D6 ?& d
因为手上只有 I2C 接口的液晶屏,之后我试下 GPIO 和 SPI 的 LCD,如果也能正常运行我提交一个 PR 把 ;)
使用道具 举报 回复
发表于 2018-9-24 20:21:28 | 显示全部楼层
armink 发表于 2018-9-24 13:05
! i' Y1 S/ X; [- x; S厉害,这个库还是挺实用的,期待作成软件包哈

7 J) q+ V2 e, E( Z2 S  b谢谢   我先多测试一些屏,比较稳定后我会提交一个 PR
使用道具 举报 回复
发表于 2018-9-24 21:19:55 | 显示全部楼层
GPIO 和 SPI RT-Thread 也有设备框架,都使用框架后,这个软件包的通用性就非常强了。
使用道具 举报 回复
发表于 2018-9-24 22:57:57 | 显示全部楼层
armink 发表于 2018-9-24 21:19
& Z6 Z4 [- Z# o$ Z$ `0 m' b' X4 {GPIO 和 SPI RT-Thread 也有设备框架,都使用框架后,这个软件包的通用性就非常强了。 ...

# N$ r' [4 Q8 X' N" |7 C# i确实,硬件 I2C / SPI 我会尽量使用 rt-thread 的 API,软件 I2C / SPI 看样子 rt-thread 有提供。: t$ |6 U9 }' Z4 u/ @/ j2 v

6 V9 l  e8 f+ w3 j我刚添加了要之后完成的部分列表,寒假左右应当会慢慢完成。
使用道具 举报 回复
发表于 2018-9-25 10:30:41 | 显示全部楼层
这个库我在多个平台移植过 可移植性很强
使用道具 举报 回复
发表于 2018-9-25 10:39:22 | 显示全部楼层
给力啊,赞
使用道具 举报 回复
发表于 2018-10-13 14:13:21 | 显示全部楼层
支持一下
使用道具 举报 回复
发表于 2018-11-30 13:09:29 | 显示全部楼层
本帖最后由 jzz 于 2018-11-30 13:18 编辑 1 J) f2 d0 T2 F

3 l2 A# Q! Q" U- r! d9 w我把u8g2的4线SPI模式ssd1306示例写好了,代码如下:: F' `# G0 J! n. B2 r8 s: q
ssd1306_example_4wire_sw_spi.c1 Q" O9 L( [$ L! H9 s/ \
  1. //这里就不写include了,和包里已经有的那个i2cexample一样就行3 C; Q& \5 ^( C& [
  2. void ssd1306_example_4wire_sw_spi(int argc,char *argv[])
    & y2 [+ S5 ~7 _% v) o
  3. {6 W% V# f0 D: q% a8 x/ X
  4.                 u8g2_t u8g2;" o3 P2 k3 Z9 ^* r% c$ B& n
  5. / v. i0 O* h4 h* h2 `1 p
  6.                 u8g2_Setup_ssd1306_128x64_noname_f( &u8g2, U8G2_R0, u8x8_byte_4wire_sw_spi, u8x8_rt_sw_spi_gpio_and_delay);
    " `5 O- H; K8 k+ \
  7. 5 \5 j, T3 `/ W4 Z  Z* F
  8.                 u8g2_InitDisplay(&u8g2);  C8 B. e: I5 C! C$ I' v
  9.                 u8g2_SetPowerSave(&u8g2, 0);
    ! \5 P8 W0 u# h0 X; X
  10.                 # L* P$ M" D" U: u& T: I4 K) U
  11.                 /* full buffer example, setup procedure ends in _f */6 b' P: r2 r9 p' v2 s* w* n
  12.                 u8g2_ClearBuffer(&u8g2);
    " U0 Y" m' X# W5 X( e* s# S7 Y
  13.                 u8g2_SetFont(&u8g2, u8g2_font_baby_tf);
    . V# s) E. d) s9 u7 @  J# f
  14.                 u8g2_DrawStr(&u8g2, 1, 18, "U8g2 on RT-Thread 中文");
      E0 m0 r) P% ]9 K8 x# W& }9 T
  15.                 u8g2_SendBuffer(&u8g2);) k( f& C' D  u6 ?) H
  16. : p+ ?3 q4 Y/ c
  17.                 u8g2_SetFont(&u8g2, u8g2_font_unifont_t_symbols);; t- G6 U6 ~5 t) A5 U. H( o% v
  18.                 u8g2_DrawGlyph(&u8g2, 112, 56, 0x2603 );
    / Q2 V/ _2 A/ Y( v
  19.                 u8g2_SendBuffer(&u8g2);! d* H' c% R; Q" N+ G. w

  20. + o- @7 s# y4 A1 z) |/ C- u, G# A
  21.                 rt_thread_delay(2000);" U0 x7 a& j$ z" l) M

  22. 1 a* u' i" @2 `, I8 u4 @% ^9 _
  23.                 u8g2_DrawBox(&u8g2,1,1,128,64);
    ! e( A; Q+ O  X& o
  24.                 u8g2_SendBuffer(&u8g2);
    ( [) R" j( _# X8 j' T5 f
  25. }% e- x$ g& n. u0 ]& a3 }
  26. MSH_CMD_EXPORT(ssd1306_example_4wire_sw_spi, sw 4wire spi ssd1306 sample);
复制代码
在u8g2_port.c中添加一个函数9 ^7 _8 r5 u2 J4 j' x9 Z7 h
  1. uint8_t u8x8_rt_sw_spi_gpio_and_delay(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)* H2 u3 C  s$ O; c
  2. {
    ! F. k! V- {5 `  z* j& o
  3.         switch(msg)" @$ P2 }) C6 m, B, B
  4.         {
    ) a; a# m- s5 K" Q$ X! ]# r8 Y
  5.         case U8X8_MSG_GPIO_AND_DELAY_INIT:  
    9 e* e" F7 m# z0 x5 z0 [4 o
  6.                 //Function which implements a delay, arg_int contains the amount of ms  
    / H- i) C8 T4 G0 C' w* ?
  7.                                 //set mode
    9 ]. K4 v0 a) `% M' p7 G, Z0 N
  8.                                 rt_pin_mode(pin_clk,PIN_MODE_OUTPUT);//d0 a5 15 d1 a7 17 res b0 18 dc b1 19 cs a4 14  3 X+ m2 D" r2 x
  9.                                 rt_pin_mode(pin_mosi,PIN_MODE_OUTPUT);
    / F; K0 M8 R0 _3 I2 \
  10.                                 rt_pin_mode(pin_res,PIN_MODE_OUTPUT);1 P( z: ]; V+ G0 r
  11.                                 rt_pin_mode(pin_dc,PIN_MODE_OUTPUT);) }' B- E$ M  q  t8 q
  12.                                 rt_pin_mode(pin_cs,PIN_MODE_OUTPUT);
    : L3 X9 F) M: z9 n' X
  13.                                 //set value
    0 f9 G* Z; E7 d9 y" O" \7 a- q% z% X" D
  14.                                 rt_pin_write(pin_clk,1);
    ( B# z9 q! N3 ^+ b! T
  15.                                 rt_pin_write(pin_mosi,1);/ t2 F$ j! h/ r" O3 \
  16.                                 rt_pin_write(pin_res,1);0 j, y4 i9 w: D% w6 ~& c- a
  17.                                 rt_pin_write(pin_dc,1);
    1 U5 X% g# H4 m& a* j
  18.                                 rt_pin_write(pin_cs,1);
    2 l* \. e: a- s0 m  q. E
  19.                 break;
    ; G. j# {9 y. X% P5 U0 ?9 g
  20.                         
    7 r+ w* b  [5 C
  21.         case U8X8_MSG_DELAY_MILLI:  
    % Q6 z# g% g0 O& g) m8 n6 k
  22.         //Function which implements a delay, arg_int contains the amount of ms  5 ]2 [9 T) h2 W; g4 N1 W
  23.                         rt_thread_delay(arg_int);" q8 H$ P# \5 W9 O/ e
  24.                 break;$ h. [, W% p* a8 C9 C6 Q" \
  25.                         
    6 O, d& t0 g- I0 d1 V1 t
  26.         case U8X8_MSG_DELAY_10MICRO:  
    5 T) n, T$ S. o+ O0 \
  27.         //Function which delays 10us& E, p2 D$ r& p8 d/ K1 F
  28.                 break;1 I7 f7 t0 `2 _- e) Y
  29.                         + o4 q% t6 I& C4 s
  30.         case U8X8_MSG_DELAY_100NANO:  
    ( j! R# I# d! i1 q
  31.         //Function which delays 100ns  
    # u3 O. S% U6 ]$ k" H- F& `
  32.                 break;9 c& y2 _- v9 P* C: s
  33.                         5 P9 E4 n/ W1 L. f- J7 ~: k% ?
  34.         case U8X8_MSG_GPIO_SPI_CLOCK:  6 g) U; _' e* \, @+ G
  35.                 //Function to define the logic level of the clockline  
    / @& Z. w( D4 H, D& n1 W; F: `, V) c' b) y
  36.                                 if (arg_int) rt_pin_write(pin_clk,1);  % @, L: C+ H0 R* ?! p! d# `
  37.                                 else rt_pin_write(pin_clk,0);
    # a8 S5 i& q* a2 V  b1 d
  38.                 break;
    8 y. ?) b3 v) z, L( J3 X
  39.                         
    9 ]' D/ U4 B! F3 j
  40.         case U8X8_MSG_GPIO_SPI_DATA:
    $ S! N& ]) t. F7 ?4 m6 K6 p
  41.         //Function to define the logic level of the data line to the display  8 d6 o2 @6 C8 p2 G
  42.                                 if (arg_int) rt_pin_write(pin_mosi,1);  
    ) u( u9 N& G" N% d
  43.                                 else rt_pin_write(pin_mosi,0);  8 W# U" G; Y% H; L& d
  44.                 break;
    5 r4 \  W. ?; n# e: t

  45. 6 D5 b) S. x  V1 m# k& |
  46.         case U8X8_MSG_GPIO_CS:+ \7 J$ J. h! U% T7 Y. g; F7 ~; m
  47.                 // Function to define the logic level of the CS line  
    ; V; m# i: V2 p+ D
  48.                                 if(arg_int)        rt_pin_write(pin_cs,1);
    4 `3 Q9 j! m( u( Z" _; @
  49.                                 else        rt_pin_write(pin_cs,0);
    ) o# M$ H; w& t$ w1 ]
  50.                         break;  S! l& |7 A9 a% S

  51. 0 Q3 y/ \) [. j1 g4 D3 t  F
  52.         case U8X8_MSG_GPIO_DC:. Q" R+ d8 Y( V( M/ l  b
  53.         //Function to define the logic level of the Data/ Command line  7 \" m: i: s9 L6 o
  54.                                 if(arg_int) rt_pin_write(pin_dc,1);
    % R  V+ y$ C7 v( `, d6 @9 A7 L4 H
  55.                                 else rt_pin_write(pin_dc,0);. G7 c4 B  U$ C8 l6 E
  56.                 break;  + W. U. {( O2 |6 `; z* p* o

  57. / J7 D  h' R# u
  58.         case U8X8_MSG_GPIO_RESET:
      e2 u$ `# ?& Z( w* b$ C
  59.         //Function to define the logic level of the RESET line
    $ h; `( i; G% y
  60.                                 if (arg_int) rt_pin_write(pin_res,1);% x- R0 V2 i3 i3 m( ]
  61.                                 else rt_pin_write(pin_res,0);1 i: t0 M* J  E) g3 T
  62.                 break;
    # E' b6 f5 n1 T: L4 [
  63.                         
    ' E# `1 Y1 M9 g
  64.         default:  ( ~  h/ w: N/ L0 z2 @' W, [8 d
  65.             return 0; //A message was received which is not implemented, return 0 to indicate an error    p- M8 k$ d0 q' N/ s
  66.         }
    8 |' p# Z, }! s
  67.         return 1;
      u* T) X' }6 k. o& C
  68. }
复制代码
pin_dc,pin_cs之类的是gpio的定义,根据自己的引脚选择,我这里是$ B# |) ~( C5 z3 w7 n) U$ F
  1. #define pin_clk                15
    7 x" I, |' G; w+ @2 _; R
  2. #define pin_mosi         17
    6 Q- {4 F, m$ Y9 {! @. C8 ^+ x
  3. #define pin_res                18
    / S! Q* S* S1 K, g4 d" p5 |
  4. #define pin_dc                19
    2 O( A0 y, F; M5 m: v4 J& y
  5. #define pin_cs                14
复制代码
然后在对应的u8g2_port.h文件中添加声明,把新加的.c添加到sconscript脚本中去,编译就行,另外我有几个问题:
% j1 p; R* b/ W/ K3 E3 r
  • 引脚定义宏能不能加入到Kconfig中去,然后c代码从中导入?
  • 经过逻辑分析仪分析,我这个程序的效率比不使用图形库的裸机测试程序慢十倍左右,这正常吗,还是说底层回调函数不用rtt的gpio设备框架能快很多?
  • 这里的多人协作是基于bsp的,然而我用的stm32f10x和官方bsp中的不一样,多处参数需要修改,这种情况下,做点小贡献怕是有点难?不知道怎么操作
  • 这个软件包在楼主的仓库里面,如果其他人为这个软件包添砖加瓦是不是应该提交到楼主的仓库?
  • 我这里用的c8t6flash有点紧张,有没有什么减小体积的方法,总感觉链接了一堆别的什么东西
    6 j# n# d9 r3 |; D( O2 I
* [, o; J+ z5 V/ {& ]
使用道具 举报 回复
发表于 2018-12-1 08:54:03 | 显示全部楼层
最近刚用u8g2做了个项目,效果挺好。针对flash空间紧张提点建议。# u1 |) P# Z" l+ a& u4 U$ ?+ ]$ i

. D, `  ~( N2 }# ]) \+ Z" L1、u8g2_DrawStr只能显示ascii字符,中文显示建议 'u8g2_DrawUTF8' ,  u8g2_DrawGlyph要输入unicode,不直观。
1 O7 b: z' U, h$ p" a
. ^( Q# G. m; D2 K; w/ |7 @+ i. J2 M2、字库本身占了不少内存,flash体积小可删减大部分字库,需要添加新字库时参考下方链接自行生成
. ?' x9 }# e# u' F1 P: w4 G     https://github.com/larryli/u8g2_wqy/wiki/CustomFont
使用道具 举报 回复
发表于 2018-12-1 09:16:03 | 显示全部楼层
AdamShen 发表于 2018-12-1 08:54* c" L: ^* S" \
最近刚用u8g2做了个项目,效果挺好。针对flash空间紧张提点建议。8 b& Y0 W# m# H9 c4 o
, V1 _8 t+ I& |$ N% V8 s6 ^, d; R
1、u8g2_DrawStr只能显示ascii字符,中 ...
( U# h1 J; c6 F# r: N8 I6 c4 ^. R
get到了,谢谢
使用道具 举报 回复
发表于 2018-12-3 15:02:54 | 显示全部楼层
学习学习
使用道具 举报 回复
发表于 2018-12-4 14:05:46 | 显示全部楼层
jzz 发表于 2018-11-30 13:09; d2 E7 N5 |8 z  ]+ ~
我把u8g2的4线SPI模式ssd1306示例写好了,代码如下:
( Y& p! `! z1 N3 wssd1306_example_4wire_sw_spi.c2 O  \8 P: d* Y9 ?
在u8g2_port.c中添加 ...
/ J. ]- A- E( x3 i
不好意思,最近在申请学校没怎么更新库,
+ P& ?& q2 A# o  J6 E可以在这里提交一个 Pull Request,我之后测试一下,把您的修改 merge 进来9 b+ q0 B) O& n9 ]
/ z2 }' b, i( Q- ]
https://github.com/wuhanstudio/rt-u8g2/pulls
使用道具 举报 回复
发表于 2018-12-18 23:01:02 | 显示全部楼层
jzz 发表于 2018-11-30 13:09. I- m7 r$ [& z8 X! [6 T
我把u8g2的4线SPI模式ssd1306示例写好了,代码如下:
: L3 S+ M. V/ A9 e- D; C; L, Nssd1306_example_4wire_sw_spi.c& O% R$ t& j* w% g2 m! j
在u8g2_port.c中添加 ...
! D3 V2 _9 [8 F4 v, N& w, ]/ ]
感谢您的帮助,我刚刚测试通过,并且已经更新了 4wire_sw_spi7 d( j. J; @8 L3 F" r" q
8 s9 u1 j; f  L0 z  ^
https://github.com/wuhanstudio/r ... er/port/u8g2_port.c5 O' M+ ]2 ^. L4 l3 @. a
使用道具 举报 回复
发表于 2018-12-21 22:32:10 | 显示全部楼层
wuhanstudio 发表于 2018-12-18 23:01
2 X0 y  A! r7 A+ [4 f感谢您的帮助,我刚刚测试通过,并且已经更新了 4wire_sw_spi0 Y; Q4 C) |: ^3 Y5 }

$ p1 y& |% Q* u& X! \7 G& p2 ?https://github.com/wuhanstudio/rt-u8g2/ ...

8 k/ q; C, Z+ Y好多天没上论坛没看到,,,在这里祝楼主考研顺利了
使用道具 举报 回复
发表于 2018-12-21 22:43:47 | 显示全部楼层
jzz 发表于 2018-12-21 22:32! _4 s. \- c( \
好多天没上论坛没看到,,,在这里祝楼主考研顺利了
7 d) T1 ~# _/ g+ Y
谢谢,不过其实我是申请国外的Ph.D. 最近我试试移植硬件SPI
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RT-Thread开发者社区  

© 2013-2017 上海睿赛德电子科技有限公司 沪ICP备13014002号-1

Powered by RT-Thread

快速回复 返回顶部 返回列表