原创
基于stm32f103zet6之使用FSMC驱动TFT的学习2
三、说了这么久的理论,来个实例分析更加形象了,首先硬件连线要明白
在原理图或者开发手册上面能够确定引脚复用问题
地址引脚:
(A0-A5 :PF0 - PF5) (A6-A9: F12-F15 ) (A10-A15:PG0-PG5)
(A16-A18:PD11-PD13) (A19-A22:PE3-PE6) (A23-PE2)
片选信号(NEx:PG12)因为我选择的是block4
写使能(NWR:PD5)
读使能(NOE:PD4)
至此控制引脚基本完成
下面就是数据引脚:
PD14-FSMC-D0 ----LCD-DB0
PD15-FSMC-D1 ----LCD-DB1
PD0-FSMC-D2 ----LCD-DB2
PD1-FSMC-D3 ----LCD-DB3
PE7-FSMC-D4 ----LCD-DB4
PE8-FSMC-D5 ----LCD-DB5
PE9-FSMC-D6 ----LCD-DB6
PE10-FSMC-D7 ----LCD-DB7
PE11-FSMC-D8 ----LCD-DB8
PE12-FSMC-D9 ----LCD-DB9
PE13-FSMC-D10 ----LCD-DB10
PE14-FSMC-D11 ----LCD-DB11
PE15-FSMC-D12 ----LCD-DB12
PD8-FSMC-D13 ----LCD-DB13
PD9-FSMC-D14 ----LCD-DB14
PD10-FSMC-D15 ----LCD-DB15
有了这些硬件连线是没有任何问题的
四、正式分析程序
1、硬件引脚配置函数
01 |
void LCD_CtrlLinesConfig(void) |
03 |
GPIO_InitTypeDef GPIO_InitStructure; |
04 |
/* Enable FSMC, GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks */ |
05 |
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE); //使能FSMC |
07 |
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | |
08 |
RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG | |
09 |
RCC_APB2Periph_AFIO, ENABLE); |
11 |
/* Set PD.00(D2), PD.01(D3), PD.04(NOE), PD.05(NWE), PD.08(D13), PD.09(D14), |
12 |
PD.10(D15), PD.14(D0), PD.15(D1) as alternate |
16 |
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | |
17 |
GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 | |
19 |
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; |
20 |
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; |
21 |
GPIO_Init(GPIOD, &GPIO_InitStructure); |
24 |
/* Set PE.07(D4), PE.08(D5), PE.09(D6), PE.10(D7), PE.11(D8), PE.12(D9), PE.13(D10), |
25 |
PE.14(D11), PE.15(D12) as alternate function push pull */ |
27 |
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | |
28 |
GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | |
30 |
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; |
31 |
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; |
32 |
GPIO_Init(GPIOE, &GPIO_InitStructure); //将配置写入GPIOE管脚 |
35 |
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; |
36 |
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; |
37 |
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; |
38 |
GPIO_Init(GPIOF, &GPIO_InitStructure); |
40 |
/* Set PG.12(NE4 (LCD/CS)) as alternate function push pull - CE3(LCD /CS) */ |
41 |
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 ; |
42 |
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; |
43 |
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; |
44 |
GPIO_Init(GPIOG, &GPIO_InitStructure); |
48 |
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; |
49 |
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; |
50 |
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; |
51 |
GPIO_Init(GPIOE, &GPIO_InitStructure); |
54 |
GPIO_ResetBits(GPIOE,GPIO_Pin_6); //复位脚 |
58 |
GPIO_SetBits(GPIOE, GPIO_Pin_6); //将复位脚拉高 |
细心观察,能够发现就是上面说的那些引脚嘛!
2、接下来的就是比较重要的FSMC的配置了
先上代码,然后慢慢分析吧
01 |
void LCD_FSMCConfig(void) |
03 |
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; |
04 |
FSMC_NORSRAMTimingInitTypeDef p; |
06 |
/*-- FSMC Configuration ------------------------------------------------------*/ |
07 |
/*----------------------- SRAM Bank 4 ----------------------------------------*/ |
08 |
/* FSMC_Bank1_NORSRAM4 configuration */ |
09 |
p.FSMC_AddressSetupTime = 0; |
10 |
p.FSMC_AddressHoldTime = 0; |
11 |
p.FSMC_DataSetupTime = 2; |
12 |
p.FSMC_BusTurnAroundDuration = 0; |
13 |
p.FSMC_CLKDivision = 0; |
14 |
p.FSMC_DataLatency = 0; |
15 |
p.FSMC_AccessMode = FSMC_AccessMode_A; |
18 |
Color LCD configuration ------------------------------------ |
19 |
LCD configured as follow: |
20 |
- Data/Address MUX = Disable |
23 |
- Write Operation = Enable |
24 |
- Extended Mode = Enable |
25 |
- Asynchronous Wait = Disable |
27 |
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4; |
28 |
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; |
29 |
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM; |
30 |
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; |
31 |
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; |
32 |
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; |
33 |
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; |
34 |
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_Be"" target= "_blank" > for eWaitState; |
35 |
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; |
36 |
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; |
37 |
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; |
38 |
//FSMC_NORSRAMInitStructure.FSMC_AsyncWait = FSMC_AsyncWait_Disable; |
39 |
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; |
40 |
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p; |
41 |
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p; |
43 |
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); |
45 |
/* BANK 4 (of NOR/SRAM Bank 1~4) is enabled */ |
46 |
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE); |
a、首先是时间参数的配置,我们在初始化的时候设置的bank4,所以这里对应的也是bank4,本函数主要使用了两种类型的结构体对FSMC进行配置,第一种
为 FSMC_NORSRAMInitTypeDef类型的结构体主要用于NOR FLASH的模式配置,包括存储器类型、数据宽度等。另一种的类型为FSMC_NORSRAMTimingInitTypeDef
文章评论(0条评论)
登录后参与讨论