打印
[STM32F4]

Nucleo-F411RE+TFT2.4寸显示屏+SDHC卡+znFAT 实现数码相框功能

[复制链接]
675|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
capturesthe|  楼主 | 2016-4-8 22:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
振南的znFAT具有不错的文件操作功能,用它可对SDHC卡上的文件进行读写操作,如将SDHC卡中的BMP文件读取出来再还原成可视的图像。
利用手头的Nucleo-F411RE开发板和TFT2.4寸显示屏,决定将这一想法变为现实。
1)实现TFT屏的显示
为了实现TFT屏的显示,首先要进行GPIO资源的分配。由于手头的2.4TFT屏是以8位模式传送数据的,因此用PC0~PC7来传送数据,而使用以下引脚来进行控制:
PC8---WR   PC10---RS   PC11---CS  VDD---RST    VDD---RD
目前多数的TFT屏是采用16位数据传送模式,而对于8位数据模式其对显示屏写入字节数据的函数如下:
void ILI9325_WriteData(unsigned short Data)
{
  ILI9325_RS_HIGH();     // 写入寄存器时用ILI9325_RS_LOW();
  ILI9325_CS_LOW();
  GPIOC->ODR &= 0xff00;
  GPIOC->ODR |=(Data>>8);
  ILI9325_WR_LOW();
  ILI9325_WR_HIGH();
  GPIOC->ODR &= 0xff00;        
  GPIOC->ODR |=((Data)&(0x00ff));
  ILI9325_WR_LOW();
  ILI9325_WR_HIGH();
  ILI9325_CS_HIGH();
}
其它修改变动不大,在主函数调用函数ILI9325_Clear() 即可进行验证,该该函数内容如下:
void ILI9325_Clear(unsigned short COLOR)
{
  u16 i=0,j=0;
  ILI9325_SetCursor(0, 0);
  for(i=0;i<320;i++)
  {
    for(j=0;j<240;j++)
    {
      ILI9325_WriteReg(0x22,COLOR);
    }
  }  
}


沙发
capturesthe|  楼主 | 2016-4-8 22:33 | 只看该作者
2)显示SDHC卡信息读取
为了读写SDHC卡,是采用SPI的方式,其引脚分配是:
PA12---SD_SCL   PA13---SD_CS   PA14---SD_DI  PA15---SD_DO
由于程序中配备相应的字符库,因此可显示英文的提示信息。
显示SDHC卡信息的程序如下:
GPIO_Configuration();
   znFAT_Device_Init(); // 存储设备初始化
   ILI9325_DisplayString_At(10,20,"SD OK ",Yellow,Red);
   znFAT_Select_Device(0,&Init_Args); //选择设备
   res=znFAT_Init();   // 文件系统初始化         
   ILI9325_DisplayString_At(10,40,"FAT OK ",Yellow,Red);
   if(!res)           // 文件系统初始化成功
   {
         ILI9325_DisplayString_At(10,60,"Suc. to init FS ",Yellow,Red);
         ILI9325_DisplayString_At(10,80,"BPB_Sector_No:",Yellow,Red);
         u32tostr(Init_Args.BPB_Sector_No, &buf[0]);
         ILI9325_DisplayString_At(10,100,&buf[0],Yellow,Red);
         ILI9325_DisplayString_At(10,120,"Total_SizeKB:",Yellow,Red);
         u32tostr(Init_Args.Total_SizeKB, &buf[0]);
         ILI9325_DisplayString_At(10,140,&buf[0],Yellow,Red);
         ILI9325_DisplayString_At(10,160,"BytesPerSector:",Yellow,Red);
         u32tostr(Init_Args.BytesPerSector, &buf[0]);
         ILI9325_DisplayString_At(10,180,&buf[0],Yellow,Red);
         ILI9325_DisplayString_At(10,200,"FATsectors:",Yellow,Red);
         u32tostr(Init_Args.FATsectors, &buf[0]);
         ILI9325_DisplayString_At(10,220,&buf[0],Yellow,Red);
         ILI9325_DisplayString_At(10,240,"SectorsPerClust:",Yellow,Red);
         u32tostr(Init_Args.SectorsPerClust, &buf[0]);
         ILI9325_DisplayString_At(10,260,&buf[0],Yellow,Red);
         ILI9325_DisplayString_At(10,280,"FirstFATSector:",Yellow,Red);
         u32tostr(Init_Args.FirstFATSector, &buf[0]);
         ILI9325_DisplayString_At(10,300,&buf[0],Yellow,Red);
         }
  else            // 文件系统初始化失败
  {
           ILI9325_DisplayString_At(10,80,"Fail to init FS, Err Code ",Yellow,Red);  
  }

运行程序后,其执行效果如图所示。

3)显示图片显示
经过前面的准备,离实现数码相框的目标就十分接近了。要实现数码相框功能,必须能
读取文件、识别图像文件头信息、读取数据并实现色彩格式的转换等。
    在目前的图片显示中,最常用到的24位色和16位色,由于TFT显示屏的色彩表现力只能达到16位,因此需要将24位色变为16位色来显示。即使是16位色,在存储时由于是按BGR顺序,故在显示时需转为RGB顺序,其转换方法如下
   if(len==24)
                 {
                   //  读取3字节数据合成RGB色彩值,24位色
                   dat=((buf[3*i+2]>>3)<<11)|((buf[3*i+1]>>2)<<5)|(buf[3*i]>>3);
                   ILI9325WriteReg(0x22,dat);             }
                 else
                 {  //  读取2字节数据转为RGB顺序,16位色
                        dat=((buf[i*2+1]<<8) | (buf[i*2]));                                                
                        ILI9325_WriteReg(0x22,(dat&0x7c00<<1)|(dat&0x03e0)<<1|(dat&0x001f));
                 }
实践说明znFAT是个不错的文件系统,通过移植可方便地在Nucleo-F411RE开发板上实现数码相框功能,其效果如图所示。

使用特权

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

本版积分规则

22

主题

136

帖子

1

粉丝