9回答

0收藏

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

#竞赛 #竞赛 7379 人阅读 | 9 人回复 | 2013-09-01

本帖最后由 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来调这小车)!!!!!!!!!!
分享到:
回复

使用道具 举报

回答|共 9 个

倒序浏览

沙发

18903667080

发表于 2013-9-1 17:37:33 | 只看该作者

楼主好人家啊,,,
板凳

18903667080

发表于 2013-9-1 17:38:04 | 只看该作者

楼主好人家啊,,,、、
地板

dwwzl

发表于 2013-9-2 07:31:44 | 只看该作者

还真不熟悉FSMC,参照一下吧
用技术,爱生活!
5#

五哥

发表于 2013-9-2 08:01:42 | 只看该作者

楼主,能不能帮我解决一个彩屏的问题呀?
6#

leoyezhihui_3003600

发表于 2013-9-2 12:09:22 | 只看该作者

xuwu_19911119 发表于 2013-9-2 08:01
楼主,能不能帮我解决一个彩屏的问题呀?

什么问题啊,说说看我能不能帮得上忙啊!!
7#

五哥

发表于 2013-9-2 15:41:44 | 只看该作者

leoyezhihui 发表于 2013-9-2 12:09
什么问题啊,说说看我能不能帮得上忙啊!!

用硬件IIC、软件IIC、SPI操作芯片时,采集到的数据用彩屏显示,显不出来。
8#

leoyezhihui_3003600

发表于 2013-9-3 16:05:13 | 只看该作者

xuwu_19911119 发表于 2013-9-2 15:41
用硬件IIC、软件IIC、SPI操作芯片时,采集到的数据用彩屏显示,显不出来。 ...

你把程序贴上来看一下啊!!
9#

leoyezhihui_3003600

发表于 2013-9-3 16:05:47 | 只看该作者

xuwu_19911119 发表于 2013-9-2 15:41
用硬件IIC、软件IIC、SPI操作芯片时,采集到的数据用彩屏显示,显不出来。 ...

你把程序贴上来看一下啊!!
10#

五哥

发表于 2013-9-3 16:12:56 | 只看该作者

leoyezhihui 发表于 2013-9-3 16:05
你把程序贴上来看一下啊!!

你在爱板论坛的官方群里面吗?我发给你。我明天比赛呀,没有时间呀。
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

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