【STM32H7S78-DK】测评+ToucGFX之读取音乐文件列表并展示
<div class='showpostmsg'><p>【前言】</p><p>准备做一个音乐播放器,首先的第一步就是把SD卡中的文件读出来,并显示在屏上。这一篇分享经验如下:</p>
<p>【准备工作】</p>
<p>在上期工程的基础上添加功能:<a href="https://bbs.eeworld.com.cn/thread-1295403-1-1.html">【STM32H7S78-DK】测评UART+DMA之二 - stm32/stm8 - 电子工程世界-论坛</a></p>
<p>下载.wav格式的文件到SD卡上。在程序中,我将找到"/Media"文件夹下的所有.wav文件。</p>
<p>【文件名读取】</p>
<p>在fatfs.c文件中,添加读取.wav的文件的函数。</p>
<pre>
<code>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 = malloc(MAX_BMP_FILE_NAME);
if(pDirectoryFiles == 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);
}
Error_Handler();
}
else
{
sprintf ((char*)str, "Media/%-11.11s", pDirectoryFiles);
Storage_OpenReadFileSize(uwInternalBuffer, (const char*)str);//将指定文件名的文件头读取到buffer;
}
}</code></pre>
<p>此函数,先申请一个数组,用于存放文件名的pDirectoryFiles,然后使用Storage_GetDirectoryWavFiles("/Media", pDirectoryFiles);将文件名读取到数组中。</p>
<p>【屏幕展示】</p>
<p>1、在主屏幕中,添加一个scrollableContainer1组件,用于滚动效果。</p>
<p>2、在screen1.happ中创建一个buff用于中间存放。</p>
<p> </p>
<p>并在屏幕加载时申请内存:</p>
<pre>
<code>void Screen1View::setupScreen()
{
Screen1ViewBase::setupScreen();
this->bufSize = 256;
this->textBuf = (uint8_t*)malloc(this->bufSize);
if (textBuf != NULL)
{
memset(textBuf, 0, this->bufSize);
}
}</code></pre>
<p>2、添加向文件列表中添加一行文件的函数:</p>
<pre>
<code>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 ison 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();
}</code></pre>
<p>在此函数中,先获取文件名存放的宽与高,实现文本内容的添加。</p>
<p>3、在文件获取的函数中,我们首先获取一下SD卡的文件名,然后将文件名添加到屏幕中。</p>
<pre>
<code>void Screen1View::funShow()
{
READ_WAV_FILE_FROM_SD(0);
uint8_t str;
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);
this->TextAreaAddStr(str, sizeof(str));
}
}
</code></pre>
<p>【实现效果】</p>
<p>编译后下载到开发板,点击获取文件,就获取到了文件名列表:</p>
<p> </p>
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <p>这样的读取有顺序吗? </p>
秦天qintian0303 发表于 2024-11-10 20:26
这样的读取有顺序吗?
<p>可能跟创建时间有关,这个没大注意。</p>
<p>后面就要开始实现播放列表里的音乐了吧。</p>
wangerxian 发表于 2024-11-11 17:29
后面就要开始实现播放列表里的音乐了吧。
<p>是这样设计的,但是搞了两天,I2S还没有驱动,找不到头绪呀。</p>
lugl4313820 发表于 2024-11-11 19:31
是这样设计的,但是搞了两天,I2S还没有驱动,找不到头绪呀。
<p>直接下载官方例程呢,先不用界面。</p>
wangerxian 发表于 2024-11-12 08:56
直接下载官方例程呢,先不用界面。
<p>官方例程可以跑,但是结合到TouchGFX就区配不上了,直接跑例程,没多大意义。</p>
lugl4313820 发表于 2024-11-12 11:15
官方例程可以跑,但是结合到TouchGFX就区配不上了,直接跑例程,没多大意义。
<p>那就一点一点找问题的。至少证明硬件是没有问题的。</p>
<p>感谢版主大佬的提示,一直在努力中,就是时间不够用呀!</p>
<p>博主,麻烦看下私信,谢谢。</p>
页:
[1]