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

【经验分享】STM32开发,使用F103C8T6驱动3.2寸SPI口LCD屏

[复制链接]
STMCU小助手 发布时间:2022-5-5 16:45
1 概述+ c/ k; f3 V& \, P# |
部分实验代码已经上传。另外最小系统板和SPI触摸屏均购买于某宝,总成本42元包邮。# S& I7 D% Q4 g+ B3 {/ U) D
! d6 X$ c) z' N# Q
1.1 最小系统板资源概述% M, q$ o4 G4 ^1 T
开发板:STM32F103C8T6最小系统板, ?- }+ P' b8 ?2 n: I6 [( i
CUBEMX版本:1.3.0
3 D5 P0 \. f: @) Z; Z3 P, |0 G9 p: QMDK版本:5.27
$ e1 \  N0 M- y. U$ i7 i主控芯片型号:STM32F103C8T6
. o' n* @& [) N' s: E8 kLCD屏幕参数:3.2寸LCD,SPI口,带触摸功能。6 i7 `. {9 d; G# {: W( j' C/ M
最小系统板如下
) _5 w9 f& o' U$ e% K: j
: s, A% x- }/ b$ l: [ VA%2]OGDV5F[ISXY5$~LH$E.png ) K" K3 C# t( e; \  X0 g
0 h5 b. L5 v& J, J& K
SPI触摸屏如下: V: }/ a, D7 z- A, f

$ J8 Z! B% N: z* T3 Q, |5 [ ]3`C1[V`FZX{]$B]0%JKF.png 1 ]2 i  r8 @6 j3 q3 U
. |+ y% _7 c7 U% l* g, m, q. |
1.2 实现功能
- R8 v2 g& Z3 P+ ~- L. m. ]) y8 N购买的屏幕提供了驱动程序,但是没有C8T6的型号,需要进行移植,在最小系统板上实现触摸屏显示功能。2 J7 _  ^' Q3 Z; k, Z: K. \2 Q# e( ?
) T7 A! I: U% u
2 硬件介绍& [7 {% h3 t% W6 h' H( M
2.1 最小系统板硬件介绍
3 o5 M6 h; K+ ^; e3 L
最小系统板,除了一个PC13作为用户按键灯外全部GPIO口进行了引出,另外最小系统板不带EEPROM。无法移植屏幕触摸功能。
  _: V" B) ^1 X8 {
, G4 A  k# {, V- t) T' D  i: v 48DXBP738WDBR{LGXKCF7AP.png
6 X+ D) L: l# \% }! x+ M" C; N3 i5 b! {
" c7 r$ W9 o2 d4 b  d: @3 Y8 Q: c2.2 LCD屏原理图

3 U& B1 q4 @) L3 A! J, XLCD屏集成触摸检测,集成一个SD卡插座,这里我们都用不到。
9 ]  q" u' l0 N
  |8 m7 @( P  S% A X85I9~KI203L64[3TV9OFUV.png 0 [, O: ^  |8 a+ A: h# Z
( o" W% }; X  e
2.3 连接关系
$ l0 E; a( l2 J1 y% L使用杜邦线进行连接,连接关系如下6 ?$ n1 G1 E* m

; G! h' u+ S, ? 9XE_3NY(V8`JFC6F(V1J0G8.png * V% Q& ]/ F: r  n0 g; E" @

+ t) d0 D5 x- ^; |3 程序实现" S2 A; u2 y" l0 {6 A7 N9 ]
3.1 代码架构

