STM32+SSD1963+TFT(FSMC)已调试通过的代码。 其中要注意的两点: 1.外部访问地址需加volatile,否则keil MDK 优化会将部分代码优化掉,造成错误。 volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。 " o9 p q2 K" i& _: d! }, v% p
2. FSMC内部地址和外部实际地址有区别。如A18连线对应内部地址是A19。 - <div align="left"><font style="font-size: 13px" face="Tahoma" color="#000000">// ssd1963 #d/c -------- STM32F103VCT6 A18& }5 T4 [) ^9 A- |( R/ \4 y3 _' l
- </font></div><font face="Tahoma" color="#000000">
9 C: z H% |& u - </font><div align="left"><font style="font-size: 13px" face="Tahoma" color="#000000">#define LCD_COMM_ADD *((volatile u16 *)0X60000000)
- O/ o" C! c' s0 L2 k0 H% z$ G4 R - #define LCD_DATA_ADD *((volatile u16 *)0X60080000)
; }, H' H- i$ f - </font></div><div align="left"><font style="font-size: 13px" face="Tahoma" color="#000000"> #define WriteCommand(cmd) {LCD_COMM_ADD = cmd;}$ X' s: p0 W1 W H/ C; F, u
- #define WriteData(data) {LCD_DATA_ADD = data;}</font></div><font face="Tahoma" color="#000000">
# @6 C+ j( r: _1 y5 F# [* s e - </font><div align="left"><font style="font-size: 13px" face="Tahoma" color="#000000">void LCDFSMCConfig(void)' ?( A: C6 L# L
- {
4 p# B3 _ M. f) ]' r# \! Y - FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
9 t8 M+ D+ n* X) S" Y; s1 {9 T - FSMC_NORSRAMTimingInitTypeDef p;
( ]6 c' B$ u: x B4 q9 H - GPIO_InitTypeDef GPIO_InitStructure;0 \1 K8 ?+ _, e+ s
- /*-- FSMC Configuration ------------------------------------------------------*/</font></div><div align="left"><font style="font-size: 13px" face="Tahoma" color="#000000">/* Enable FSMC, GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks */
. D6 E' Y2 X& l T, Q0 S - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
7 D3 W7 ?: ` j3 Q& o - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE |
0 @: G9 {6 o) v% X, C - RCC_APB2Periph_AFIO, ENABLE);</font></div><div align="left"><font style="font-size: 13px" face="Tahoma" color="#000000">/*===========GPIO For the LCD_Bus========================*/
" D M3 y" E- x - /* Data /Address lines configuration */: m7 \1 D" K0 A* [; y
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 |
" G) C: D0 O' @5 y9 w - GPIO_Pin_14 | GPIO_Pin_15;
' C5 N2 u i* ?+ t x/ m - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;5 \3 H' ?0 d2 L
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
7 Y! i" m* W8 A! ~+ t" u4 m& k, W - GPIO_Init(GPIOD, &GPIO_InitStructure);</font></div><div align="left"><font style="font-size: 13px" face="Tahoma" color="#000000"> GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 |
; I" [! J) g |# s8 C' r9 C% G) Q - GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
/ i s0 R) A% t9 M - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;( e8 H2 ?3 e* s1 K
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;. T9 [0 _: I& E& s% Z; @4 G( o1 a
- GPIO_Init(GPIOE, &GPIO_InitStructure);</font></div><div align="left"><font style="font-size: 13px" face="Tahoma" color="#000000"> /* Address lines configuration: A18*/9 D; f8 Y e1 ~; ^3 @ e
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;8 G( [4 V9 d1 s
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
0 c. }1 N c0 v# ^; b( g( u - GPIO_Init(GPIOD, &GPIO_InitStructure); </font></div><div align="left"><font style="font-size: 13px" face="Tahoma" color="#000000"> /*===========GPIO For the Control========================*/! ~9 O0 [. p3 X4 I2 A* Y) [
- /*!< NOE and NWE configuration */
+ Y5 x. G* [5 K7 x" x4 g+ Q - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 |GPIO_Pin_5;
5 }9 Y. j' |6 a& e2 [ -
. s, [: r0 q: z& R - GPIO_Init(GPIOD, &GPIO_InitStructure);
$ C2 n- H f8 O) N - $ T) A, [* ~3 Y% _+ ` m9 v
- /*!< NE1 configuration *// o+ y2 u1 Q: d# Q0 I) x, N$ v4 ]
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;/ H! p; }1 Z2 j# i
- GPIO_Init(GPIOD, &GPIO_InitStructure);
# t! c/ M! y1 ] -
4 w3 z9 c3 \1 P - /*!< NADV configuration */" c! F6 z; \; T! i* N. p( d
- // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
7 ^$ ?$ L2 ^. H& ` - // GPIO_Init(GPIOB, &GPIO_InitStructure);
/ t" w% r* U2 T" h: v - #ifdef LCD_USE_TE+ {5 l* ^' k3 C4 e W# X
- /*TE :busy*/
3 }4 B9 U4 ?# ] - GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LCD_TE;
" {9 A2 g4 P: | X - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
0 s% x& z/ k8 o0 q8 U6 ]+ \ - GPIO_Init(GPIO_PORT_LCD_TE, &GPIO_InitStructure);
5 [3 ^6 b# W, n3 b8 F- Q) E$ H - #endif
! {4 t" m. n7 V: S6 X! T! ? - /*!< NBL0, NBL1 configuration */7 e5 c% X$ R" o4 u; C+ N, f7 M' I
- // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;; k4 `9 [) x6 a) Z: A+ h, o- X
- // GPIO_Init(GPIOE, &GPIO_InitStructure);
$ C9 J+ C! z6 Y/ [# ]! j* K - GPIO_SetBits(GPIOD, GPIO_Pin_7); //CS=1
5 o5 h$ z1 n, k' Y, P - GPIO_SetBits(GPIOD, GPIO_Pin_14| GPIO_Pin_15 |GPIO_Pin_0 | GPIO_Pin_1); $ `! x& P" j8 [7 E8 }0 G* u% a
- GPIO_SetBits(GPIOE, GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10);
- } s I" C0 d - GPIO_ResetBits(GPIOE, GPIO_Pin_0);
) @0 w) B0 N/ ?4 H- Y - GPIO_ResetBits(GPIOE, GPIO_Pin_1); //RESET=0: s2 h$ b% P" L
- GPIO_SetBits(GPIOD, GPIO_Pin_4); //RD=1: `, ?9 o' g$ ^" g3 { Q1 P
- GPIO_SetBits(GPIOD, GPIO_Pin_5); //WR=1 1 _7 Y% N% n# p( ?* @$ h" c
- /*-- FSMC Configuration ------------------------------------------------------*/
3 c2 X9 ]7 [' v+ I+ i" W4 G+ d -
" M' c) O% g% G9 }/ Q - /*----------------------- SRAM Bank 1----------------------------------------*/
1 |1 l1 l0 }9 V: C - /* FSMC_Bank1_NORSRAM1 configuration */7 w3 ]) X9 D2 p% ^3 A* B
- p.FSMC_AddressSetupTime = 0x02;//1;* ~' j1 I2 ]3 q l) h- Q
- p.FSMC_AddressHoldTime = 0x00;//0;
6 o8 k* H$ v3 {+ m! W - p.FSMC_DataSetupTime = 0x05;//5//2;
" N% i2 G; a+ Z' b' \2 o - p.FSMC_BusTurnAroundDuration = 0;
2 n. u6 d; V4 i& Y. ? - p.FSMC_CLKDivision = 0;: M5 @. J' a! e
- p.FSMC_DataLatency = 0;
2 {3 r" a m# z9 N8 r! B2 `3 U1 t - p.FSMC_AccessMode = FSMC_AccessMode_B;//FSMC_AccessMode_A;
! _0 d" ?2 V2 ^( r - /* Color LCD configuration ------------------------------------
s: }# N9 y% Y: M i4 \% i - LCD configured as follow:
( i g" N0 A3 \, H0 v - - Data/Address MUX = Enable
* N* r$ h8 n1 P$ e2 d! |; l - - Memory Type = SRAM# w0 j$ p1 ~2 N$ V( b. g: e5 \
- - Data Width = 16bit
; S9 J2 [4 P6 v4 O - - Write Operation = Enable
7 u. X5 z, O% l, w - - Extended Mode = Enable/ b" ~7 {! ^) j; q5 s* I
- - Asynchronous Wait = Disable */# G" `5 L# `$ s8 s# O+ _8 D
- FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;
6 p* E$ f) e) v) {, ^- I - FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; //hy@
7 n# ?1 o! u* f8 h& M: v% p/ B - // FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Enable; //hy@ 2 B- b e- O' r1 T# D3 O3 u6 o4 v
- // FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;//FSMC_MemoryType_NOR;//FSMC_MemoryType_SRAM;//
0 e6 m& a# Q' c7 ` - FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR;//FSMC_MemoryType_SRAM;//</font></div><div align="left"><font style="font-size: 13px" face="Tahoma" color="#000000"> FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;( g; v9 J9 R+ M! k& Q) N& g
- FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
3 s( k7 i9 H _( o5 O6 \* x - // FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
- t4 `$ N/ v6 k, T ? j* n - FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
+ n$ F4 ^$ g% V - FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;7 G" Y$ f( F/ ^9 w- H0 Z
- FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
0 C! m4 U+ K: w* |" H - FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;7 Q& g8 {. {& w
- FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;! r% u3 n( A. O( X: n. }
- FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
- \& c( Y* Z: [9 s5 D2 g* T - FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;0 q9 k) e4 P y) Z/ F/ y- O
- FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;2 q% l* t: O- y" m" ^0 u4 v
- FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p; ]% q% e' h' Z% [' t h* {
- FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); & s! c4 V! f+ R* d5 _0 E
- /* BANK 1 (of NOR/SRAM Bank 1~4) is enabled */
8 R% X- n* k. c4 _2 q) f - FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);- v- e" _& D" z0 r' V
- }</font></div><font face="Tahoma" color="#000000">
- {/ i& j9 F, G/ A$ v! W. m9 o3 ? - </font><div align="left"><font style="font-size: 13px" face="Tahoma" color="#000000">/**9 z: @3 s( B; w
- * @brief Initializes the LCD.
1 p ^1 ]! z& e9 I- r$ u - * @param None/ B$ J; l( L4 H% Y6 N+ Y9 T
- * @retval None
# }' A+ z ^. ?( @* F% z; C% w8 I - */
* h- q j Q0 A3 H - void IzLCDDisplayInit(void)+ I' D/ Y; T. F! a7 T. [% }+ \4 a$ U
- {</font></div><div align="left"><font style="font-size: 13px" face="Tahoma" color="#000000">/* Configure the FSMC Parallel interface -------------------------------------*/% F4 G' m% j/ d2 O* x' k. z
- LCDFSMCConfig();2 D* r. E- R7 S2 `
-
# k/ Q9 {! S' R8 w u - DelayLoop(5); /* delay 50 ms */
' M2 e. W( R8 B- U/ f - //LCD_SetFont(&LCDDEFAULTFONT);: i/ l* W& P9 a2 _
- LCDSetFont(&LCDDEFAULTFONT);! e/ M+ f& {+ Y9 E+ E0 z
- InitSSD1963();</font></div><div align="left"><font style="font-size: 13px" face="Tahoma" color="#000000">
& U. }* B9 K0 h+ B - }</font></div>
复制代码
n* O' Z* V/ u3 s; A7 p6 ? |