【前言】
准备做一个音乐播放器,首先的第一步就是把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用于中间存放。
并在屏幕加载时申请内存:
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));
}
}
【实现效果】
编译后下载到开发板,点击获取文件,就获取到了文件名列表:
引用: 秦天qintian0303 发表于 2024-11-10 20:26 这样的读取有顺序吗?
可能跟创建时间有关,这个没大注意。
后面就要开始实现播放列表里的音乐了吧。
引用: wangerxian 发表于 2024-11-11 17:29 后面就要开始实现播放列表里的音乐了吧。
是这样设计的,但是搞了两天,I2S还没有驱动,找不到头绪呀。
引用: lugl4313820 发表于 2024-11-11 19:31 是这样设计的,但是搞了两天,I2S还没有驱动,找不到头绪呀。
直接下载官方例程呢,先不用界面。
引用: wangerxian 发表于 2024-11-12 08:56 直接下载官方例程呢,先不用界面。
官方例程可以跑,但是结合到TouchGFX就区配不上了,直接跑例程,没多大意义。
引用: lugl4313820 发表于 2024-11-12 11:15 官方例程可以跑,但是结合到TouchGFX就区配不上了,直接跑例程,没多大意义。
那就一点一点找问题的。至少证明硬件是没有问题的。
感谢版主大佬的提示,一直在努力中,就是时间不够用呀!