; t: q9 F3 P+ m4 }在原程序的基础上,进行删减工作,程序架构如下。
+ l0 B$ X9 a8 G. i+ e- W' C# g6 O
{_V7D_`~GS{H)0I]5447C10.png # \- D$ [5 V& U  X( e/ h/ w
3 g, ]7 k! o, I2 i' m8 j2 k7 o
3.2移植工作
7 \2 Y8 J: a# P) c% K8 x1,删除hd.s文件增加md.s文件,,删除触摸相关部分代码,如IIC等。删除了touch相关的代码(最小系统板没有IIC,不支持)。
# U9 F9 A, u# L3 ?% @; \
: X5 T" N1 q0 C/ g+ R2 j" q 994GP~W7_Y23G9N4X]RLWT7.png 4 s+ c$ x; }* \4 e9 k
( o  e# W) c) ~. x7 e$ l2 ]
2,点击Keil的魔术棒,选择器件类型为STM32F103C8。6 J  e, X/ k' |2 r8 D( N/ H

9 [5 e$ z2 y- N( Y1 } ECT1NP0(]OCH[TXJTT~8YGJ.png , r0 d! k' d. y2 x

* C5 v( \* P+ n: a4 \4 V! ]3,在全局宏定义define中,hd改为md。: \; l" x& h/ m% L
20200501170104305.png
( y  I+ y% A! o8 O% N6 }0 s! O" R, K& d" {  _5 @0 D
4,修改GPIO口的定义
7 b; Q7 h  g5 Y* `$ a2 v将购买SPI屏幕附赠的Demo程序里的GPIO口修改为实际单板的GPIO口。( e3 O* n& J9 Y3 F1 G5 g8 U& V
& j4 k( B3 M# J2 ?3 {- f
3.3 SPI部分代码讲解
& r: U  n% s( k5 ?! bSPI2初始化,需要特别注意的是,SPI2是在APB1上,但是其使用的GPIO口是在APB2上,均需要使能其对应时钟。分频系数为2,时钟频率为36MHz/2=18MHz。使用SPI2的步骤为:
7 H# E/ @- L  }/ S1,初始化SPI2的GPIO口;- ~8 Z$ F  a$ e. T( Y1 L5 u; C
2,初始化SPI2功能;
9 f! \3 P9 J6 D( {3,使能SPI2。, Z( v6 h; _- n4 [
若需要将SPI2改到SPI1,在初始化这里,不仅需要改动GPIO口,还要注意SPI1在APB1上,另外最大时钟不能超过18MHz,因此分频系数需要改为4(72MHz/4)。在使用CUBEMX配置时,若分频系数设置错误,将会弹出错误警示框。* H& V  t1 R6 Z) z
# C0 W7 [0 U0 g, w. x0 B' O
  1. void SPI2_Init(void)        $ L+ M8 m* d- |0 a9 T) Q# Y; P5 P
  2. {
    0 k; g+ S+ s* s) W+ H, O
  3.         SPI_InitTypeDef  SPI_InitStructure;" j0 F* `/ D: H, D
  4.         GPIO_InitTypeDef GPIO_InitStructure;; p( z/ }& z+ j, a
  5.         //配置SPI2管脚( d" h/ B- i: J+ o* `
  6.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB, ENABLE);
    9 D3 P8 ?# B" R/ T; G
  7.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;
    0 s7 Q! r: g/ x' ?
  8.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;- P+ Q0 [1 B. r! D& Y5 l4 u6 \
  9.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    7 V' s  T4 k4 \& F* u' V  e2 G
  10.         GPIO_Init(GPIOB, &GPIO_InitStructure);
    3 M- S, M, I8 L. H3 N  s6 M
  11. " h- p( E  J0 J3 d) g- _: S
  12.         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_14;    5 i5 v9 A! \1 y: H8 P
  13.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    , q% Y3 f. z+ ]/ F3 H: C
  14.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
    7 [$ ^* g  b& x9 C& \7 R
  15.         GPIO_Init(GPIOB, &GPIO_InitStructure);  
    : Q) F* W0 z. p( h# b, E
  16.         //SPI2配置选项% r! K/ d2 `9 ]  I1 o
  17.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2 ,ENABLE);( w& a) T& Y: h* t
  18.            
    0 C- p+ `5 A- a; }4 c5 R
  19.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    1 L2 s; G/ T- s# N! @
  20.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    7 f. B; _- k( |5 J, t5 G
  21.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
      Z* F/ s4 `+ l
  22.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
      j. o/ n5 |- `& D. Y- p7 F- O# l
  23.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;1 c) F- i  `" u
  24.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
    2 t. A$ D( P6 q; Q+ N5 ]
  25.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
    6 w3 t4 k- W4 T8 M0 I' M
  26.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    # x, L5 A( k9 v4 H5 h$ l5 Q
  27.         SPI_InitStructure.SPI_CRCPolynomial = 7;8 |: u- V& U* X! q! H$ `9 l
  28.         SPI_Init(SPI2, &SPI_InitStructure);
    & G5 X. J4 ?7 A9 K# b
  29.         //使能SPI2. ~: s, o7 b' C. J
  30.         SPI_Cmd(SPI2, ENABLE);   8 Z" P4 T+ P, y* \
  31. }
复制代码

- E/ V, p; r: P& {2 @  m4 实验结果
( t8 C2 x2 O" b9 `6 ^实验结果与预期相同,实现了相关功能。64k的flash和20k的ram可以驱动显示屏,由于SPI速率的问题,刷新速度不如FSMC这种接口。/ w" H8 n$ Z3 h& W1 E# z; H. g- x

0 e, ^, a# r) `; z DDSB92B(MSCA6GY2G6}`5%8.png 3 k8 x6 q7 J6 D  d

! K0 R- R/ t8 q' S* P! F5 迁移到RBT6开发板
4 p( n" R2 D# ]! g0 y" \5.1 单板连接
- W9 `- Y( p$ h( ^) G
后续做了一个20PIN转14PIN的转接板,将程序移植到了RBT6开发板上。这样就不需要繁杂的飞线,便于拆装,也不容易出现硬件故障。转接板的连接关系如下。
' V! g) f0 ^7 I; S. E7 q" Z5 y
" R* |2 n" U$ G- ?+ B" {1 ~9 o XT_1BXU)0U5AC]D{3B$SV7A.png
5 G7 I" N3 x* u+ Z9 u1 E( G7 V4 ~' [; U$ \- o! o
移植后的效果图如下
5 z! K) m1 t: ^. s( N
9 B$ s7 A' t0 e7 P) b5 ^) b' ?: O; ?, w) d. J3 D
6 Z5 G9 `6 Z/ @! x& C
6 STM32F407的LCD程序的移植0 w( d# `0 O$ h8 d3 s
后续将正点原子F407的LCD显示程序移植到了启明欣欣开发板,类似方法。这个屏幕时使用FSMC进行驱动,屏幕的主控芯片是9341,在移植过程中遇到了一个问题,折腾了好久才搞定。
% w9 |7 L+ h$ r6 y! q7 ?) i( O( |' e4 l5 C6 @
K5SZ@{01O~I8I[2YYXY}C}E.png
. D- k) y; A1 G6 O0 m7 ~9 Z) N" Y& Z, r" V% B* z% T
开发板LCD第2脚连接F407的A12,而正点原子定义的2脚连接到芯片的A6,这将导致读写数据指令时偏移地址的改变。在lcd.h文件中正点原子定义的偏移地址为0x7E,未改动时移植到启明开发板上LCD屏幕一直花屏。后来将偏移地址改为0x00001FFE后成功解决了此问题。* z1 [0 e5 Z4 A- I/ t, z* N$ P3 M

0 F7 B' C# `5 a) W+ j% H: Y5 b
  1. //使用NOR/SRAM的 Bank1.sector4,地址位HADDR[27,26]=11 A12作为数据命令区分线- Z5 W3 X' @4 Y9 ?! J
  2. //注意设置时STM32内部会右移一位对齐! 这里是1FFE  0001 1111 1111 1110                            6 t3 o( L+ Y2 w2 n' i, f; y8 N
  3. #define LCD_BASE        ((u32)(0x6C000000 | 0x00001FFE))
    : c" r0 i) e  B/ ^
  4. #define LCD             ((LCD_TypeDef *) LCD_BASE)
复制代码
- z& O- U5 w7 A. v' q
程序移植成功显示如下图,启明的开发板相对正点原子便宜非常多,但是例程很少,在解决LCD显示问题后,正点原子的大多数例程包括FreeRTOS等就可以愉快的进行移植修改玩耍了。正点原子的LCD.h文件兼容了很多他们家的屏幕,编译后比较臃肿,经过一番优化后,lcd.c源码减少了近千行,编译后的空间占用也减少了几十KB。1 Q, S+ t. S# A1 t4 o7 L6 y

$ ^; }  w# E5 E 0OC~)5}K~2UQ]91I)I]H()O.png . h- K% D3 a4 @% K8 \9 t

# W6 W+ H8 g) P* [) J总结经验教训,对于这种程序的移植还是要对本身的原理比较清楚,否则遇到稍微复杂一些的就容易发生失败,而且还找不到原因,比较打击自信心。
4 O5 c5 j! T1 U: I  }
* {' d* @, `( D
9 J: m7 W/ s1 u$ A3 }, u/ Z$ T
) s" O5 ~' p/ @$ b' W
20200501171557119.gif
赞 收藏 评论0 发布时间:2022-5-5 16:45

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版