查看: 5968|回复: 9

[智能小车]STM32驱动3.2英寸TFT(FSMC)

[复制链接]
  • TA的每日心情
    开心
    2013-9-3 16:03
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2013-9-1 16:03:06 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 leoyezhihui 于 2013-9-1 16:05 编辑

    前一段时间都在忙全国电子设计大赛,一直在学校做老师给的题都没怎么做这个。
    前两天终于有一点时间了就开始给小车编程,当然啦,大部分程序都是移植过来的,毕竟再过两天就要开始全国电子设计大赛了。

    好吧,下面就来分享一下这两天搞的显示模块,我们计划用TFT来显示,这样显示周围环境的时候比较直接简单。
    TFT的驱动有好几种方式,因为用的是STM32,所以果断就用FSMC来驱动TFT,前面都有好几队分享过FSMC驱动TFT,这里理论上的我就不多分享了,下面我就直接分享一下驱动程序了。

    /*******************STM32与TFT硬件连接**********************
    PD14 -----FSMC_D0  ----D0
    PD15 -----FSMC_D1  ----D1
    PD0  -----FSMC_D2  ----D2
    PD1  -----FSMC_D3  ----D3
    PE7  -----FSMC_D4  ---D4
    PE8  -----FSMC_D5  ---D5
    PE9  -----FSMC_D6  ---D6
    PE10 -----FSMC_D7  ----D7
    PE11 -----FSMC_D8  ----D8
    PE12 -----FSMC_D9  ----D9
    PE13 -----FSMC_D10 ----D10
    PE14 -----FSMC_D11 ----D11
    PE15 -----FSMC_D12 ----D12
    PD8  -----FSMC_D13 ----D13
    PD9  -----FSMC_D14 ----D14
    PD10 -----FSMC_D15 ----D15
    PD4  -----FSMC_NOE -----RD
    PD5  -----FSMC_NWE ----WR
    PD7  -----FSMC_NE1 ----CS
    PD11 -----FSMC_A16 ----RS
    PB5-------------------RST

    液晶的BL端直接接到3.3V电源上

    ***************************************************************/

    STM32 FSMC的设置

    /**************************************************************************************************************
    * 函数名:GPIO_AF_FSMC_Config()
    * 输入  :void
    * 输出  :void
    * 描述  :配置LCD连接的GPIO复用连接到FSMC
    * 调用  :内部调用        
    *****************************************************************************************************************/
    static void GPIO_AF_FSMC_Config(void)
    {
      /*配置GPIOD相应的管脚复用连接到FSMC*/
      GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,GPIO_AF_FSMC);     //配置GPIOD的Pin0复用连接到FSMC
      GPIO_PinAFConfig(GPIOD,GPIO_PinSource1,GPIO_AF_FSMC);   //配置GPIOD的Pin1复用连接到FSMC
      GPIO_PinAFConfig(GPIOD,GPIO_PinSource4,GPIO_AF_FSMC);   //配置GPIOD的Pin4复用连接到FSMC
      GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_FSMC);   //配置GPIOD的Pin5复用连接到FSMC
      GPIO_PinAFConfig(GPIOD,GPIO_PinSource7,GPIO_AF_FSMC);   //配置GPIOD的Pin7复用连接到FSMC
      GPIO_PinAFConfig(GPIOD,GPIO_PinSource8,GPIO_AF_FSMC);   //配置GPIOD的Pin8复用连接到FSMC
      GPIO_PinAFConfig(GPIOD,GPIO_PinSource9,GPIO_AF_FSMC);   //配置GPIOD的Pin9复用连接到FSMC
      GPIO_PinAFConfig(GPIOD,GPIO_PinSource10,GPIO_AF_FSMC);  //配置GPIOD的Pin10复用连接到FSMC
      GPIO_PinAFConfig(GPIOD,GPIO_PinSource11,GPIO_AF_FSMC);  //配置GPIOD的Pin11复用连接到FSMC
      GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FSMC);  //配置GPIOD的Pin14复用连接到FSMC
      GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FSMC);  //配置GPIOD的Pin15复用连接到FSMC
       /*配置GPIOE相应的管脚复用连接到FSMC*/
      GPIO_PinAFConfig(GPIOE,GPIO_PinSource7,GPIO_AF_FSMC);   //配置GPIOE的Pin7复用连接到FSMC
      GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,GPIO_AF_FSMC);   //配置GPIOE的Pin8复用连接到FSMC
      GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_FSMC);   //配置GPIOE的Pin9复用连接到FSMC
      GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FSMC);  //配置GPIOE的Pin10复用连接到FSMC
      GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_FSMC);  //配置GPIOE的Pin11复用连接到FSMC
      GPIO_PinAFConfig(GPIOE,GPIO_PinSource12,GPIO_AF_FSMC);  //配置GPIOE的Pin12复用连接到FSMC
      GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_FSMC);   //配置GPIOE的Pin13复用连接到FSMC
      GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_FSMC);  //配置GPIOE的Pin14复用连接到FSMC
      GPIO_PinAFConfig(GPIOE,GPIO_PinSource15,GPIO_AF_FSMC);  //配置GPIOE的Pin15复用连接到FSMC
    }

    /**************************************************************************************************************
    * 函数名:LCD_FSMC_Config()
    * 输入  :void
    * 输出  :void
    * 描述  :配置LCD的FSMC
    * 调用  :内部调用        
    *****************************************************************************************************************/
    static void LCD_FSMC_Config(void)
    {   
        FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
       FSMC_NORSRAMTimingInitTypeDef  p;
       LCD_GPIO_Config();                                                     //LCD管脚配置
       RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);
       p.FSMC_AddressSetupTime = 5;                                           //地址建立时间
       p.FSMC_AddressHoldTime = 0;                                            //地址保持时间
       p.FSMC_DataSetupTime = 9;                                              //数据建立时间
       p.FSMC_BusTurnAroundDuration = 0;
       p.FSMC_CLKDivision = 0;
       p.FSMC_DataLatency = 0;
       p.FSMC_AccessMode = FSMC_AccessMode_A;                                  // 用模式A控制LCD
       FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;
       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_AsynchronousWait = FSMC_AsynchronousWait_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_WriteBurst = FSMC_WriteBurst_Disable;
       FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
       FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
       FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);   
       FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
    }

    I/O口设置

    /**************************************************************************************************************
    * 函数名:LCD_GPIO_Config()
    * 输入  :void
    * 输出  :void
    * 描述  :配置LCD的GPIO管脚与FSMC连接
    * 调用  :内部调用        
    *****************************************************************************************************************/
    static void LCD_GPIO_Config(void)
    {
        GPIO_InitTypeDef GPIO_InitStructure;                             //定义GPIO初始化结构体   
        /* 使能FSMC的AHB3时钟,这里注意,不同芯片总线会不同 */
        RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);
       
        /* 使能GPIOB,GPIOD,GPIOE的AHB1时钟*/
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE , ENABLE);
         /*配置液晶屏的背光控制管脚*/
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;            //设置管脚模式为输出模式
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;         //设置翻转速度为100Mhz,M4就是快啊
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;           //设置输出类型为推挽输出
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;               //设置管脚为Pin_5,根据自己液晶接法设置
       GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;          //设置上/下拉电阻为无上拉下拉电阻  
        GPIO_Init(GPIOB, &GPIO_InitStructure);                //初始化GPIOB的Pin_5
             
        /* 配置基于FSMC的液晶屏的数据线
        * 液晶屏数据线:FSMC-D0~D15: PD 14 15 0 1,PE 7 8 9 10 11 12 13 14 15,PD 8 9 10
        */
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;         //设置翻转速度为100Mhz
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;            //设置管脚模式为复用模式
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_9 |
                                      GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;
        GPIO_Init(GPIOD, &GPIO_InitStructure);                //初始化GPIOB的Pin_0,Pin_,Pin_2,
                                                                         
        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_Init(GPIOE, &GPIO_InitStructure);   
        /* 配置基于FSMC的液晶屏控制线
        * PD4-FSMC_NOE       LCD-RD
         * PD5-FSMC_NWE     LCD-WR
        * PD7-FSMC_NE1       LCD-CS
         * PD11-FSMC_A16     LCD-DC
        */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
        GPIO_Init(GPIOD, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
        GPIO_Init(GPIOD, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
        GPIO_Init(GPIOD, &GPIO_InitStructure);  
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 ;
        GPIO_Init(GPIOD, &GPIO_InitStructure);  
        GPIO_AF_FSMC_Config();                 //在F407中必须加上这个复用连接配置,否则不能连接到FSMC
        GPIO_SetBits(GPIOB, GPIO_Pin_5);   
        GPIO_SetBits(GPIOD, GPIO_Pin_4);   
        GPIO_SetBits(GPIOD, GPIO_Pin_5);   
        GPIO_SetBits(GPIOD, GPIO_Pin_7);   
       
        GPIO_ResetBits(GPIOD, GPIO_Pin_3);
        GPIO_SetBits(GPIOD, GPIO_Pin_6);  
    }

    下面就是给TFT传输数据的子程序

    /**************************************************************************************************************
    * 函数名:LCD_WriteRAM()
    * 输入  :uint16_t RGB_data  16bit颜色数据
    * 输出  :void
    * 描述  :向LCD的RAM写数据
    * 调用  :外部调用        
    *****************************************************************************************************************/
    void LCD_WR_DATA(u16 data)
    {                  
    LCD_RAM=data;   
    }

    //写寄存器函数
    //regval:寄存器值
    void LCD_WR_REG(u16 regval)
    {
    LCD_REG=regval;//写入要写的寄存器序号  
    }

    下面是LCD的初始化程序

    /**************************************************************************************************************
    * 函数名:LCD_Init()
    * 输入  :void
    * 输出  :void
    * 描述  :LCD初始化函数
    * 调用  :外部调用        
    *****************************************************************************************************************/
    void LCD_Init(void)
    {
      LCD_FSMC_Config();
      delay_nms(50);
      
    LCD_WR_REG(0x0011);          //退出睡眠模式,0x0010为进入
      delay_nms(50);
      LCD_WR_REG(0x0013);          //进入普通显示模式
      LCD_WR_REG(0x00D0);          //设置电源参数,后续3个参数
      LCD_WR_DATA(0x0007);         //1.0xVci
      LCD_WR_DATA(0x0040);         //
      LCD_WR_DATA(0x001c);         //
      LCD_WR_REG(0x00D1);          //Vcom Control 后续三个参数
      LCD_WR_DATA(0x0000);         //
      LCD_WR_DATA(0x0018);         //
      LCD_WR_DATA(0x001d);         //
      LCD_WR_REG(0x00D2);          //设置普通模式下的电源参数,后续两个参数
      LCD_WR_DATA(0x0001);         //
      LCD_WR_DATA(0x0011);         //
      LCD_WR_REG(0x00C0);          //Panel Driving setting  后续5个参数
      LCD_WR_DATA(0x0000);         //设置扫描模式
      LCD_WR_DATA(0x003B);         //设定行数480行
      LCD_WR_DATA(0x0000);         //
      LCD_WR_DATA(0x0002);         //5frames
      LCD_WR_DATA(0x0011);         //
      LCD_WR_REG(0x00C1);          //Timing setting 后续3个参数
      LCD_WR_DATA(0x0010);         //
      LCD_WR_DATA(0x000B);         //
      LCD_WR_DATA(0x0088);         //
      LCD_WR_REG(0x00C5);          //Frame Rate and Inversion Control 后续一个参数
      LCD_WR_DATA(0x0001);         //100hz  
      LCD_WR_REG(0x00C8);          //伽马校正,后续12个参数
      LCD_WR_DATA(0x0000);LCD_WR_DATA(0x0030);LCD_WR_DATA(0x0036);
      LCD_WR_DATA(0x0045);LCD_WR_DATA(0x0004);LCD_WR_DATA(0x0016);
      LCD_WR_DATA(0x0037);LCD_WR_DATA(0x0075);LCD_WR_DATA(0x0077);
      LCD_WR_DATA(0x0054);LCD_WR_DATA(0x000f);LCD_WR_DATA(0x0000);
      LCD_WR_REG(0x00E4);LCD_WR_DATA(0x00A0);  
      LCD_WR_REG(0x00F0);LCD_WR_DATA(0x0001);
      LCD_WR_REG(0x00F3);LCD_WR_DATA(0x0040);
      LCD_WR_DATA(0x000A);
      LCD_WR_REG(0x00F7);LCD_WR_DATA(0x0080);
      LCD_WR_REG(0x0036);LCD_WR_DATA(0x000a);
      LCD_WR_REG(0x003A);LCD_WR_DATA(0x0055);
      LCD_WR_REG(0x002A);
      LCD_WR_DATA(0x0000);
      LCD_WR_DATA(0x0000);
      LCD_WR_DATA(0x0001);
      LCD_WR_DATA(0x003F);
      LCD_WR_REG(0x002B);
      LCD_WR_DATA(0x0000);
      LCD_WR_DATA(0x0000);
      LCD_WR_DATA(0x0001);
      LCD_WR_DATA(0x00df);  
      delay_nms(50);
      LCD_WR_REG(0x0029);   //开显示
      LCD_WR_REG(0x002C);   //开始写数据
      
    GPIO_SetBits(GPIOB,GPIO_Pin_5);
    LCD_Clear(~WHITE);
    LCD_SetFont(&Font16x24);
    }

    基本的程序就是这样的,剩下的都是一些工具似的子程序,最基本就是描点子程序

    /**************************************************************************************************************
    * 函数名:DrawPixel()
    * 输入  :int16_t x, int16_t y  点的坐标
    * 输出  :void
    * 描述  :画一个象素点
    * 调用  :外部调用        
    *****************************************************************************************************************/
    void DrawPixel(uint16_t x, uint16_t y)
    {
      LCD_SetCursor(x,y);
      LCD_WR_REG(0x002C);
      LCD_WR_DATA(TextColor);
    }

    就这样简单的这样总结一下吧,现在开始其他模块的编程,希望能在比赛之前移植完所有的程序(之前一直用F103来调这小车)!!!!!!!!!!
    回复

    使用道具 举报

  • TA的每日心情

    2018-1-24 13:36
  • 签到天数: 240 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-9-1 17:37:33 | 显示全部楼层
    楼主好人家啊,,,
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2018-1-24 13:36
  • 签到天数: 240 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-9-1 17:38:04 | 显示全部楼层
    楼主好人家啊,,,、、
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2023-9-15 06:28
  • 签到天数: 3747 天

    连续签到: 60 天

    [LV.Master]伴坛终老

    发表于 2013-9-2 07:31:44 | 显示全部楼层
    还真不熟悉FSMC,参照一下吧
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2014-12-24 12:35
  • 签到天数: 26 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2013-9-2 08:01:42 | 显示全部楼层
    楼主,能不能帮我解决一个彩屏的问题呀?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2013-9-3 16:03
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

     楼主| 发表于 2013-9-2 12:09:22 | 显示全部楼层
    xuwu_19911119 发表于 2013-9-2 08:01
    楼主,能不能帮我解决一个彩屏的问题呀?

    什么问题啊,说说看我能不能帮得上忙啊!!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2014-12-24 12:35
  • 签到天数: 26 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2013-9-2 15:41:44 | 显示全部楼层
    leoyezhihui 发表于 2013-9-2 12:09
    什么问题啊,说说看我能不能帮得上忙啊!!

    用硬件IIC、软件IIC、SPI操作芯片时,采集到的数据用彩屏显示,显不出来。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2013-9-3 16:03
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

     楼主| 发表于 2013-9-3 16:05:13 | 显示全部楼层
    xuwu_19911119 发表于 2013-9-2 15:41
    用硬件IIC、软件IIC、SPI操作芯片时,采集到的数据用彩屏显示,显不出来。 ...

    你把程序贴上来看一下啊!!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2013-9-3 16:03
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

     楼主| 发表于 2013-9-3 16:05:47 | 显示全部楼层
    xuwu_19911119 发表于 2013-9-2 15:41
    用硬件IIC、软件IIC、SPI操作芯片时,采集到的数据用彩屏显示,显不出来。 ...

    你把程序贴上来看一下啊!!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2014-12-24 12:35
  • 签到天数: 26 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2013-9-3 16:12:56 | 显示全部楼层
    leoyezhihui 发表于 2013-9-3 16:05
    你把程序贴上来看一下啊!!

    你在爱板论坛的官方群里面吗?我发给你。我明天比赛呀,没有时间呀。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-5-18 02:36 , Processed in 0.199302 second(s), 32 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.