lugl4313820 发表于 2024-11-10 13:45

【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卡上。在程序中,我将找到&quot;/Media&quot;文件夹下的所有.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 &lt; MAX_BMP_FILES; counter++)
    {
      pDirectoryFiles = malloc(MAX_BMP_FILE_NAME);
      if(pDirectoryFiles == NULL)
      {

      Error_Handler();
      }
    }
   f_mount(&amp;SD_FatFs, (TCHAR const*)SD_Path, 0);
               f_opendir(&amp;directory, (TCHAR const*)"/BACK") ;
//        }       
               
ubNumberOfFiles = Storage_GetDirectoryWavFiles("/Media", pDirectoryFiles);
   
    if (ubNumberOfFiles == 0)
    {
      for (counter = 0; counter &lt; 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(&quot;/Media&quot;, pDirectoryFiles);将文件名读取到数组中。</p>

<p>【屏幕展示】</p>

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

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

<p> &nbsp;</p>

<p>并在屏幕加载时申请内存:</p>

<pre>
<code>void Screen1View::setupScreen()
{
Screen1ViewBase::setupScreen();
        this-&gt;bufSize = 256;
        this-&gt;textBuf = (uint8_t*)malloc(this-&gt;bufSize);
        if (textBuf != NULL)
        {
                memset(textBuf, 0, this-&gt;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 &gt; textHeight)
        {
                memset(textBuf, 0, this-&gt;bufSize);
                scrollableContainer1.doScroll(0, addHeightsum);
                addHeigth = 0;
                addHeightsum = 0;
                nowTextHeight = 0;
        }
        /* scroll the text */
        if (nowTextHeight &gt; 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-&gt;textBuf, 0, this-&gt;bufSize);
        for(int i = 0; i&lt;ubNumberOfFiles; i++)
        {

                sprintf((char *)str,"%d-%s\n",i,(char *)pDirectoryFiles);
                this-&gt;TextAreaAddStr(str, sizeof(str));
        }
}
</code></pre>

<p>【实现效果】</p>

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

<p> &nbsp;</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>

秦天qintian0303 发表于 2024-11-10 20:26

<p>这样的读取有顺序吗?&nbsp;&nbsp;</p>

lugl4313820 发表于 2024-11-11 09:42

秦天qintian0303 发表于 2024-11-10 20:26
这样的读取有顺序吗?&nbsp;&nbsp;

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

wangerxian 发表于 2024-11-11 17:29

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

lugl4313820 发表于 2024-11-11 19:31

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

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

wangerxian 发表于 2024-11-12 08:56

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

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

lugl4313820 发表于 2024-11-12 11:15

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

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

wangerxian 发表于 2024-11-12 18:54

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

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

lugl4313820 发表于 2024-11-13 12:35

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

HeTui 发表于 2024-11-14 21:57

<p>博主,麻烦看下私信,谢谢。</p>
页: [1]
查看完整版本: 【STM32H7S78-DK】测评+ToucGFX之读取音乐文件列表并展示