打印
[应用相关]

STM32 驱动彩屏

[复制链接]
楼主: chenqiang10
手机看帖
扫描二维码
随时随地手机跟帖
21
chenqiang10|  楼主 | 2018-5-30 19:39 | 只看该作者 回帖奖励 |倒序浏览
3) FSMC_MemoryDataWidth:选择你使用的内存数据宽度,我们这里选择 16 位长度:
FSMC_MemoryDataWidth_16b。

使用特权

评论回复
22
chenqiang10|  楼主 | 2018-5-30 19:40 | 只看该作者
4) FSMC_WriteOperation:这里设置是是否打开写使能,这个肯定要打开,所以设置为:
FSMC_WriteOperation_Enable。

使用特权

评论回复
23
chenqiang10|  楼主 | 2018-5-30 20:30 | 只看该作者
5) FSMC_ExtendedMode:是否使用拓展模块,也就是读写的数据是否需要不一样,LCD
彩屏读取的速度,一般都比写入慢,为了写入的效率最高,所以我们这里选择使用拓展模块:
FSMC_ExtendedMode_Enable

使用特权

评论回复
24
chenqiang10|  楼主 | 2018-5-30 20:31 | 只看该作者
6) FSMC_DataAddressMux:是否复用地址线和数据线,我们这里不复用:
FSMC_DataAddressMux_Disable。

使用特权

评论回复
25
chenqiang10|  楼主 | 2018-5-30 20:31 | 只看该作者
7) FSMC_ReadWriteTimingStruct:当没有使用拓展模块时,也就是读写时序不分开时,设
置读写时序,也就是速度。而这个参数的设置又是一个 FSMC_NORSRAMTimingInitTypeDef 结
构,这个结构体有 7 个成员:

使用特权

评论回复
26
chenqiang10|  楼主 | 2018-5-30 20:33 | 只看该作者
a) FSMC_AddressSetupTime:设置地址建立时间:我们设置为 3 个时钟周期,即:0x02。
注意这里没错,3 个时钟周期是 0x02,因为这里设置是从 0x00 开始的,表示一个时钟周
期。

使用特权

评论回复
27
chenqiang10|  楼主 | 2018-5-30 20:37 | 只看该作者
b) FSMC_AddressHoldTime:地址保持时间,为了方面外部存储器,更精确的读取地址的
设置。这里我们设置为一个时钟周期得了:0x00。

使用特权

评论回复
28
chenqiang10|  楼主 | 2018-5-30 20:37 | 只看该作者
c) FSMC_DataSetupTime:数据建立时间,我们这里设置为 6 个时钟周期,即:0x05。
d) FSMC_DataLatency:数据保持时间,我们这里设置为 1 个时钟周期: 0x00。
e) FSMC_BusTurnAroundDuration:总线恢复时间,我们也设置为 1 个时钟周期:0x00。
f) FSMC_CLKDivision:设置 FSMC 的时钟分频,我们设置为:0x01。
g) FSMC_AccessMode:设置异步访问模式,也就是读写时序分开时的模式,我们使用 B
模式,所以设置为:FSMC_AccessMode_B。
以上就是 FSMC_ReadWriteTimingStruct 这个成员的设置结构体参数。

使用特权

评论回复
29
chenqiang10|  楼主 | 2018-5-30 20:37 | 只看该作者
8) FSMC_WriteTimingStruct:设置写时序,这个设置其实也是使用上面
FSMC_ReadWriteTimingStruct 这个成员的结构体参数来设置。

使用特权

评论回复
30
chenqiang10|  楼主 | 2018-5-31 18:11 | 只看该作者
9) 剩 下 的 还 有 7 个 参 数 , FSMC_BurstAccessMode 、FSMC_WaitSignalPolarity、
FSMC_AsynchronousWait、FSMC_WrapMode、 FSMC_WaitSignalActive、FSMC_WaitSignal、
FSMC_WriteBurst。这些参数在成组模式同步模式才需要设置,大家可以参考中文参考手册
了解我们这里不用设置

