请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
gaosmile 发布时间:2020-7-12 18:43
STM32F1系列单片机有多种外设,外设配置方式比较一致,一般是使能外设所在GPIO口时钟、使能外设的时钟,在禁止外设的情况下配置外设的时序以及中断和DMA等。大部分的外设配置相对简单,但是FSMC接口因为配置比较复杂,往往让一些初学者一头雾水。本文记录了本人在STM32F103ZET6的FSMC接口配置调试TFT LCD屏相关注意事项。+ ^5 O; R- I' `" c5 l" G0 a
1   FSMC接口GPIO配置
  1. 0 h2 h% i, m4 @; K& F0 a# C2 Z& q
  2. /** FSMC GPIOConfiguration 8 ?$ }3 L$ [; k0 i; {  X! y
  3.   PF0  ------> FSMC_A0 6 x, Q8 s( [6 e% V* u8 t. o
  4.           ------> LCD_RS: 0: Reg,1:Data
    9 {0 r% N1 R* V* r: G1 n: C
  5.   PE7  ------> FSMC_D4' R, u( _# \9 t) _' e  P; m
  6.   PE8  ------> FSMC_D59 i1 b" b& [" R0 C
  7.   PE9  ------> FSMC_D6
    2 V$ ~2 {4 s6 M
  8.   PE10  ------> FSMC_D7
    . |7 P1 k: p6 B* Z- o; w
  9.   PE11  ------> FSMC_D8
    2 f9 S% Q: r8 l/ o4 [
  10.   PE12  ------> FSMC_D9! p3 P' B8 _' E+ r+ D3 \! K
  11.   PE13  ------> FSMC_D10* x  k; M% g( r4 f6 b
  12.   PE14  ------> FSMC_D11
    ) y$ i8 q0 C- m. ]
  13.   PE15  ------> FSMC_D12
    2 j! O( v8 ]5 ~$ d% r  \) h
  14.   PD8  ------> FSMC_D13
    6 r7 v+ Y2 Y7 a* p2 K! L
  15.   PD9  ------> FSMC_D145 y, @; K  M8 T
  16.   PD10  ------> FSMC_D15
    4 ?0 v( z# ^; P2 h, K8 V6 T2 Z
  17.   PD14  ------> FSMC_D0- n2 ?, W: E* L; {! D
  18.   PD15  ------> FSMC_D1' \( `  e& u4 F. q
  19.   PD0  ------> FSMC_D2- d* I, h/ J( ?9 M
  20.   PD1  ------> FSMC_D3
    1 V# C2 x1 T, f" I% J- y
  21.   PD4  ------> FSMC_NOE
    ' K. ?+ }, c% M0 G; n
  22.           ------> LCD_RD    Default:1,Value:0  % U* f  x$ W( i8 ]
  23.   PD5  ------> FSMC_NWE
    $ I5 E- ?4 h' B% s. r* E8 E
  24.            ------> LCD_WR  Default:1,Value:0! o2 ?5 }1 j1 h$ m* ^7 g4 J1 p; i
  25.   PG12  ------> FSMC_NE4  @0 V/ S: b, X# N4 K9 |% V
  26.              ------>LCD_CS  Default:1,Value:0
复制代码
微信图片_20200712184021.jpg
* x5 Z: D+ b* Z+ M0 {) @( j; g* A
2 初始化FSMC时序; f* u7 _5 Y! E1 |" r: w3 G$ f! ^1 x
  1. 5 ^7 |! ^- n/ B% U/ g
  2. /* FSMC initializationfunction */5 w4 M' z& H) j( r
  3.   FSMC_NORSRAM_TimingTypeDef Timing;
    : k7 v3 L  F( z) o
  4. SRAM_HandleTypeDef hsram1;
    , L1 K6 G$ e- F

  5. / S9 I2 C* z/ M, l) x9 T5 b& i7 N
  6.   hsram1.Instance = FSMC_NORSRAM_DEVICE;
    6 ?! W- E, ]2 b. t- C
  7.   hsram1.Extended =FSMC_NORSRAM_EXTENDED_DEVICE;
      O4 G6 t2 z5 [& p$ z) g1 H
  8.   /* hsram1.Init */
    ) {* z- \) v' C( p, x0 B, K
  9. hsram1.Init.NSBank = FSMC_NORSRAM_BANK4;
    0 a; P, ~. C$ ~
  10. hsram1.Init.DataAddressMux =FSMC_DATA_ADDRESS_MUX_DISABLE;
    5 e. y) Q& h9 C3 f# B
  11. hsram1.Init.MemoryType=FSMC_MEMORY_TYPE_NOR;: u3 N3 M- G1 \: j# Y' Y8 J) i) D
  12. hsram1.Init.MemoryDataWidth =FSMC_NORSRAM_MEM_BUS_WIDTH_16;( W' }8 F9 A, H$ ], j- j
  13. hsram1.Init.BurstAccessMode =FSMC_BURST_ACCESS_MODE_DISABLE;. ]  I3 T" J! G( S$ Z: _
  14. hsram1.Init.WaitSignalPolarity =FSMC_WAIT_SIGNAL_POLARITY_LOW;
    - J- [$ F" F" w
  15. hsram1.Init.WrapMode =FSMC_WRAP_MODE_DISABLE;
    - h8 Y- Z  I$ z. K
  16. hsram1.Init.WaitSignalActive =FSMC_WAIT_TIMING_BEFORE_WS;) s1 b, ~. b& Z9 t# _* S* p4 z& D
  17. hsram1.Init.WriteOperation =FSMC_WRITE_OPERATION_ENABLE;
    . i* A- k1 u( H7 @3 _, \9 o8 m
  18. hsram1.Init.WaitSignal =FSMC_WAIT_SIGNAL_DISABLE;* Q- L4 x3 g4 o$ g% [* {" T
  19. hsram1.Init.ExtendedMode =FSMC_EXTENDED_MODE_DISABLE;, r5 \3 h+ [) ~- ~8 \' s; b
  20. hsram1.Init.AsynchronousWait =FSMC_ASYNCHRONOUS_WAIT_DISABLE;, K2 @" ~2 c9 V; ?2 f1 P
  21. hsram1.Init.WriteBurst =FSMC_WRITE_BURST_DISABLE;
    5 Z* n% Q5 ~/ I6 q" E& l, A
  22.   /* Timing */- G; V7 m# J+ q5 X4 ~' g  c
  23. Timing.AddressSetupTime = 0x04;! d' h& ~) ^: u
  24. Timing.AddressHoldTime = 0x02;( `; Z" l# r& s. \0 z' C! n
  25. Timing.DataSetupTime = 0x08;$ S* W9 V* o+ D9 e# e) b: z' {
  26. Timing.BusTurnAroundDuration = 0x00;5 G% K& _( i' x7 f! d( L6 k
  27. Timing.CLKDivision = 0x00;( U8 Z5 [* \3 q# C! K0 p/ s( |
  28. Timing.DataLatency = 0x00;
    : A# M  H" m) l. g
  29. Timing.AccessMode = FSMC_ACCESS_MODE_B;  后面数值决定读写屏快慢。
复制代码

5 y& ^! p3 F+ P' U
    * e3 H" N0 w9 K9 E8 f
    注意点:
  • / Y" I' l3 A9 Q! r, a4 v+ J+ q
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长度的地址;
- b/ S9 g5 H- N, v9 P

  1. 2 f. K' p8 I0 h3 l
  2. #define Bank1_LCD_D   ((uint32_t)0x6C000002)    //DispData ADDR- w- ]- u3 E, K* Z1 Y
  3. #define Bank1_LCD_C   ((uint32_t)0x6C000000)   //DispReg ADDR/ x- S  s. ^2 I' R6 q( g  v

  4. 1 \/ O  y4 ]. y8 R; @
  5. void LCD_WR_REG(uint16_t index)0 I5 ]; j/ b( b! P
  6. {       *(__IOuint16_t *) (Bank1_LCD_C) = index;}7 Z6 Y% t9 d3 O" O4 J: y
  7. 6 J0 t3 D1 w8 Q0 g5 m
  8. uint16_t  LCD_READ_DATA(void)8 H0 K! n. V& W& \& n# h( z
  9. {       uint16_ta = 0;4 D: h3 N3 t7 [3 m
  10.         a=*(__IOuint16_t *) (Bank1_LCD_D); //L
    0 m- m$ K4 ]3 k4 l
  11.         return a;) T0 N4 r; @' W+ x' g' v
  12. }
复制代码
2    Image2LCD软件转换时注意扫描方式和数据位宽度,以及高低为顺序。: e( Z. Y) p! f( T2 y; u; ^3 I/ x
微信图片_20200712184035.jpg
  l# E$ u1 q4 C
实际效果:' J8 O" e  g; g5 f+ O+ ]7 C
微信图片_20200712184039.jpg
0 Q3 d2 K& S( q6 W$ ^& w  ^2 Y- r/ }& V4 _/ `( Y! H8 \( j

7 o3 V" U3 }" |
收藏 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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版