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

STM32F103ZET6的FSMC接口配置调试TFT LCD屏相关注意事项

[复制链接]
gaosmile 发布时间:2020-7-12 18:43
STM32F1系列单片机有多种外设,外设配置方式比较一致,一般是使能外设所在GPIO口时钟、使能外设的时钟,在禁止外设的情况下配置外设的时序以及中断和DMA等。大部分的外设配置相对简单,但是FSMC接口因为配置比较复杂,往往让一些初学者一头雾水。本文记录了本人在STM32F103ZET6的FSMC接口配置调试TFT LCD屏相关注意事项。
; _- |4 O# L) y! e: Y; q
1   FSMC接口GPIO配置

  1. . M- o3 t  A& c8 f' }9 _
  2. /** FSMC GPIOConfiguration
    3 j& B, r" D8 d+ P# K& N' q
  3.   PF0  ------> FSMC_A0
    ' j* g' _0 J+ r& c* W, t
  4.           ------> LCD_RS: 0: Reg,1:Data
    6 k8 m7 {2 S0 b# @5 n- H
  5.   PE7  ------> FSMC_D40 R8 v) q- K5 E8 {1 \
  6.   PE8  ------> FSMC_D5
    8 ^( l1 w  G' ^- i! K# a
  7.   PE9  ------> FSMC_D65 o% A  m& ^1 Z# I& n
  8.   PE10  ------> FSMC_D7
    ( L- _, }) O* R  _, v
  9.   PE11  ------> FSMC_D8
    : l. ]& s) M' ^3 M1 g' ~$ f" x
  10.   PE12  ------> FSMC_D94 h7 k" ?0 c$ a6 T! U
  11.   PE13  ------> FSMC_D10
    " I  \) s! k2 r
  12.   PE14  ------> FSMC_D11
    - B5 z$ q9 P& }
  13.   PE15  ------> FSMC_D12
    3 ?2 h5 s# u8 p) |8 Z6 w! w
  14.   PD8  ------> FSMC_D133 O9 `/ H3 O) i, k& G2 D) X. n! S
  15.   PD9  ------> FSMC_D14
    ; d& y% w3 p% _6 o: a
  16.   PD10  ------> FSMC_D156 Y# b+ Z9 W5 I8 o2 J; Y
  17.   PD14  ------> FSMC_D0
      c( X5 H% G; s! d  a$ N4 a. j3 Q
  18.   PD15  ------> FSMC_D1
    $ y1 U3 O5 w8 h) U4 L  R
  19.   PD0  ------> FSMC_D2+ ^$ i7 L, d& c: C0 U
  20.   PD1  ------> FSMC_D3& f# Y9 g3 w* P
  21.   PD4  ------> FSMC_NOE3 Y4 x, ]* ^" z: J/ O3 M
  22.           ------> LCD_RD    Default:1,Value:0  ) D1 j1 `, d9 n+ G
  23.   PD5  ------> FSMC_NWE
    4 C/ J: H) b: s
  24.            ------> LCD_WR  Default:1,Value:0) x) C/ U/ n0 X; m$ h3 t
  25.   PG12  ------> FSMC_NE4. U9 J' G2 S" a8 A' H$ \
  26.              ------>LCD_CS  Default:1,Value:0
复制代码
微信图片_20200712184021.jpg
- h: n0 P, ^& ^7 R# f/ l" p7 i; c; }
2 初始化FSMC时序! ~+ P6 T0 d+ o5 ^* {9 s7 l. ?

  1. . Y4 x2 t- N% @% I+ s1 u7 d
  2. /* FSMC initializationfunction */
    9 H, i" Y4 n$ @5 V  M( `
  3.   FSMC_NORSRAM_TimingTypeDef Timing;
    $ E9 G, n2 h& H' R; G  ^
  4. SRAM_HandleTypeDef hsram1;1 m! {$ ?  g) e5 q7 _1 D9 g7 s

  5. 3 Z# L  H6 P( Y; n) |4 e
  6.   hsram1.Instance = FSMC_NORSRAM_DEVICE;
    6 ~" d. d9 B: ]
  7.   hsram1.Extended =FSMC_NORSRAM_EXTENDED_DEVICE;( ^1 W. L1 _- X9 \
  8.   /* hsram1.Init */  ?- D3 v- C1 v* P
  9. hsram1.Init.NSBank = FSMC_NORSRAM_BANK4;0 z7 [. ^, H+ b+ w8 b
  10. hsram1.Init.DataAddressMux =FSMC_DATA_ADDRESS_MUX_DISABLE;2 k5 k9 j/ A# [6 S
  11. hsram1.Init.MemoryType=FSMC_MEMORY_TYPE_NOR;
    ; V) }8 x" F- d
  12. hsram1.Init.MemoryDataWidth =FSMC_NORSRAM_MEM_BUS_WIDTH_16;
    + f; w. }  I5 c: S
  13. hsram1.Init.BurstAccessMode =FSMC_BURST_ACCESS_MODE_DISABLE;6 j0 N  D; B6 S2 C9 h: W2 v
  14. hsram1.Init.WaitSignalPolarity =FSMC_WAIT_SIGNAL_POLARITY_LOW;
    + j& f- `6 m7 B: h5 L0 H
  15. hsram1.Init.WrapMode =FSMC_WRAP_MODE_DISABLE;) Y, D6 J  [0 J; d$ W: y
  16. hsram1.Init.WaitSignalActive =FSMC_WAIT_TIMING_BEFORE_WS;
    7 A) K1 M9 f2 x2 ]* m1 |" R7 A6 r
  17. hsram1.Init.WriteOperation =FSMC_WRITE_OPERATION_ENABLE;( B+ l9 y9 T% R* g, o$ B- u: S
  18. hsram1.Init.WaitSignal =FSMC_WAIT_SIGNAL_DISABLE;+ a) Y: a* C2 b: Y6 l. U7 U
  19. hsram1.Init.ExtendedMode =FSMC_EXTENDED_MODE_DISABLE;
    4 }$ n' h& b- Y: e- z" P4 E: _6 A/ L
  20. hsram1.Init.AsynchronousWait =FSMC_ASYNCHRONOUS_WAIT_DISABLE;1 i# `( Z! Y9 g7 a" F7 R
  21. hsram1.Init.WriteBurst =FSMC_WRITE_BURST_DISABLE;9 t7 ~$ k' a5 h/ x1 g9 v
  22.   /* Timing */
    8 F0 q: t/ U2 X' {
  23. Timing.AddressSetupTime = 0x04;8 r2 f9 m; ^) H5 u* p
  24. Timing.AddressHoldTime = 0x02;& W9 y* O( S$ g
  25. Timing.DataSetupTime = 0x08;; _3 P, s% x0 X
  26. Timing.BusTurnAroundDuration = 0x00;7 T6 ~$ l1 O9 F5 K9 |
  27. Timing.CLKDivision = 0x00;
    6 p6 L8 ~- ?9 R/ R, {  I8 R" t
  28. Timing.DataLatency = 0x00;
    , D5 A9 s* |2 ?$ n/ r/ G
  29. Timing.AccessMode = FSMC_ACCESS_MODE_B;  后面数值决定读写屏快慢。
复制代码

; e% n; O+ @' F) O
    - C2 A* K4 f# ~4 \; v3 }* Z
    注意点:
  • . n8 [8 }; M1 q) o; A1 {  Y
1  因为STM32的地址是32bit的,数据是按照8bit组织的,如果lcd的数据选择8bit的话,地址A0就是正常的输出,如0x60000000输出A0=0;  0x6000 0001输出A0=1;对应数据是byte;如果lcd的数据选择16bit的话,地址A0就,如0x60000000输出A0=0;  而0x60000002对应A0=1;对应数据是word,也就是说每两个原来基于byte结构的地址对应一个地址线上实际的word长度的地址;: H6 M% A& k& K" G+ C

  1. 7 A+ M" J2 ], X7 V! x0 Q
  2. #define Bank1_LCD_D   ((uint32_t)0x6C000002)    //DispData ADDR
    & z4 y2 V$ X, ~$ W
  3. #define Bank1_LCD_C   ((uint32_t)0x6C000000)   //DispReg ADDR
      R# \6 ~  X# U3 n6 L

  4. ( ]: z# u- J3 t$ s8 d2 M- P" s" [" W
  5. void LCD_WR_REG(uint16_t index)
    ' \* {! `% L4 p5 |% X; e
  6. {       *(__IOuint16_t *) (Bank1_LCD_C) = index;}
    & Q6 P. t& S, V, x6 c5 q( ]& x3 y
  7. 6 X- w; }) H) r2 u: \$ c% A% g
  8. uint16_t  LCD_READ_DATA(void)5 }/ G. C3 h: Z# J' s
  9. {       uint16_ta = 0;
    1 D% K) H! b2 L6 W& U' s( d
  10.         a=*(__IOuint16_t *) (Bank1_LCD_D); //L0 p: X* p- t! R5 H- f: U  p
  11.         return a;
    " h5 _9 C5 G$ n0 e. o9 o' p
  12. }
复制代码
2    Image2LCD软件转换时注意扫描方式和数据位宽度,以及高低为顺序。1 W1 Y* U( N; ^3 x
微信图片_20200712184035.jpg
! R9 k9 `+ m# Y0 K9 ^; N
实际效果:
6 \; X, a& z$ k2 z3 U3 C3 G
微信图片_20200712184039.jpg ! D) U. @+ U$ G/ f4 C1 j) s8 \& `
* r$ c0 |' d* \( t% [( }4 I

' C" C8 A( x# ?2 H! r
赞 收藏 1 评论1 发布时间:2020-7-12 18:43

举报

1个回答
goyhuan 回答时间:2020-7-13 14:02:46
“如果lcd的数据选择16bit的话,地址A0就,如0x60000000输出A0=0;  而0x60000002对应A0=1;对应数据是word”

所属标签

相似技术帖

官网相关资源

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