使用特权

评论回复
31
chenqiang10|  楼主 | 2018-5-31 18:11 | 只看该作者
/****************************************************************************
*函数名:TFT_GPIO_Config
*输  入:无
*输  出:无
*功  能:初始化TFT的IO口。
****************************************************************************/          

void TFT_GPIO_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
       
        /* 打开时钟使能 */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE  
                              | RCC_APB2Periph_GPIOG, ENABLE);

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_12;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        /* FSMC_A10(G12) 和RS(G0)*/
        GPIO_Init(GPIOG, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4
                                      | GPIO_Pin_5 | GPIO_Pin_8 | 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(GPIOD, &GPIO_InitStructure);

        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);
}

使用特权

评论回复
32
chenqiang10|  楼主 | 2018-5-31 18:12 | 只看该作者
初始化FSMC
void TFT_FSMC_Config(void)
{
        /* 初始化函数 */
        FSMC_NORSRAMInitTypeDef        FSMC_NORSRAMInitStructure;
        FSMC_NORSRAMTimingInitTypeDef  FSMC_NORSRAMTiming;

        /* 设置读写时序,给FSMC_NORSRAMInitStructure调用 */
        /* 地址建立时间,3个HCLK周期 */
        FSMC_NORSRAMTiming.FSMC_AddressSetupTime = 0x02;

        /* 地址保持时间,1个HCLK周期 */
        FSMC_NORSRAMTiming.FSMC_AddressHoldTime = 0x00;

        /* 数据建立时间,6个HCLK周期 */
        FSMC_NORSRAMTiming.FSMC_DataSetupTime = 0x05;

        /* 数据保持时间,1个HCLK周期 */
        FSMC_NORSRAMTiming.FSMC_DataLatency = 0x00;

        /* 总线恢复时间设置 */
        FSMC_NORSRAMTiming.FSMC_BusTurnAroundDuration = 0x00;
       
        /* 时钟分频设置 */
        FSMC_NORSRAMTiming.FSMC_CLKDivision = 0x01;

        /* 设置模式,如果在地址/数据不复用时,ABCD模式都区别不大 */
        FSMC_NORSRAMTiming.FSMC_AccessMode = FSMC_AccessMode_B;

        /*设置FSMC_NORSRAMInitStructure的数据*/
        /* FSMC有四个存储块(bank),我们使用第一个(bank1) */
        /* 同时我们使用的是bank里面的第 4个RAM区 */
        FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;

        /* 这里我们使用SRAM模式 */
        FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;

        /* 使用的数据宽度为16位 */
        FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;

        /* 设置写使能打开 */
        FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;

        /* 选择拓展模式使能,即设置读和写用不同的时序 */
        FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable;
       
        /* 设置地址和数据复用使能不打开 */
        FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
       
        /* 设置读写时序 */
        FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &FSMC_NORSRAMTiming;
       
        /* 设置写时序 */
        FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &FSMC_NORSRAMTiming;

        /* 打开FSMC的时钟 */
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
         
        FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);

        /*!< Enable FSMC Bank1_SRAM Bank */
        FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);       
}

使用特权

评论回复
33
chenqiang10|  楼主 | 2018-5-31 18:13 | 只看该作者
LCD写入命令
void TFT_WriteCmd(uint16_t cmd)
{
        TFT->TFT_CMD = cmd<<8 ;
}

使用特权

评论回复
34
chenqiang10|  楼主 | 2018-5-31 18:13 | 只看该作者
LCD写入数据
void TFT_WriteData(u16 dat)
{
        TFT->TFT_DATA = dat<<8;
}

void TFT_WriteData_Color(u16 color)
{
        TFT->TFT_DATA = color&0xff00;
        TFT->TFT_DATA = color<<8;
}

使用特权

