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

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

[复制链接]
gaosmile 发布时间:2020-7-12 18:43
STM32F1系列单片机有多种外设,外设配置方式比较一致,一般是使能外设所在GPIO口时钟、使能外设的时钟,在禁止外设的情况下配置外设的时序以及中断和DMA等。大部分的外设配置相对简单,但是FSMC接口因为配置比较复杂,往往让一些初学者一头雾水。本文记录了本人在STM32F103ZET6的FSMC接口配置调试TFT LCD屏相关注意事项。6 s( @  T! k( J: X6 u
1   FSMC接口GPIO配置
  1. / l6 i& D1 m. W7 B! J
  2. /** FSMC GPIOConfiguration
    " Q* v& h  k6 S6 X
  3.   PF0  ------> FSMC_A0 ( _7 Z5 x9 S$ P7 M1 T3 D: D0 d
  4.           ------> LCD_RS: 0: Reg,1:Data
    ' e' J% _' Z8 G3 g2 i
  5.   PE7  ------> FSMC_D4. [7 b: A& n8 y' B8 Z
  6.   PE8  ------> FSMC_D5& W! C. ~7 o) k/ a$ @  u2 @9 P
  7.   PE9  ------> FSMC_D62 Y6 L8 Z3 c, P4 F# L/ C
  8.   PE10  ------> FSMC_D7+ W+ D9 {, ]1 l' G* q) `' e6 X  s  O: P
  9.   PE11  ------> FSMC_D8* A4 C- G, S$ b5 X2 n& |% D. x
  10.   PE12  ------> FSMC_D9
      g3 }& M& J6 |  M7 T2 o
  11.   PE13  ------> FSMC_D10
    7 }% B4 K+ U) }
  12.   PE14  ------> FSMC_D11
    7 y- s0 G8 B) D; c6 u, p5 h. e# j* p
  13.   PE15  ------> FSMC_D12
    # w3 q6 y1 N2 {0 g
  14.   PD8  ------> FSMC_D13
    / U' L, g% I- y& D/ V& q
  15.   PD9  ------> FSMC_D14
    " V* ]7 {+ q5 p1 o9 A; I
  16.   PD10  ------> FSMC_D15
    6 X1 Q% u( S5 a! ~% `
  17.   PD14  ------> FSMC_D0/ {5 H! L2 v% m
  18.   PD15  ------> FSMC_D1
    8 F& k2 E/ X2 Y! u
  19.   PD0  ------> FSMC_D2# C, ]: e9 H: v: X7 h( A, G
  20.   PD1  ------> FSMC_D3$ @9 Z3 N+ I7 h2 h* o$ h( ]# G
  21.   PD4  ------> FSMC_NOE
    . [1 F0 J# _+ ]. }% e6 ?( z
  22.           ------> LCD_RD    Default:1,Value:0  3 f' x( |* N: {7 Z* Y( w
  23.   PD5  ------> FSMC_NWE
    / G2 V* g1 O, S3 B2 _2 \
  24.            ------> LCD_WR  Default:1,Value:0
    + ]2 [9 _, p3 n6 {
  25.   PG12  ------> FSMC_NE4
    # ~  C! y0 ]+ v. h3 j% D5 x
  26.              ------>LCD_CS  Default:1,Value:0
复制代码
微信图片_20200712184021.jpg
! [5 _# j, a3 B* T
2 初始化FSMC时序1 v9 f( b* R; n) W
  1. * c; Z7 V' }4 g+ W  j
  2. /* FSMC initializationfunction */
    6 t3 \. [2 \0 j% D* x0 s9 K6 |
  3.   FSMC_NORSRAM_TimingTypeDef Timing;- f6 a+ c' l4 i% l
  4. SRAM_HandleTypeDef hsram1;
    - {! c' ^4 a5 K& }

  5. " A8 I" l- R6 j! |* v; w, \( K( }
  6.   hsram1.Instance = FSMC_NORSRAM_DEVICE;
    6 @: b+ u' S- D9 s2 n% ?
  7.   hsram1.Extended =FSMC_NORSRAM_EXTENDED_DEVICE;! W: M6 F' N# R( n! D# m) l; g
  8.   /* hsram1.Init */' ]; s% U" L! ]4 Y9 ?% e- {
  9. hsram1.Init.NSBank = FSMC_NORSRAM_BANK4;
    : j/ q1 c. [1 h: V2 S; \
  10. hsram1.Init.DataAddressMux =FSMC_DATA_ADDRESS_MUX_DISABLE;
    4 A" o; O3 D- ~  Z/ T% C6 l
  11. hsram1.Init.MemoryType=FSMC_MEMORY_TYPE_NOR;
    2 F' S; S# e- w) W# F) P
  12. hsram1.Init.MemoryDataWidth =FSMC_NORSRAM_MEM_BUS_WIDTH_16;% H2 R- X% g3 w9 R3 \
  13. hsram1.Init.BurstAccessMode =FSMC_BURST_ACCESS_MODE_DISABLE;
    & n4 ~3 `% z6 x- p" x! P; h: D. C
  14. hsram1.Init.WaitSignalPolarity =FSMC_WAIT_SIGNAL_POLARITY_LOW;
    2 N4 [% S: o( A5 S: ^
  15. hsram1.Init.WrapMode =FSMC_WRAP_MODE_DISABLE;# g% C. t! ?/ c+ J# q
  16. hsram1.Init.WaitSignalActive =FSMC_WAIT_TIMING_BEFORE_WS;* [, i. C; \$ N& W9 g: d8 c
  17. hsram1.Init.WriteOperation =FSMC_WRITE_OPERATION_ENABLE;3 s( K/ `0 _0 S5 ~. x
  18. hsram1.Init.WaitSignal =FSMC_WAIT_SIGNAL_DISABLE;
    : s. }- D* s7 R; C+ \
  19. hsram1.Init.ExtendedMode =FSMC_EXTENDED_MODE_DISABLE;, Z+ R% Z" Y: p% }5 N1 Y, B# z. \
  20. hsram1.Init.AsynchronousWait =FSMC_ASYNCHRONOUS_WAIT_DISABLE;
    2 S( E+ A$ E% ]- c
  21. hsram1.Init.WriteBurst =FSMC_WRITE_BURST_DISABLE;. s  \5 o6 Q% S7 Q
  22.   /* Timing */
    7 ^# q# z; Q: r8 T- X! m
  23. Timing.AddressSetupTime = 0x04;) t' V9 n) S) g9 O" ?
  24. Timing.AddressHoldTime = 0x02;! Z, T# d' o# n
  25. Timing.DataSetupTime = 0x08;% g+ E" o  R( ~* y
  26. Timing.BusTurnAroundDuration = 0x00;
    6 \- w- C, h0 h4 o4 ~1 y) f! p
  27. Timing.CLKDivision = 0x00;4 z( i1 A  ?0 k3 x9 p/ J
  28. Timing.DataLatency = 0x00;8 P8 k2 r4 U- ]2 b9 ~
  29. Timing.AccessMode = FSMC_ACCESS_MODE_B;  后面数值决定读写屏快慢。
复制代码

& j- X' G- H$ `7 a- z+ x3 [/ E9 _

    + h5 }: ?# r2 z注意点:

  • 0 q9 h) q- y" f0 G) p
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长度的地址;' R# R$ ]: C2 _& A
  1. " f0 G* H: D% u5 ]) ?" |" K% H* m
  2. #define Bank1_LCD_D   ((uint32_t)0x6C000002)    //DispData ADDR
    ) Q  Q# R5 r& o& C
  3. #define Bank1_LCD_C   ((uint32_t)0x6C000000)   //DispReg ADDR
    8 G/ r6 x- S. P" M" H' [
  4. % K$ d  e' S0 t! G3 ~, {) Z( ?
  5. void LCD_WR_REG(uint16_t index)
    7 n7 T/ ]/ c' c+ W% t
  6. {       *(__IOuint16_t *) (Bank1_LCD_C) = index;}/ W% s) P8 O" t& U
  7. & \7 }' Y5 M( i6 V
  8. uint16_t  LCD_READ_DATA(void)( }, \6 t; F3 s# S. e
  9. {       uint16_ta = 0;- r' f9 H5 h& k' u4 P
  10.         a=*(__IOuint16_t *) (Bank1_LCD_D); //L
    ' \, |" Z3 j6 V# @" y8 l
  11.         return a;+ j, G& l0 {/ w1 }; K5 N2 b5 ~8 t
  12. }
复制代码
2    Image2LCD软件转换时注意扫描方式和数据位宽度,以及高低为顺序。
9 n* X8 Z6 x7 f5 ]! n8 @) o) Q) O
微信图片_20200712184035.jpg $ q  d3 a9 W3 o, F; |
实际效果:
  @% c! Y. d7 W1 B% Y: K8 L
微信图片_20200712184039.jpg
0 b2 q+ e$ }* a) h* G+ w% q* C+ x" j5 j) H5 f" y
  m: Z9 K: x+ A4 q2 O
收藏 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版