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

基于STM32F103ZET6使用FSMC驱动TFT的学习 (二)

[复制链接]
EEFOCUS小白 发布时间:2015-4-1 10:10
四、正式分析程序
1、硬件引脚配置函数

: |+ _5 U/ u$ Z+ f" A- I# b. x7 X

  • 9 ^- N& y/ u& c
  • . o/ f" w( ~/ t. M; `, W* ]
  • void LCD_CtrlLinesConfig(void)  
  • {  
  •     GPIO_InitTypeDef GPIO_InitStructure;      
  •     /* Enable FSMC, GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks */  
  •     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);     //使能FSMC  
  •       
  •     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE |  
  •                          RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG |  
  •                          RCC_APB2Periph_AFIO, ENABLE);  
  •     //IO口复用功能时钟  
  •     /* Set PD.00(D2), PD.01(D3), PD.04(NOE), PD.05(NWE), PD.08(D13), PD.09(D14),
  •      PD.10(D15), PD.14(D0), PD.15(D1) as alternate  
  •      function push pull */   
  •   
  •     /*D端口初始化*/  
  •     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 |  
  •                                 GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 |   
  •                                 GPIO_Pin_15;      
  •     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  •     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
  •     GPIO_Init(GPIOD, &GPIO_InitStructure);  
  •   
  •     /*E端口初始化*/  
  •     /* Set PE.07(D4), PE.08(D5), PE.09(D6), PE.10(D7), PE.11(D8), PE.12(D9), PE.13(D10),
  •      PE.14(D11), PE.15(D12) as alternate function push pull */  
  •   
  •     GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 |   
  •                                  GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 |   
  •                                  GPIO_Pin_15;  
  •     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  •     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
  •     GPIO_Init(GPIOE, &GPIO_InitStructure);                      //将配置写入GPIOE管脚  
  •   
  •     /*A0地址线*/  
  •     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;  
  •     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  •     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
  •     GPIO_Init(GPIOF, &GPIO_InitStructure);  
  •       
  •     /* Set PG.12(NE4 (LCD/CS)) as alternate function push pull - CE3(LCD /CS) */  
  •     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 ;  
  •     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  •     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
  •     GPIO_Init(GPIOG, &GPIO_InitStructure);  
  •       
  •       
  •     /*复位端口PE6*/  
  •     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;  
  •     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  •     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  
  •     GPIO_Init(GPIOE, &GPIO_InitStructure);  
  •       
  •       
  •     GPIO_ResetBits(GPIOE,GPIO_Pin_6);    //复位脚  
  •       
  •     DelayMs(50);       //延时50ms  
  •       
  •     GPIO_SetBits(GPIOE, GPIO_Pin_6);     //将复位脚拉高  
  • } 7 x# h, h+ |: R. m0 U9 [3 m