评论回复
35
chenqiang10|  楼主 | 2018-5-31 18:18 | 只看该作者
初始化LCD屏
void TFT_Init(void)
{
        uint16_t i;

        TFT_GPIO_Config();
        TFT_FSMC_Config();

        //************* Start Initial Sequence **********//       
        TFT_WriteCmd(0xCB);  
        TFT_WriteData(0x39);
        TFT_WriteData(0x2C);
        TFT_WriteData(0x00);
        TFT_WriteData(0x34);  
        TFT_WriteData(0x02);   

        TFT_WriteCmd(0xCF);  
        TFT_WriteData (0x00);
        TFT_WriteData (0xa2); //c1
        TFT_WriteData (0Xf0);  //30
         
        TFT_WriteCmd(0xE8);  
        TFT_WriteData (0x84);          //85
        TFT_WriteData (0x11);          //00
        TFT_WriteData (0x7a);          //79
       
       
        TFT_WriteCmd(0xEA);  
        TFT_WriteData (0x66);  //00
        TFT_WriteData (0x00);
       
        TFT_WriteCmd(0xED);  
        TFT_WriteData (0x55);         //64
        TFT_WriteData (0x01);         //03
        TFT_WriteData (0X23);         //12
        TFT_WriteData (0X01);         //81
         
        TFT_WriteCmd(0xF7);  
        TFT_WriteData (0x20);         //20
       
       
        TFT_WriteCmd(0xC0);    //Power control
        TFT_WriteData (0x1c);   //VRH[5:0]         //1c
         
        TFT_WriteCmd(0xC1);    //Power control
        TFT_WriteData (0x13);   //SAP[2:0];BT[3:0]         //13
         
        TFT_WriteCmd(0xC5);    //VCM control
        TFT_WriteData (0x23);
        TFT_WriteData (0x3F);
         
        TFT_WriteCmd(0xC7);    //VCM control2
        TFT_WriteData(0xA5);
       
        TFT_WriteCmd(0xB1);  
        TFT_WriteData (0x00);
        TFT_WriteData (0x17);
       
        TFT_WriteCmd(0x3A);  
        TFT_WriteData (0x55);
       
        TFT_WriteCmd(0xB6);  
        TFT_WriteData (0x0A);
        TFT_WriteData (0xa2);  //a2
        TFT_WriteData (0x27);
        TFT_WriteData (0x00);
         
        TFT_WriteCmd(0x36);    // Memory Access Control
        TFT_WriteData (0x08);           //08        BGR
         
        TFT_WriteCmd(0xF2);    // 3Gamma Function Disable
        TFT_WriteData (0x02);         //00
         
        TFT_WriteCmd(0x26);    //Gamma curve selected
        TFT_WriteData (0x01);
         
        TFT_WriteCmd(0xE0);    //Set Gamma
        TFT_WriteData (0x0F);
        TFT_WriteData (0x14);
        TFT_WriteData (0x13);
        TFT_WriteData (0x0C);
        TFT_WriteData (0x0E);
        TFT_WriteData (0x05);
        TFT_WriteData (0x45);
        TFT_WriteData (0x85);
        TFT_WriteData (0x36);
        TFT_WriteData (0x09);
        TFT_WriteData (0x14);
        TFT_WriteData (0x05);
        TFT_WriteData (0x09);
        TFT_WriteData (0x03);
        TFT_WriteData (0x00);
         
        TFT_WriteCmd(0XE1);    //Set Gamma
        TFT_WriteData (0x00);
        TFT_WriteData (0x24);
        TFT_WriteData (0x26);
        TFT_WriteData (0x03);
        TFT_WriteData (0x0F);
        TFT_WriteData (0x04);
        TFT_WriteData (0x3F);
        TFT_WriteData (0x14);
        TFT_WriteData (0x52);
        TFT_WriteData (0x04);
        TFT_WriteData (0x10);
        TFT_WriteData (0x0E);
        TFT_WriteData (0x38);
        TFT_WriteData (0x39);
        TFT_WriteData (0x0F);

        TFT_WriteCmd(0x2A );
        TFT_WriteData(0x00);
        TFT_WriteData(0x00);
        TFT_WriteData(0x00);
        TFT_WriteData(0xEF);

        TFT_WriteCmd(0x2B );
        TFT_WriteData(0x00);
        TFT_WriteData(0x00);
        TFT_WriteData(0x01);
        TFT_WriteData(0x3F);
         
        TFT_WriteCmd(0x11);    //Exit Sleep
        for(i=50000; i>0; i--);         //延时
        for(i=50000; i>0; i--);
        for(i=50000; i>0; i--);
        for(i=50000; i>0; i--);
        for(i=50000; i>0; i--);
        for(i=50000; i>0; i--);
        TFT_WriteCmd(0x29);    //Display on
}

