[原创] 【STM32H7S78-DK】测评+ToucGFX之读取音乐文件列表并展示

lugl4313820   2024-11-10 13:45 楼主

【前言】

准备做一个音乐播放器,首先的第一步就是把SD卡中的文件读出来,并显示在屏上。这一篇分享经验如下:

【准备工作】

在上期工程的基础上添加功能:【STM32H7S78-DK】测评UART+DMA之二 - stm32/stm8 - 电子工程世界-论坛

下载.wav格式的文件到SD卡上。在程序中,我将找到"/Media"文件夹下的所有.wav文件。

【文件名读取】

在fatfs.c文件中,添加读取.wav的文件的函数。

void READ_WAV_FILE_FROM_SD(uint8_t file_no)
{
    /*##-3- Initialize the Directory Files pointers (heap) ###################*/
    for (counter = 0; counter < MAX_BMP_FILES; counter++)
    {
      pDirectoryFiles[counter] = malloc(MAX_BMP_FILE_NAME);
      if(pDirectoryFiles[counter] == NULL)
      {

        Error_Handler();
      }
    }
     f_mount(&SD_FatFs, (TCHAR const*)SD_Path, 0)  ;
		 f_opendir(&directory, (TCHAR const*)"/BACK") ;
//	}	
		
ubNumberOfFiles = Storage_GetDirectoryWavFiles("/Media", pDirectoryFiles);
    
    if (ubNumberOfFiles == 0)
    {
      for (counter = 0; counter < MAX_BMP_FILES; counter++)
      {
        free(pDirectoryFiles[counter]);
      }
      Error_Handler();
    } 
		else
		{
			sprintf ((char*)str, "Media/%-11.11s", pDirectoryFiles[file_no]);
      Storage_OpenReadFileSize(uwInternalBuffer, (const char*)str);//将指定文件名的文件头读取到buffer;
		}
  }

此函数,先申请一个数组,用于存放文件名的pDirectoryFiles,然后使用Storage_GetDirectoryWavFiles("/Media", pDirectoryFiles);将文件名读取到数组中。

【屏幕展示】

1、在主屏幕中,添加一个scrollableContainer1组件,用于滚动效果。

2、在screen1.happ中创建一个buff用于中间存放。

image.png  

并在屏幕加载时申请内存:

void Screen1View::setupScreen()
{
  Screen1ViewBase::setupScreen();
	this->bufSize = 256;
	this->textBuf = (uint8_t*)malloc(this->bufSize);
	if (textBuf != NULL)
	{
		memset(textBuf, 0, this->bufSize);
	}
}

2、添加向文件列表中添加一行文件的函数:

void Screen1View::TextAreaAddStr(uint8_t* str, uint32_t len)
{
	int16_t textHeight = 0, nowTextHeight = 0;
	static int16_t addHeigth = 0, addHeightsum = 0, scrollHeight = 0;
	nowTextHeight = textFile.getTextHeight();
	textHeight = textFile.getHeight();
	scrollHeight = scrollableContainer1.getHeight();
	/* buf is ready */
	if (textBuf == NULL || textFileBuffer == NULL || len == 0)
		return;
	/* buf is full text is  on the bottom of scroll*/
	if (nowTextHeight > textHeight)
	{
		memset(textBuf, 0, this->bufSize);
		scrollableContainer1.doScroll(0, addHeightsum);
		addHeigth = 0;
		addHeightsum = 0;
		nowTextHeight = 0;
	}
	/* scroll the text */
	if (nowTextHeight > scrollHeight + addHeightsum)
	{
		addHeigth = scrollHeight + addHeightsum - nowTextHeight;
		addHeightsum = addHeightsum - addHeigth;
		scrollableContainer1.doScroll(0, addHeigth);
	}
	uint32_t lens = strlen((char*)textBuf);
	memcpy((char*)textBuf + lens, (char*)str, len);
	Unicode::fromUTF8(textBuf, textFileBuffer, lens + len);
	textFile.setWideTextAction(WIDE_TEXT_CHARWRAP);
	textFile.invalidate();

}

在此函数中,先获取文件名存放的宽与高,实现文本内容的添加。

3、在文件获取的函数中,我们首先获取一下SD卡的文件名,然后将文件名添加到屏幕中。

void Screen1View::funShow()
{
	READ_WAV_FILE_FROM_SD(0);
	uint8_t str[56];
	memset(textFileBuffer, 0, sizeof(textFileBuffer));
	memset(this->textBuf, 0, this->bufSize);
	for(int i = 0; i<ubNumberOfFiles; i++)
	{

		sprintf((char *)str,"%d-%s\n",i,(char *)pDirectoryFiles[i]);
		this->TextAreaAddStr(str, sizeof(str));
	}
}

【实现效果】

编译后下载到开发板,点击获取文件,就获取到了文件名列表:

image.png  

回复评论 (8)

这样的读取有顺序吗?  

在爱好的道路上不断前进,在生活的迷雾中播撒光引
点赞  2024-11-10 20:26
引用: 秦天qintian0303 发表于 2024-11-10 20:26 这样的读取有顺序吗?  

可能跟创建时间有关,这个没大注意。

点赞  2024-11-11 09:42

后面就要开始实现播放列表里的音乐了吧。

点赞  2024-11-11 17:29
引用: wangerxian 发表于 2024-11-11 17:29 后面就要开始实现播放列表里的音乐了吧。

是这样设计的,但是搞了两天,I2S还没有驱动,找不到头绪呀。

点赞  2024-11-11 19:31
引用: lugl4313820 发表于 2024-11-11 19:31 是这样设计的,但是搞了两天,I2S还没有驱动,找不到头绪呀。

直接下载官方例程呢,先不用界面。

点赞  2024-11-12 08:56
引用: wangerxian 发表于 2024-11-12 08:56 直接下载官方例程呢,先不用界面。

官方例程可以跑,但是结合到TouchGFX就区配不上了,直接跑例程,没多大意义。

点赞  2024-11-12 11:15
引用: lugl4313820 发表于 2024-11-12 11:15 官方例程可以跑,但是结合到TouchGFX就区配不上了,直接跑例程,没多大意义。

那就一点一点找问题的。至少证明硬件是没有问题的。

点赞  2024-11-12 18:54

感谢版主大佬的提示,一直在努力中,就是时间不够用呀!

点赞  2024-11-13 12:35
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复