void LCD_CtrlLinesConfig(void){        GPIO_InitTypeDef GPIO_InitStructure;                /* Enable FSMC, GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks */        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);     //使能FSMC                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE |                             RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG |                             RCC_APB2Periph_AFIO, ENABLE);        //IO口复用功能时钟        /* Set PD.00(D2), PD.01(D3), PD.04(NOE), PD.05(NWE), PD.08(D13), PD.09(D14),         PD.10(D15), PD.14(D0), PD.15(D1) as alternate          function push pull */                /*D端口初始化*/        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 |                                    GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 |                                     GPIO_Pin_15;                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        GPIO_Init(GPIOD, &GPIO_InitStructure);        /*E端口初始化*/        /* Set PE.07(D4), PE.08(D5), PE.09(D6), PE.10(D7), PE.11(D8), PE.12(D9), PE.13(D10),         PE.14(D11), PE.15(D12) as alternate function push pull */        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 |                                      GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 |                                      GPIO_Pin_15;        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        GPIO_Init(GPIOE, &GPIO_InitStructure);                                                 //将配置写入GPIOE管脚        /*A0地址线*/        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        GPIO_Init(GPIOF, &GPIO_InitStructure);                /* Set PG.12(NE4 (LCD/CS)) as alternate function push pull - CE3(LCD /CS) */        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 ;        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        GPIO_Init(GPIOG, &GPIO_InitStructure);                        /*复位端口PE6*/        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        GPIO_Init(GPIOE, &GPIO_InitStructure);                        GPIO_ResetBits(GPIOE,GPIO_Pin_6);         //复位脚                DelayMs(50);           //延时50ms                GPIO_SetBits(GPIOE, GPIO_Pin_6);         //将复位脚拉高}细心观察,能够发现就是上面说的那些引脚嘛!
2、接下来的就是比较重要的FSMC的配置了
先上代码,然后慢慢分析吧
1 e2 G5 X, z, `
  • void LCD_FSMCConfig(void)  
  • {  
  •     FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;  
  •     FSMC_NORSRAMTimingInitTypeDef  p;  
  •       
  •     /*-- FSMC Configuration ------------------------------------------------------*/  
  •     /*----------------------- SRAM Bank 4 ----------------------------------------*/  
  •     /* FSMC_Bank1_NORSRAM4 configuration */  
  •     p.FSMC_AddressSetupTime = 0;  
  •     p.FSMC_AddressHoldTime = 0;  
  •     p.FSMC_DataSetupTime = 2;  
  •     p.FSMC_BusTurnAroundDuration = 0;  
  •     p.FSMC_CLKDivision = 0;  
  •     p.FSMC_DataLatency = 0;  
  •     p.FSMC_AccessMode = FSMC_AccessMode_A;  
  •       
  •     /*  
  •      Color LCD configuration ------------------------------------
  •      LCD configured as follow:
  •         - Data/Address MUX = Disable
  •         - Memory Type = SRAM
  •         - Data Width = 16bit
  •         - Write Operation = Enable
  •         - Extended Mode = Enable
  •         - Asynchronous Wait = Disable  
  •     */  
  •     FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;  
  •     FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;  
  •     FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;  
  •     FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;  
  •     FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;  
  •     FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;  
  •     FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;  
  •     FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;  
  •     FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;  
  •     FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;  
  •     FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;  
  •     //FSMC_NORSRAMInitStructure.FSMC_AsyncWait = FSMC_AsyncWait_Disable;  
  •     FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;  
  •     FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;  
  •     FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;  
  •       
  •     FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);   
  •       
  •     /* BANK 4 (of NOR/SRAM Bank 1~4) is enabled */  
  •     FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);  
  • }  
    / C9 H- S! P' V1 ^
void LCD_FSMCConfig(void){        FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;        FSMC_NORSRAMTimingInitTypeDef  p;                /*-- FSMC Configuration ------------------------------------------------------*/        /*----------------------- SRAM Bank 4 ----------------------------------------*/        /* FSMC_Bank1_NORSRAM4 configuration */        p.FSMC_AddressSetupTime = 0;        p.FSMC_AddressHoldTime = 0;        p.FSMC_DataSetupTime = 2;        p.FSMC_BusTurnAroundDuration = 0;        p.FSMC_CLKDivision = 0;        p.FSMC_DataLatency = 0;        p.FSMC_AccessMode = FSMC_AccessMode_A;                /*          Color LCD configuration ------------------------------------         LCD configured as follow:            - Data/Address MUX = Disable            - Memory Type = SRAM            - Data Width = 16bit            - Write Operation = Enable            - Extended Mode = Enable            - Asynchronous Wait = Disable         */        FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;        FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;        FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;        FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;        FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;        FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;        FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;        FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;        FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;        FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;        FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;        //FSMC_NORSRAMInitStructure.FSMC_AsyncWait = FSMC_AsyncWait_Disable;        FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;        FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;        FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;                FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);                  /* BANK 4 (of NOR/SRAM Bank 1~4) is enabled */        FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);}
" _, V, I1 d9 A

! S* Y" |: F6 e. d6 l/ [7 t
& ~7 f2 y% v+ o5 ]

! g- B1 D( _* X
收藏 评论5 发布时间:2015-4-1 10:10

举报

5个回答
沐紫 回答时间:2015-4-1 10:39:29
这是楼主自己写的代码么?
wu1169668869 回答时间:2015-4-1 11:45:28
一个程序拆成这么多份也是难为楼主了 3.gif
巅峰残狼 回答时间:2015-4-1 11:57:19
还不错啊
天使与魔鬼 回答时间:2015-4-1 12:37:34
以前用过,但是没怎么研究底层驱动
为什么是EEFOCUS小白 回答时间:2015-4-3 12:15:01
沐紫 发表于 2015-4-1 10:39
( ^# I4 y1 Z. O* j这是楼主自己写的代码么?

' e- P+ N& m( K( P是个转帖,但是转过来,排版就不对了

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版