查看: 7137|回复: 9

[项目] GD32F207 使用FSMC驱动TFT解码JPEG图片文件(分享二)

[复制链接]
  • TA的每日心情
    开心
    2015-6-14 16:01
  • 签到天数: 87 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2015-12-26 10:24:56 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 wenyangzeng 于 2015-12-26 22:32 编辑

                              FSMC驱动TFT_LCD解码JPEG图像显示
           曾经使用STM32F103ZE以FSMC方式驱动TFT模块进行JPEG图像解码显示。本次活动刚好将GD32F207开发板拿来作同样试验,以对比ST与GD芯片的JPEG解码性能。使用的TFT模块是SD1289,其硬件连接方法见下图:


    TFT.jpg


             用杜邦线连接GD32F207TFT本来只要几分钟就可以搞定,谁料这片开发板目前官方未提供原理图,要找到所有FSMC引脚让人有点却步。但是为了不辜负爱板网和GIGADEVICE的期望,决定把它们一一测量出来,见下图。
    FSMCS.jpg
        吐槽一下:
    PCB板背面的每2列表格对应2列SIP插针引脚次序竟然左右颠倒,差点把供电与GPIO引脚接错了!!
    TABLE.JPG

        更意想不到的是
    GD32F207的第67PE14fsmc-D11)竟然悬空,看来官方的工程师并未使用过该板运行过FSMC-TFT驱动的例程,其实板上好像还有多个“X”的空针,为何不连接??硬着头皮将PE14用导线焊接引出。耗去一整天时间了。


    工程直接拿GD32F20X_FIRMWAER_LIBRARY固件库的Template来修改。TFT初始化代码如下:
    void LCD_CtrlLinesConfig(void)
    {
        GPIO_InitPara            GPIO_InitStructure;
        EXMC_NORSRAMInitPara  EXMC_NORSRAMInitStructure;
        EXMC_NORSRAMTimingInitPara  p;
       
        /* EXMC clock enable */
        RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_EXMC, ENABLE);

        /*GPIO clock enable */
    RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOB |RCC_APB2PERIPH_GPIOC |       RCC_APB2PERIPH_GPIOD | RCC_APB2PERIPH_GPIOE |
    RCC_APB2PERIPH_GPIOF | RCC_APB2PERIPH_GPIOG |  RCC_APB2PERIPH_AF, ENABLE);

        /* Config GPIO port */
        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_Mode = GPIO_MODE_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
        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);

    //Set PF.00(A0 (RS)) as alternate function push pull
      GPIO_InitStructure.GPIO_Pin = GPIO_PIN_0;
      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_Init(GPIOG, &GPIO_InitStructure);

        p.EXMC_AsynAddressSetupTime = 0x08;  
        p.EXMC_AsynAddressHoldTime = 0x09;  
        p.EXMC_AsynDataSetupTime = 0x08;
        p.EXMC_BusLatency =0x09;

        p.EXMC_SynCLKDivision = 0x06;   
        p.EXMC_SynDataLatency = 0;  
        p.EXMC_AsynAccessMode = EXMC_ACCESS_MODE_A ;

        EXMC_NORSRAMInitStructure.EXMC_NORSRAMBank = EXMC_BANK1_NORSRAM4;

        EXMC_NORSRAMInitStructure.EXMC_AddressDataMux = EXMC_ADDRESS_DATA_MUX_DISABLE;

        EXMC_NORSRAMInitStructure.EXMC_MemoryType = EXMC_MEMORY_TYPE_SRAM;
        EXMC_NORSRAMInitStructure.EXMC_DatabusWidth = EXMC_DATABUS_WIDTH_16B;
        EXMC_NORSRAMInitStructure.EXMC_BurstMode = EXMC_BURST_MODE_DISABLE;
        EXMC_NORSRAMInitStructure.EXMC_AsynWait = EXMC_ASYN_WAIT_DISABLE;
        EXMC_NORSRAMInitStructure.EXMC_NWAITPolarity = EXMC_NWAIT_POLARITY_LOW;
      
        EXMC_NORSRAMInitStructure.EXMC_WrapBurstMode = EXMC_WRAP_BURST_MODE_DISABLE;
        EXMC_NORSRAMInitStructure.EXMC_NWAITConfig = EXMC_NWAIT_CONFIG_DURING;
        EXMC_NORSRAMInitStructure.EXMC_MemoryWrite = EXMC_MEMORY_WRITE_ENABLE;
        EXMC_NORSRAMInitStructure.EXMC_NWAITSignal = EXMC_NWAIT_SIGNAL_DISABLE;
        EXMC_NORSRAMInitStructure.EXMC_ExtendedMode = EXMC_EXTENDED_MODE_DISABLE;
        EXMC_NORSRAMInitStructure.EXMC_WriteMode = EXMC_ASYN_WRITE;
        EXMC_NORSRAMInitStructure.EXMC_ReadWriteTimingParaStruct = &p;
        EXMC_NORSRAMInitStructure.EXMC_WriteTimingParaStruct = &p;
        EXMC_NORSRAM_Init(&EXMC_NORSRAMInitStructure);

        EXMC_NORSRAM_Enable(EXMC_BANK1_NORSRAM4, ENABLE);

    }
    void lcd_initialize(void)
    {
    LCD_CtrlLinesConfig();
    LCD_WriteReg(0x0025,0xe000);
    LCD_WriteReg(0x0000,0x0001);
    Delay_ms(8);
    LCD_WriteReg(0x0003,0xEEEE);  
    LCD_WriteReg(0x000C,0x0004);
    LCD_WriteReg(0x000D,0x0003);
    LCD_WriteReg(0x000E,0x3000);

    Delay_ms(8);  
    LCD_WriteReg(0x001E,0x00af);
    LCD_WriteReg(0x0001,0x293F);
    LCD_WriteReg(0x0002,0x0600);
    LCD_WriteReg(0x0010,0x0000);
    LCD_WriteReg(0x0011,0x6070);  
    LCD_WriteReg(0x0005,0x0000);
    LCD_WriteReg(0x0006,0x0000);
    LCD_WriteReg(0x0007,0x0001);
    LCD_WriteReg(0x0007,0x0021);
    LCD_WriteReg(0x0007,0x0023);
    LCD_WriteReg(0x0007,0x0033);
    LCD_WriteReg(0x000B,0x0000);  
    LCD_WriteReg(0x000F,0x0000);
    Delay_ms(8);
    LCD_WriteReg(0x0041,0x0000);
    LCD_WriteReg(0x0042,0x0000);
    LCD_WriteReg(0x0048,0x0000);
    LCD_WriteReg(0x0049,0x013F);
    LCD_WriteReg(0x004A,0x0000);
    LCD_WriteReg(0x004B,0x0000);
    LCD_WriteReg(0x0044,0xEF00);
    LCD_WriteReg(0x004E,0x0000);
    LCD_WriteReg(0x004F,0x0319);
    LCD_WriteReg(0x0045,0x0000);
    LCD_WriteReg(0x0046,0x013F);
    LCD_WriteReg(0x0023,0x0000);
    LCD_WriteReg(0x0024,0x0000);
    LCD_WriteReg(0x0021,0x0000);
    LCD_WriteReg(0x0030,0x0707);
    LCD_WriteReg(0x0031,0x0204);
    LCD_WriteReg(0x0032,0x0204);
    LCD_WriteReg(0x0033,0x0502);
    LCD_WriteReg(0x0034,0x0507);
    LCD_WriteReg(0x0035,0x0204);
    LCD_WriteReg(0x0036,0x0204);
    LCD_WriteReg(0x0037,0x0502);
    LCD_WriteReg(0x003A,0x0302);
    LCD_WriteReg(0x003B,0x000F);
    LCD_WriteReg(0x0023,0x0000);
    LCD_WriteReg(0x0024,0x0000);
    LCD_WriteReg(0x0028,0x0006);
    LCD_WriteReg(0x002F,0x122E);

    LCD_W_REG(0x0022);
    Delay_ms(8);
    LCD_Fill(BLUE);
    }

    //主函数
    #include "gd32f20x.h"
    #include "psram_driver.h"
    #include "main.h"

    #include "W.h"//这个是JPEG图片数据文件



    int main(void)
    {



      lcd_initialize();
      LoadJpegFile(img_w);
        while(1)
        {
        }
    }

    编译、下载,激动人心的时刻到来了,图像显示结果却令人失望:

    GD32F207.JPG

    而原来使用STM32F103ZE显示的图片如下:
    STM32F103.JPG

        在GD32F207上的刷屏速度明显比STM32要快许多。但在GD32F207上的图像却缺少了大约1/3。是否GD32的FSMC有点“水土不服”,或者可能是我对其FSMC设置理解不深配置有误所致。网友如果有新见解,望交流。官方不知道有何高见,敬盼指教。
    上述问题已经解决,参见见3楼。


    FSMC-TFT-HEX.rar

    201.15 KB, 下载次数: 35

    回复

    使用道具 举报

  • TA的每日心情
    开心
    2020-1-23 13:44
  • 签到天数: 243 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2015-12-26 11:23:33 | 显示全部楼层
    多谢分享。。。 ai-logo.png
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-6-14 16:01
  • 签到天数: 87 天

    连续签到: 1 天

    [LV.6]常住居民II

     楼主| 发表于 2015-12-26 22:22:22 | 显示全部楼层
    本帖最后由 wenyangzeng 于 2015-12-26 22:24 编辑

    图像不满幅问题的解决
    经过一段时间摸索,一楼所述图像不满屏问题已经解决,主要是FSMC写时序的设置有问题,使得写SDRAM地址出现错位。修改如下:
    p.EXMC_AsynAddressSetupTime = 0x00;  
        p.EXMC_AsynAddressHoldTime = 0x02;  
        p.EXMC_AsynDataSetupTime = 0x03;
        p.EXMC_BusLatency =0x00;

        p.EXMC_SynCLKDivision = 0x00;   
        p.EXMC_SynDataLatency = 0x00;  

    视频

    *http://player.youku.com/player.php/sid/XMTQyNDk2OTA0NA==/v.swf

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-1-4 08:50
  • 签到天数: 50 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2015-12-29 14:13:00 | 显示全部楼层
    好贴,支持,主要是要支持字库更好了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-5-27 15:41
  • 签到天数: 868 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2015-12-29 20:05:44 | 显示全部楼层
    学习了               
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-6-14 16:01
  • 签到天数: 87 天

    连续签到: 1 天

    [LV.6]常住居民II

     楼主| 发表于 2015-12-29 20:36:30 | 显示全部楼层
    莫林2020 发表于 2015-12-29 14:13
    好贴,支持,主要是要支持字库更好了

    这个汉字显示比解码JPEG要简单多了,可以显示多种点阵汉字的。待抽空会写一个汉字显示。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-1-4 08:50
  • 签到天数: 50 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2015-12-30 12:21:27 | 显示全部楼层
    你是解码的啊,我以为是直接做好的呢,不错
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-1-4 08:50
  • 签到天数: 50 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2015-12-30 12:22:29 | 显示全部楼层
    主要是还是做个字库,显示一两个字没啥意思
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-6-14 16:01
  • 签到天数: 87 天

    连续签到: 1 天

    [LV.6]常住居民II

     楼主| 发表于 2015-12-30 13:39:04 | 显示全部楼层
    莫林2020 发表于 2015-12-30 12:22
    主要是还是做个字库,显示一两个字没啥意思

    国标二级字库全部拷进来要占很多内存了。嵌入式系统一般只提取需要显示的字模就够了。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-1-7 23:16
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2016-1-3 23:56:05 | 显示全部楼层
    学习了,
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-6-3 00:57 , Processed in 0.183885 second(s), 33 queries , MemCache On.

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

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.