使用特权

评论回复
36
chenqiang10|  楼主 | 2018-5-31 18:18 | 只看该作者
设置要操作的窗口范围
void TFT_SetWindow(uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd)
{
        TFT_WriteCmd(0x2A);

    TFT_WriteData(xStart/256);
    TFT_WriteData(xStart%256);
    TFT_WriteData(xEnd/256);
    TFT_WriteData(xEnd%256);

    TFT_WriteCmd(0x2b);
    TFT_WriteData(yStart/256);
    TFT_WriteData(yStart%256);
    TFT_WriteData(yEnd/256);
    TFT_WriteData(yEnd%256);
    TFT_WriteCmd(0x2c);
}

使用特权

评论回复
37
chenqiang10|  楼主 | 2018-5-31 18:26 | 只看该作者
将LCD清屏成相应的颜色
void TFT_ClearScreen(uint16_t color)
{
        uint16_t i, j ;

        TFT_SetWindow(0, 0, TFT_XMAX, TFT_YMAX);         //作用区域
          for(i=0; i<TFT_XMAX+1; i++)
        {
                for (j=0; j<TFT_YMAX+1; j++)
                {
                        TFT_WriteData_Color(color);
                }
        }
}

使用特权

评论回复
38
chenqiang10|  楼主 | 2018-5-31 18:27 | 只看该作者
在彩屏上面画一点
void GUI_Dot(u16 x,u16 y,u16 color)
{
        TFT_SetWindow(x,y,x,y);
        TFT_WriteData_Color(color);               
}

使用特权

评论回复
39
chenqiang10|  楼主 | 2018-5-31 18:27 | 只看该作者
给一个区域涂上颜色
void GUI_Box(uint16_t xState, uint16_t yState, uint16_t xEnd, uint16_t yEnd, uint16_t color)
{
        uint16_t temp;

    if((xState > xEnd) || (yState > yEnd))
    {
        return;
    }   
        TFT_SetWindow(xState, yState, xEnd, yEnd);
    xState = xEnd - xState + 1;
        yState = yEnd - yState + 1;

        while(xState--)
        {
                 temp = yState;
                while (temp--)
                 {       
                        TFT_WriteData_Color(color);
                }
        }
}

使用特权

评论回复
40
chenqiang10|  楼主 | 2018-5-31 18:37 | 只看该作者
画一个十字的标记
void GUI_DrowSign(uint16_t x, uint16_t y, uint16_t color)
{
    uint8_t i;

    /* 画点 */
    TFT_SetWindow(x-1, y-1, x+1, y+1);
    for(i=0; i<9; i++)
    {
        TFT_WriteData_Color(color);   
    }

    /* 画竖 */
    TFT_SetWindow(x-4, y, x+4, y);
    for(i=0; i<9; i++)
    {
        TFT_WriteData_Color(color);   
    }

    /* 画横 */
    TFT_SetWindow(x, y-4, x, y+4);
    for(i=0; i<9; i++)
    {
        TFT_WriteData_Color(color);   
    }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则