原创 STM32采用SD NAND(贴片TF卡)完成FATFS文件系统移植与测试案例使用

2023-3-3 17:52 665 8 8 分类: 物联网 文集: SD NAND

五、案例使用

5.1 读取GBK字库文件(LCD汉字显示)

产品开发中,如果设备带有LCD显示屏,一般会显示各种文字提示,或者机器操作说明,显示中文需要字库,为了方便字模的提取,可以将字库文件制作好之后放到SD NAND上,通过文件系统打开字库文件,读取字模进行显示。


下面贴出文件系统读取字模的核心代码:

/*

函数功能: 显示GBK字库数据

          u32 x  范围0~319

          u32 y  范围0~479

          u32 size  数据的宽度(必须是8的倍数)  是正方形

          u8 *p  中文

说明: 取模横向坐标必须保证是8的倍数

*/


void ILI9341_DisplayGBKData(u32 x,u32 y,u32 size,u8 *p)

{

FIL fp;

UINT br;

u8 L,H;

  u32 Addr;

  u16 font_size=size/8*size; //字体占用的点阵码字节大小

  u8 *buff=NULL;

H=*p;

L=*(p+1);

if(L<0x7f)L=L-0x40;

else L=L-0x41;

H=H-0x81;

Addr=(190*H+L)*font_size; //中文在字库里的偏移量

buff=malloc(font_size);   //使用的堆空间

if(buff==NULL)return;


switch(size)

{

case 16:

if(f_open(&fp,"0:/font/gbk16.DZK",FA_READ)!=FR_OK)

                {

                      printf("f_open error.\r\n");

                }

f_lseek(&fp,Addr);

f_read(&fp,buff,font_size,&br);

f_close(&fp);

               

break;

case 24:

                f_open(&fp,"0:/font/gbk24.DZK",FA_READ);

f_lseek(&fp,Addr);

f_read(&fp,buff,font_size,&br);

f_close(&fp);

break;

case 32:

break;

}

//显示中文

ILI9341_DisplayData(x,y,size,size,buff);

//释放空间

free(buff);

}


这是读取字模,显示的效果:


28.png


5.2 读取MP3文件播放(开机音乐)

这个例子是演示文件系统的目录扫描函数使用方式,读取指定目录下的MP3文件进行播放。


u8 PlayerMP3(const char *path);

FATFS FatFs;

int main()

{

LED_Init();

BEEP_Init();

KeyInit();

  USARTx_Init(USART1,72,115200);


  

  SDCardDeviceInit(); //初始化SD卡

  

//  res=f_mkfs("0:",FM_ANY,0,work,sizeof work);

//  if(res)printf("格式化失败!\n");

//  else printf("格式化成功!\n");

  f_mount(&FatFs, "0:", 0);   //注册工作区

  

  PlayerMP3("0:/MP3");

  

while(1)

{

    DelayMs(100);

    LED0=!LED0;

}

}



/*

函数功能: 扫描目录mp3播放

0表示成功 1表示失败

*/

u8 PlayerMP3(const char *path)

{

    DIR dir;

    FRESULT res; 

    FILINFO fno; //存放读取的文件信息

    char *abs_path=NULL;  

    

    /*1. 打开目录*/    

    res=f_opendir(&dir,path);

    if(res!=FR_OK)return res;

    

    /*2. 循环读取目录*/

     while(1)

     {

        res=f_readdir(&dir,&fno);

        if(fno.fname[0] == 0 || res!=0)break;

        printf("文件名称: %s,文件大小: %ld 字节\r\n",fno.fname,fno.fsize);


        /*过滤目录*/

        if(strstr(fno.fname,".mp3"))

        {

            //申请存放文件名称的长度

            abs_path=malloc(strlen(path)+strlen(fno.fname)+1);

            if(abs_path==NULL)break;

             

            strcpy(abs_path,path);

            strcat(abs_path,"/");

            strcat(abs_path,fno.fname);

          

            printf("abs_path=%s\n",abs_path);

            VS1053_MP3(0,0,abs_path);     

            free(abs_path);

        }

    }

    

    /*3. 关闭目录*/

    f_closedir(&dir);

    return 0;

}


PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
8
关闭 站长推荐上一条 /3 下一条