169|7

6816

帖子

11

TA的资源

版主

楼主
 

【STM32H7S78-DK】测评+ToucGFX之读取音乐文件列表并展示 [复制链接]

【前言】

准备做一个音乐播放器,首先的第一步就是把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));
	}
}

【实现效果】

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

 

此帖出自stm32/stm8论坛

最新回复

那就一点一点找问题的。至少证明硬件是没有问题的。   详情 回复 发表于 昨天 18:54
点赞 关注
 

回复
举报

5998

帖子

6

TA的资源

版主

沙发
 

这样的读取有顺序吗?  

此帖出自stm32/stm8论坛

点评

可能跟创建时间有关,这个没大注意。  详情 回复 发表于 前天 09:42
 
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 

回复

6816

帖子

11

TA的资源

版主

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

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

此帖出自stm32/stm8论坛
 
 

回复

6734

帖子

2

TA的资源

版主

4
 

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

此帖出自stm32/stm8论坛

点评

是这样设计的,但是搞了两天,I2S还没有驱动,找不到头绪呀。  详情 回复 发表于 前天 19:31
 
 
 

回复

6816

帖子

11

TA的资源

版主

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

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

此帖出自stm32/stm8论坛

点评

直接下载官方例程呢,先不用界面。  详情 回复 发表于 昨天 08:56
 
 
 

回复

6734

帖子

2

TA的资源

版主

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

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

此帖出自stm32/stm8论坛

点评

官方例程可以跑,但是结合到TouchGFX就区配不上了,直接跑例程,没多大意义。  详情 回复 发表于 昨天 11:15
 
 
 

回复

6816

帖子

11

TA的资源

版主

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

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

此帖出自stm32/stm8论坛

点评

那就一点一点找问题的。至少证明硬件是没有问题的。  详情 回复 发表于 昨天 18:54
 
 
 

回复

6734

帖子

2

TA的资源

版主

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

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

此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
补充: linux设备驱动程序(中文第三版) 2.6内核(完整版)

前面有个贴的 附件只有11章,这个较完整,有18章的中文版!!!

【NXP USB Type C评测 】高低压输入测试

本帖最后由 dcexpert 于 2016-4-23 18:10 编辑 前面在电源部分简单分析了type c的电源,只有在VBUS_CHARGE输入时才会在任何情 ...

徒手编写了一个STM8的反汇编工具

最近打算玩一下STM8, 只为了消化一下我的库存,因为我曾经买过几个型号的STM8单片机,但是一直没用来DIY啥。我对STM8熟悉程度远 ...

WBBSW 丝印

WBBSW这个丝印是啥来看起来像是三极管哪位好心人有丝印反查资料可以发下不?

关于EFR32BG22系列蓝牙连接成功率低的解决方法

本帖最后由 skywalker_lee 于 2021-3-25 09:33 编辑 采用EFR32BG22C112F352GM32进行蓝牙设备开发时,当Simplicity Studio的Bl ...

开源ESP32彩屏WIFI/BLE智能万用表制作过程(2.按键选择)

今天收到了2款屏幕和橡胶按键样品,屏幕引脚是FPC排线,转接板还没收到,要2-3天才能点亮,和外壳对比一下2.4寸和2.0寸,还是屏 ...

ssd1306汉字移动演示

本帖最后由 lemon1394 于 2021-8-18 22:00 编辑 用帧缓冲区的方法来显示汉字或图片,算法变得很简单。 不光是显示,还可以 ...

Think Python 电子书第二版

本帖最后由 dcexpert 于 2023-4-18 14:16 编辑 Think Python 是针对初学者的 Python 编程入门。它从编程的基本概念开始;它经 ...

努力搬砖

个人工作量834241 有需要敬请加我,可以一起沟通哦 834243

高速化单纯的低通滤波器的原理?

837463 如图上的高速化单纯的RC低通滤波器,附加了两个二极管和电阻Rs,即当Ui>Uo时,即对电容C充电时,为什么两个二极管均 ...

关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表