你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于ST NUCLEO-U575ZI-Q的测评—软件SPI驱动ST7735

[复制链接]
STMCU小助手 发布时间:2023-1-9 14:00

硬件平台:1.8寸128x160 TFT屏(st7735驱动)

连线:

/*4 |) _9 e' h+ a8 x# N6 l. f
* BL - PC8  D09 O# p; K& \1 s  L, b
* CS - PC9  D1- K# F/ \4 h+ c
* DC - PC11 D3
7 T9 u0 F. b8 o * RS - PD2  CMD0 a4 V( ]* p: u$ K! s: a7 T# ~. V  G3 g( W
* SCL -PC10 D2/ U' I- }4 E! |9 o8 [! a8 w
* SDA -PC12 CK
! O# o9 J  F9 p! ?) y */

由于用spi硬件调试了好几次,要么SCK,不上拉就没有波形等。退而求次之用软件spi驱动。


8 j" p$ Z' p1 e

一、配置IO

122111pxahikl1oxobiaid.png.thumb.png


1 _% q' w! A- M$ [; Z

二、由stm32cubeIde生成工程后,加入st7735.h、st7735.c以及font.h
) v6 ?. U/ Q* U# l1 O

122235dxkonlkxnixlql2k.png.thumb.png


% M* B7 D( K* y9 k3 Z! Z- G  3、宏定义,在stm7735.h中定义屏的6个引脚的高底电平:! u$ |8 M6 |3 Z$ z7 O& t
  1. //LCD片选脚
    0 G( k! Q" c( _4 e7 w
  2. #define CS_HIGH   HAL_GPIO_WritePin(ST7735_CS_GPIO_Port, ST7735_CS_Pin, GPIO_PIN_SET)6 V8 O& A$ u9 e, }7 t. w; L% Q+ L
  3. #define CS_LOW   HAL_GPIO_WritePin(ST7735_CS_GPIO_Port, ST7735_CS_Pin, GPIO_PIN_RESET)  U( A) B1 }+ v. j0 Q& w- Q
  4. # @  o% x, C9 ^, s) ^& K
  5. //指令数据选择脚   对应屏幕上面的a0脚  输出低电平,代表命令,高电平,代表数据
    5 x# f: C" p: [, X5 d5 A
  6. #define COMMAND  HAL_GPIO_WritePin(ST7735_DC_GPIO_Port, ST7735_DC_Pin, GPIO_PIN_RESET)
      n# F& v! i5 N" f# x
  7. #define DATA     HAL_GPIO_WritePin(ST7735_DC_GPIO_Port, ST7735_DC_Pin, GPIO_PIN_SET)- R4 x% J% O: k. H9 F/ o5 Q

  8. : o+ [/ G- p: {
  9. //复位脚% F, a. h& w9 R. Q
  10. #define reset_high  HAL_GPIO_WritePin(ST7735_RES_GPIO_Port, ST7735_RES_Pin, GPIO_PIN_SET)5 B( t" c4 S, N! \7 Y) d8 s
  11. #define reset_low  HAL_GPIO_WritePin(ST7735_RES_GPIO_Port, ST7735_RES_Pin, GPIO_PIN_RESET)
    # j( t! d0 ^/ r+ x# H
  12. //背光脚% p5 s1 x5 M( |- P1 O. x
  13. #define  led_high HAL_GPIO_WritePin(ST7735_BL_GPIO_Port,ST7735_BL_Pin,GPIO_PIN_SET)/ _5 k( S1 H8 A9 Z# v2 ~# l
  14. #define  led_low HAL_GPIO_WritePin(ST7735_BL_GPIO_Port,ST7735_BL_Pin,GPIO_PIN_RESET)
      w/ ~# L* M" z) r, H, y" ]9 W
  15. // SCL9 X, u7 l6 {& R" v) L/ c% r2 j; L( b- u

  16. & @4 T9 z  L% z3 f! v/ P
  17. #define LCD_SCLK_LOW HAL_GPIO_WritePin(ST7735_SCL_GPIO_Port, ST7735_SCL_Pin, GPIO_PIN_RESET)
    " U: C) ?- `2 y/ O
  18. #define LCD_SCLK_HIGH HAL_GPIO_WritePin(ST7735_SCL_GPIO_Port, ST7735_SCL_Pin, GPIO_PIN_SET)
      ^0 k- ~  `# m' z5 W
  19. - Z4 j4 [9 g' q( A; i# G* c9 _& F5 k
  20. // SDA
    ' E6 s! ~! @1 @( ]% `
  21.   v9 ]6 v$ [) G! B1 u; y: I( K
  22. #define LCD_SDA_LOW HAL_GPIO_WritePin(ST7735_SDA_GPIO_Port, ST7735_SDA_Pin, GPIO_PIN_RESET)
    & a3 l) D- D- W+ U3 O# f& p
  23. #define LCD_SDA_HIGH HAL_GPIO_WritePin(ST7735_SDA_GPIO_Port, ST7735_SDA_Pin, GPIO_PIN_SET)
复制代码
: `' l0 g6 F# i; `8 T

) Z4 W" m8 n/ d2 H

4、定义spi向st7735发送命令的几个重要函数:

  1. void st7735_write(uint8_t data)
    8 ~# c! L1 }4 L% ^
  2. {
    8 L/ o* X2 K7 H' l) o/ H
  3.         uint8_t i;5 D6 K' |( m7 w; W
  4.         for(i=0;i<8;i++)
    " P8 j+ x" }7 R5 v- s2 J2 I7 C
  5.         {. @/ Q! y# G' }( r. S
  6.                 LCD_SCLK_LOW;
    # e& {+ Y% b; B
  7.                 if(data&0x80)& B1 I3 {" T! s: Y- b
  8.                 {  \' F% _  M$ o* O+ }8 y
  9.                         LCD_SDA_HIGH;$ Q$ A- I* y- M/ R& t2 V; [
  10.                 }" _. u/ T. {: u' C& Q2 U2 \
  11.                 else" T8 C! \; L/ D/ _4 T8 }: j: C
  12.                 {  B. q7 a' {" p0 ~" V% T2 f% _
  13.                         LCD_SDA_LOW;
    : A5 {: n& w. t  W7 g
  14.                 }( [8 Y, b: I* F. X
  15.                 LCD_SCLK_HIGH;
    ' a' Q7 V6 i0 N2 f' F5 ?/ z/ g
  16.                 data<<=1;- \. I5 h# _0 |! V* M& |. p0 s
  17.         }
    % k$ p; C+ m6 O
  18. }4 `( |+ w4 R* `% U. x
  19. //LCD屏幕写指令6 D9 _! ~$ O; i' k
  20. void TFT_WRITE_DATA(uint8_t data)
    % K6 Q+ T( u% V+ g0 }
  21. {; c, X. Q# z! T1 D) Y/ A0 X0 @' n
  22.         CS_LOW;5 b( {8 ^; O4 z
  23.         DATA;
    4 L* |* e: B+ s: D0 |9 C  {
  24.         st7735_write(data);
    & p. z/ D# D( R+ c: k, m; E' M
  25.         //HAL_SPI_Transmit(&hspi3, &data, 2, 20);4 F# j8 T1 g# r- q) |, Y4 U% r
  26.         //HAL_SPI_Transmit_DMA(&hspi1,&data,1);9 t# x- `2 I$ ?2 l
  27.         CS_HIGH;
    + X# M3 c0 n( \8 n0 ~' w) k9 ~

  28. 7 ^4 u8 f, n0 b+ G9 @
  29. }
    8 B8 {' n4 }- R! Z
  30. //  LCD屏幕写指令6 f  K2 e6 D8 F0 }
  31. void TFT_WRITE_COMMAND(uint8_t command)
    9 J( _' Y1 S/ `; `3 f! k* J
  32. {0 D* a: M) Z4 k% _4 {4 c; ^
  33.         CS_LOW;+ Q& [! {. t: _- D" y
  34.         COMMAND;
    0 {$ A7 |: _: A: [, g# }
  35.         st7735_write(command);
      ~: h- ^; s1 d; m4 O, B( b  C
  36.         //HAL_SPI_Transmit(&hspi3, &command, 2, 20);0 L1 I, v) y' T3 \5 Q
  37.         //HAL_SPI_Transmit_DMA(&hspi1,&command,1);0 W( I6 J0 D+ h# `
  38.         CS_HIGH;
    0 k# K6 Q7 O2 e* b
  39. }0 F' L- x8 x, b; B

  40. 6 J# |* ~7 j: N8 x& S* _) k( {
  41. //  向对应的寄存机写入单个数�?
    , q8 s- }! _) C6 P* S. i) B/ c
  42. void TFT_WRITE_REG(uint8_t reg,uint16_t reg_value)' c' `2 G7 X0 K' {0 y+ I# Y
  43. {7 z/ {" h2 G! D6 v
  44.         TFT_WRITE_COMMAND(reg);- n% [) a# l; E
  45.         TFT_WRITE_DATA(reg_value);; e$ F  p1 D( j% @0 l0 r* ~
  46. & U2 a4 V, t+ n( b) K( s: B- V
  47. & n+ @- t7 [8 `1 z. T
  48. }
    6 V. m8 ?- F! B/ U/ d9 V' z' w
  49. // 写入一个16位的数据9 d, W5 }" u% K& T4 F' @
  50. void TFT_WRITE_u16_DATA(uint16_t temp)
    ; M: @# M1 l8 W' _/ k- h
  51. {1 x0 M# g; ~  U* i( ?

  52. ! O" B# L) Y* ?0 i$ V
  53.                 uint8_t tempBuf[2];
    + H* N, I) K. b9 E+ A% c! a6 y
  54.                 tempBuf[0] = temp>>8;
    ; m  ^% H( J& w3 \
  55.                 tempBuf[1] = temp;% G  f, ?: J9 [. y2 y+ s7 b# Y
  56.                 CS_LOW ;
    ) ^5 H/ q; v6 Q: S+ R) R; n% |; M
  57.                 DATA ;
    2 j) J7 t& N2 h9 \: w* h
  58.                 st7735_write(tempBuf[0]);
    ! u' f- u% k8 U  X2 y/ J
  59. 2 c/ v; ^) s5 h# A3 Y* d
  60.                 //HAL_SPI_Transmit(&hspi3, &tempBuf, 4, 20);
    * a3 e. h$ T4 K
  61.                 //HAL_SPI_Transmit_DMA(&hspi1,tempBuf, 2);% _: X$ b3 b# X, D  n$ o' P7 Y
  62. . W, x* S! I- J5 w4 M
  63.                 st7735_write(tempBuf[1]);7 A2 R1 h% G$ S

  64. & i6 a7 c* J8 A4 g0 K
  65.                 CS_HIGH ;
      i: D7 Q/ [3 B
  66. }
复制代码


: z$ R  C& O9 I1 [+ k; X, @/ @" l

定义好这些参数后,在main.c中初始化st7735,然后写测试显示:

  1. /* USER CODE BEGIN 2 */0 w' V7 T3 i5 l, U- q. C+ \
  2. , w- N' ~% }( h7 W. {
  3.   printf("start U7575!\r\n");+ g: @4 |9 L$ B5 g3 K
  4.   tft_init();4 M4 [, B2 z8 W6 @& A  r
  5.         TFT_ShowChar(0,0,'A',WHITE,YELLOW,32);
    9 F' M; C, L2 s/ W
  6.         LCD_ShowCharStr(0,32,128,(char *)str,WHITE,BLUE,32);
    ( d; P. L9 {$ \; v* u& P# }
  7.         LCD_ShowCharStr(0,64,128,(char *)str3,WHITE,BLUE,24);
    9 P5 n: A' x- M* E; q* _
  8.         LCD_ShowCharNumber(0,96,128,number,WHITE,RED,32);
    : n& ]2 e5 C6 K; y1 C
  9.         LCD_ShowCharStr(0,128,128,(char *)str2,RED,WHITE,16);" ]' D0 }5 ^% G. Q& p3 h  W% K+ Z  d
  10.   /* USER CODE END 2 */
    1 C* x* z1 Y$ r  K# I, L
复制代码


6 i1 s9 g2 A  `# L' o

测试效果如图:

) `6 t8 H: j1 X6 q

122914a5jj7q2wj98j6wjk.jpg.thumb.jpg
! M( M7 _) W1 t* l! O4 @4 T; h! A/ L8 \, Z6 N
出处:社区用户:lugl发布- [0 h  a/ i+ }( p) f& ~) {
  ^& H( B: B6 L  _& X$ t7 Q( Q  g: l
* Q4 r4 y7 f' @: F' t2 Z4 w
收藏 评论0 发布时间:2023-1-9 14:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版