液晶屏驱动 U8g2 移植

2018-9-23 19:58 [复制链接] 14 474

本帖最后由 wuhanstudio 于 2018-9-28 12:14 编辑
3 L  `. m* _  B/ A$ U
( q. C0 K) {3 K, Y* Q7 c* b( v& g
; T' ]- ~9 N: W* ?9 d; K
- j1 y6 Y6 O# C. Y% n3 B" P& j, ]! fU8g2 是一个我非常喜欢的单侧液晶屏驱动,所以试了一下能不能在 rt-thread 上运行。, W1 w; K/ @( @/ v
) U( j% m; l$ K. z
U8g2 支持非常多的单色液晶屏驱动 https://github.com/olikraus/u8g2/wiki
5 H9 p" Z6 F- ]' c( `/ U
) m% {" y: Z- Z# m$ b2 R试了一下在 STM32F103RCT6 上成功运行 https://github.com/wuhanstudio/rt-u8g2$ }/ b  R! G  K

2 {6 n  p& a2 Q) v用的是 GPIO 模拟 I2C 总线,液晶屏旁边是 I2C 总线的 YL-40 模块,用来测试 I2C 总线是否正常工作。
* W* O7 e) e( e" U3 R2 B8 j
5 M7 E8 \" G4 e; |: N
+ ~9 Z& {# h" `/ x
' G1 l) X* g7 w/ P% O. u  Q+ j" _) q2 A
因为我手头没有那么多开发板和液晶屏,所以没办法全部测试。
- S" w/ l& i# |6 E但我有时间会多测试一些的,欢迎大家一起帮忙测试不同的板子和液晶屏
) U, a; b, j* l% T3 t) l  w8 b. c  v+ e9 x5 v& g; I) y

8 o6 ^3 M$ H0 ]5 {" D& @& d9 I
, \. g) B) k4 T, v+ b& kTodo List:  ( 完成了的部分我会随时在这里更新 )! t8 ^1 k- V6 y: i

) j( i! r8 |9 }4 C5 Z0 A  g" l3 e[ ● ] 硬件 I2C / Hardware I2C
9 m% h1 s; h& u[    ] 硬件 SPI / Hardware SPI
7 b* Z% C. x( e' d! v; B+ }* D[ ● ] 软件 I2C / Software I2C
+ P: _- O) n" f' y[    ] 软件 SPI / Software SPI
! _: A+ m' c' y" t4 H# W" ^) ^& Y7 F[    ] GPIO & Delay/ ]- E$ l3 m: |$ u& l' E7 y

9 A0 Z: i: {2 ^+ F; H8 U5 N
) Y1 o- D% s& P: K. }9 ^( E& @7 U' e* e9 \1 D5 y4 g
项目主页: https://github.com/wuhanstudio/rt-u8g2& s/ w2 D& b& F1 l; A& u/ d; K+ I
配置文件 (menuconfig) : https://github.com/wuhanstudio/p ... er/peripherals/u8g2
; E' r3 D- e! ?( R$ [- ?
) d  a9 m$ H. D/ Q* ~相关项目: https://github.com/wuhanstudio/u8g2-arm-linux/      
* X: Z- q+ Z: }% U) ~6 p  E/ B (在 Arm-Linux 上的移植)8 r8 C( w. i: s* A/ S+ g

+ e2 p) N! @/ r! b1 N( V! J9 ?, L' W( j8 M4 H

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 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( z) P  t* G) P7 @5 }, [
欢迎加入到RT-Thread package中,这样大家可以通过env & menuconfig直接使用
6 i% n4 P& P% h9 C+ H
因为手上只有 I2C 接口的液晶屏,之后我试下 GPIO 和 SPI 的 LCD,如果也能正常运行我提交一个 PR 把 ;)
使用道具 举报 回复
发表于 2018-9-24 20:21:28 | 显示全部楼层
armink 发表于 2018-9-24 13:05- `2 k& y& s) [
厉害,这个库还是挺实用的,期待作成软件包哈
, m7 _  d. F% U' d% O+ Y7 G/ Z
谢谢   我先多测试一些屏,比较稳定后我会提交一个 PR
使用道具 举报 回复
发表于 2018-9-24 21:19:55 | 显示全部楼层
GPIO 和 SPI RT-Thread 也有设备框架,都使用框架后,这个软件包的通用性就非常强了。
使用道具 举报 回复
发表于 2018-9-24 22:57:57 | 显示全部楼层
armink 发表于 2018-9-24 21:19
# b6 ?6 m- J+ f$ Q" x/ mGPIO 和 SPI RT-Thread 也有设备框架,都使用框架后,这个软件包的通用性就非常强了。 ...
& E. v) j) T9 L: g7 q* L2 F
确实,硬件 I2C / SPI 我会尽量使用 rt-thread 的 API,软件 I2C / SPI 看样子 rt-thread 有提供。% W. x( B. ?3 i+ W& Z& _7 {

( m4 T7 |# ], e6 g& ]* q* x5 @' i我刚添加了要之后完成的部分列表,寒假左右应当会慢慢完成。
使用道具 举报 回复
发表于 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 编辑
! _; }3 Q( v1 R* q3 `' y6 d+ M3 Q& `- |/ H( A4 n2 c% F
我把u8g2的4线SPI模式ssd1306示例写好了,代码如下:
. D  h$ d* m9 n' W. D0 Y6 cssd1306_example_4wire_sw_spi.c
. g  {+ f1 Y6 l# s) ]2 g
  1. //这里就不写include了,和包里已经有的那个i2cexample一样就行
    8 \4 W0 G% f6 f
  2. void ssd1306_example_4wire_sw_spi(int argc,char *argv[])
    % P' I7 c7 x# R
  3. {
    # J0 N. i3 X6 c: i) O
  4.                 u8g2_t u8g2;. }* S; N" G+ k' ~7 g) |7 u

  5. ! n- x# x# A) b- R* [! y6 ^
  6.                 u8g2_Setup_ssd1306_128x64_noname_f( &u8g2, U8G2_R0, u8x8_byte_4wire_sw_spi, u8x8_rt_sw_spi_gpio_and_delay);
    5 q" ]: O* S8 T0 p! \3 B3 V/ V

  7. ( ~! Z, t  n$ v8 R9 j
  8.                 u8g2_InitDisplay(&u8g2);
    / m$ X3 M' c% o% s% ~- u8 R
  9.                 u8g2_SetPowerSave(&u8g2, 0);
    - x3 @. j% d, N4 p& t+ r! m# E
  10.                 ! P+ e" e# B' V8 h( X
  11.                 /* full buffer example, setup procedure ends in _f */" U4 W% G1 {0 n, i+ c& o+ }
  12.                 u8g2_ClearBuffer(&u8g2);
    ( f- u( s0 j% Q' r* Y
  13.                 u8g2_SetFont(&u8g2, u8g2_font_baby_tf);  l$ T4 D8 @, t1 i
  14.                 u8g2_DrawStr(&u8g2, 1, 18, "U8g2 on RT-Thread 中文");' e4 x3 F) c8 r3 R5 d1 l
  15.                 u8g2_SendBuffer(&u8g2);
    2 v, R& S( H: K5 _' b, ^0 {. M  b
  16. & m5 E* d+ H$ Y# N  g2 U+ _( T7 |' f
  17.                 u8g2_SetFont(&u8g2, u8g2_font_unifont_t_symbols);2 M7 Q# ?6 Z) e1 H9 e9 O
  18.                 u8g2_DrawGlyph(&u8g2, 112, 56, 0x2603 );7 J# v' t1 O' P/ P7 f+ w( K" R, L
  19.                 u8g2_SendBuffer(&u8g2);1 N. G$ a) `6 z
  20. 0 R! I) [; q% V  z0 a7 y
  21.                 rt_thread_delay(2000);* B; h2 m1 q, B% y. r

  22. $ F+ A4 Y& V2 D( [) B/ K6 {# Y1 k6 y
  23.                 u8g2_DrawBox(&u8g2,1,1,128,64);: _% P: O% S% L
  24.                 u8g2_SendBuffer(&u8g2);/ u+ T" W6 \% F% ^. t& _7 a( Z) q
  25. }5 a) c' t3 y3 L: N7 M
  26. MSH_CMD_EXPORT(ssd1306_example_4wire_sw_spi, sw 4wire spi ssd1306 sample);
复制代码
在u8g2_port.c中添加一个函数$ B" V% F. _+ P9 n1 g
  1. uint8_t u8x8_rt_sw_spi_gpio_and_delay(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)) O: W1 n2 M4 E" _3 a" W4 H
  2. {6 q- u% f8 M  m
  3.         switch(msg)# V% s- O* x$ x) q
  4.         {" A) v3 W! z( k& a# }* Z0 A
  5.         case U8X8_MSG_GPIO_AND_DELAY_INIT:  7 m5 r& i6 Q, L0 Z% h* X" n7 G1 J2 Y$ |
  6.                 //Function which implements a delay, arg_int contains the amount of ms  1 Z% w) x+ a+ O' I: [& U5 ~
  7.                                 //set mode : _% o7 Z9 U' {; K& A
  8.                                 rt_pin_mode(pin_clk,PIN_MODE_OUTPUT);//d0 a5 15 d1 a7 17 res b0 18 dc b1 19 cs a4 14  4 R6 z$ K1 z2 t. q) F7 i
  9.                                 rt_pin_mode(pin_mosi,PIN_MODE_OUTPUT);
    $ Q% g5 ^; F$ G- e: q& a3 Z/ P
  10.                                 rt_pin_mode(pin_res,PIN_MODE_OUTPUT);
    1 c) i! W' j- y8 k4 y$ x0 I1 N
  11.                                 rt_pin_mode(pin_dc,PIN_MODE_OUTPUT);+ k5 \; Z$ r9 e, T! ~- v7 G
  12.                                 rt_pin_mode(pin_cs,PIN_MODE_OUTPUT);3 g2 @  G8 F( e, a( i0 Q9 [( X
  13.                                 //set value
    & \4 }" O$ k7 h  T
  14.                                 rt_pin_write(pin_clk,1);
    8 |  i6 ~6 T4 v- E& A
  15.                                 rt_pin_write(pin_mosi,1);4 I. v/ W: `% _2 ]. A, u
  16.                                 rt_pin_write(pin_res,1);
    # H3 @2 ~$ M7 P7 }% @# Y1 K( N8 t
  17.                                 rt_pin_write(pin_dc,1);' C: A7 B5 C) V9 }
  18.                                 rt_pin_write(pin_cs,1);
    ; |5 m  {% R8 A- |, `
  19.                 break;2 t0 s- y0 f5 P
  20.                         & x* D+ A; y5 m7 }2 h; P
  21.         case U8X8_MSG_DELAY_MILLI:  " Y9 j/ t2 E4 v" e$ y
  22.         //Function which implements a delay, arg_int contains the amount of ms  : I: T" R8 u" K
  23.                         rt_thread_delay(arg_int);
    $ d7 F- l1 O- T2 z# b4 s
  24.                 break;( h9 R/ [; E7 d$ |1 g/ ~( m. A
  25.                         
    ; ~% \6 T* j( k! g5 r3 S" i- S  Q
  26.         case U8X8_MSG_DELAY_10MICRO:  # N$ G7 n! h8 ]2 j: I
  27.         //Function which delays 10us
    7 [3 Z% I# L6 L$ u8 e2 ~7 K
  28.                 break;
    ! p: t# k, W" G0 ]8 m8 B2 a
  29.                         
    2 U+ z9 r/ M& F. u8 r* G
  30.         case U8X8_MSG_DELAY_100NANO:  ! G' v6 G5 J8 Y" o
  31.         //Function which delays 100ns  
    8 j7 q- W% S' c5 g3 T
  32.                 break;
    8 H' R' i( S& S( N
  33.                         8 T, F  U* K9 @4 W+ y2 W
  34.         case U8X8_MSG_GPIO_SPI_CLOCK:    Z( n/ c/ c" G
  35.                 //Function to define the logic level of the clockline  9 p' M: h7 i/ h) S3 e5 M, Z6 }' v; n
  36.                                 if (arg_int) rt_pin_write(pin_clk,1);  7 v# J  R( \* m+ |: B5 K
  37.                                 else rt_pin_write(pin_clk,0);/ i: y" R, \, h' _8 h1 V0 k
  38.                 break;) l' e$ h- J6 A* `
  39.                         + ?. u# X  ~' i* {7 O$ Z6 H" F
  40.         case U8X8_MSG_GPIO_SPI_DATA:0 o) r2 q: H# l# `; S' B6 F2 B
  41.         //Function to define the logic level of the data line to the display  
    8 X" N6 o) `5 X$ Q2 K$ q
  42.                                 if (arg_int) rt_pin_write(pin_mosi,1);  0 R* p+ n0 J. U. b
  43.                                 else rt_pin_write(pin_mosi,0);  $ N( H# P3 o- A5 M
  44.                 break;
    4 b4 b: d( @; p# d  G( |

  45. ! g0 _9 y+ v( Z3 \
  46.         case U8X8_MSG_GPIO_CS:
    ( r: Y% a* \/ p* S
  47.                 // Function to define the logic level of the CS line  
    * s; j0 k! L, F5 j2 R! I& b6 V
  48.                                 if(arg_int)        rt_pin_write(pin_cs,1);
    4 K9 m$ `# C; ]0 y1 V& Y
  49.                                 else        rt_pin_write(pin_cs,0);
    6 a9 j) ?& V+ i1 k! O
  50.                         break;9 z  l8 ^( m1 N" [& j" @. v$ Q( o
  51. & e6 g: V, R6 }* n: G( c* |5 [
  52.         case U8X8_MSG_GPIO_DC:" Y. \( m6 C5 o& w5 p* U+ }* o, U
  53.         //Function to define the logic level of the Data/ Command line  / D1 H! X8 g% D
  54.                                 if(arg_int) rt_pin_write(pin_dc,1);7 {" L5 u' W5 k
  55.                                 else rt_pin_write(pin_dc,0);$ P+ E/ F( X! d
  56.                 break;  
    , y6 w2 Q' _3 Y2 e

  57. ' R5 r8 E3 W, G4 A9 Y; E
  58.         case U8X8_MSG_GPIO_RESET:( G# {5 i& u# G3 A& B& o
  59.         //Function to define the logic level of the RESET line3 _( s8 m# m- g0 ]- \7 A
  60.                                 if (arg_int) rt_pin_write(pin_res,1);! Y+ d5 l! V7 z7 v
  61.                                 else rt_pin_write(pin_res,0);( |3 {, S1 Z, y5 S1 d5 a2 C
  62.                 break;$ z) y6 L! l( s0 P* L2 J. x
  63.                         
    7 L8 [! ]- N" {; O4 Q/ }2 E
  64.         default:  % c& `% x5 m# P0 @
  65.             return 0; //A message was received which is not implemented, return 0 to indicate an error  7 D6 L6 {- R7 f' Q3 F
  66.         }  x1 P% S/ @  y. I! Y
  67.         return 1;
    ! z9 \+ G% J" s2 ^- P8 W
  68. }
复制代码
pin_dc,pin_cs之类的是gpio的定义,根据自己的引脚选择,我这里是
& D6 A" M7 h' J; R4 l
  1. #define pin_clk                15
    % k5 ^8 Y. A# _  w
  2. #define pin_mosi         17
    + p% k; t! k6 O2 X: U+ J0 ?
  3. #define pin_res                18
    + l+ ^( @4 h6 N1 c: E* T
  4. #define pin_dc                19
    + K$ y& q6 C3 S% P! i
  5. #define pin_cs                14
复制代码
然后在对应的u8g2_port.h文件中添加声明,把新加的.c添加到sconscript脚本中去,编译就行,另外我有几个问题:
- Z5 ]$ R& G# p5 m4 j
  • 引脚定义宏能不能加入到Kconfig中去,然后c代码从中导入?
  • 经过逻辑分析仪分析,我这个程序的效率比不使用图形库的裸机测试程序慢十倍左右,这正常吗,还是说底层回调函数不用rtt的gpio设备框架能快很多?
  • 这里的多人协作是基于bsp的,然而我用的stm32f10x和官方bsp中的不一样,多处参数需要修改,这种情况下,做点小贡献怕是有点难?不知道怎么操作
  • 这个软件包在楼主的仓库里面,如果其他人为这个软件包添砖加瓦是不是应该提交到楼主的仓库?
  • 我这里用的c8t6flash有点紧张,有没有什么减小体积的方法,总感觉链接了一堆别的什么东西6 r( E7 s1 {' ]/ z

6 N# Y; b+ v) i
使用道具 举报 回复
发表于 2018-12-1 08:54:03 | 显示全部楼层
最近刚用u8g2做了个项目,效果挺好。针对flash空间紧张提点建议。
4 e7 {2 G& W. }8 m" Q' g! J) k
4 ?; {& E0 L4 A' V8 v% ?4 V/ E1、u8g2_DrawStr只能显示ascii字符,中文显示建议 'u8g2_DrawUTF8' ,  u8g2_DrawGlyph要输入unicode,不直观。
2 O# _8 x( N2 v: K" O1 k- H/ V  X1 v* q! r
2、字库本身占了不少内存,flash体积小可删减大部分字库,需要添加新字库时参考下方链接自行生成! r+ P' D* d2 y) \% E/ }; P% U
     https://github.com/larryli/u8g2_wqy/wiki/CustomFont
使用道具 举报 回复
发表于 2018-12-1 09:16:03 | 显示全部楼层
AdamShen 发表于 2018-12-1 08:54' E. p( y1 f/ U# N& \3 |- B6 h
最近刚用u8g2做了个项目,效果挺好。针对flash空间紧张提点建议。
% ~- Y8 |# S* x: I
; O+ a6 p+ Y/ j' A- B" `1、u8g2_DrawStr只能显示ascii字符,中 ...
8 }+ L: k& f1 \8 K$ C4 _
get到了,谢谢
使用道具 举报 回复
发表于 2018-12-3 15:02:54 | 显示全部楼层
学习学习
使用道具 举报 回复
发表于 2018-12-4 14:05:46 | 显示全部楼层
jzz 发表于 2018-11-30 13:09
7 v$ ~& W0 ?+ R# `我把u8g2的4线SPI模式ssd1306示例写好了,代码如下:- k8 K# t) L# w
ssd1306_example_4wire_sw_spi.c9 b% l8 S) @8 X. K- E
在u8g2_port.c中添加 ...

4 n0 a1 {, P/ O& ]5 m# p不好意思,最近在申请学校没怎么更新库,
. c" i  u6 d. x* m. B8 S; ^可以在这里提交一个 Pull Request,我之后测试一下,把您的修改 merge 进来6 P2 b. c& ?1 h4 ]. S2 N. i

/ {- ]. s: F. phttps://github.com/wuhanstudio/rt-u8g2/pulls
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by RT-Thread

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