0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【RTT大赛作品连载】AB32VG1评估板 音乐播放器

磐石11 2021-11-12 21:11 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

之前,记录了从新建项目到点灯,按钮控制彩灯测试!接下来看看在如何AB32VG1评估板实现音乐播放器!

硬件如图:

pYYBAGGOV26AclLeAAil8f1AsAY884.png要用到TF卡,和美标3.2mm耳机

RT-ThreadStudio的音乐播放器项目到对应开发配置!!!整体配置:

poYBAGGOWUKAHighAADabe-yFgI912.png

详细配置如下:

内核设置如图(注意不要多选,或者少选!!!)

pYYBAGGOWiCAKwz9AADy5qegeM8756.pngpoYBAGGOWm6AOoJKAAC9JSRg9os028.png

组件如图:

pYYBAGGOWyOAIYNaAADoqsr-8R8912.pngpoYBAGGOW6OAak81AADzYSEvOus826.png

软件包如图:

poYBAGGOXBGAZvzWAACU8kdvYDI997.pngpoYBAGGOXKCAaSkPAADeO2Bcc8o353.png

硬件设置如图:

poYBAGGOXOSAYZApAACQGAx0gR4739.png

以上就是在RT-ThreadStudio的设置,这是我验证过的设置!!!其他的设置是否可用存在很大问题!!!我自己试过选择MP3格式,结果异常一大堆!!!所以建议在设置项目的时候尽量要注意!!!我也希望用截图这种直观的方式,快速记录项目设置的每个细节!尽量保证照着这个记录重新建类似的项目一次成功!!!

下面就是软件实现!有了前两次的AB32VG1评估板项目调试经验!这次相对就顺利多了!

软件逻辑是初始化后先获取对应目录下的.wav格式文件列表!在自动播放第一首歌!效果如图!

pYYBAGGOYESABlZMAACTOET9t4c696.png

接下来就是通过按键实现各种操作!如图:

pYYBAGGOYLSAMmCQAADO7YSwBS4339.png

增加了两个关联变量,控制声音,及播放完毕

poYBAGGOYvmANlNiAADXDPtO8PM762.png

配合以下源码:

/* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2021-11-12 panshi90 the first version
*/
#include
#include
#include "board.h"
#include
#include "wavplayer.h"
#include
#include
#include
#include
//S3
#define BUTTON_PIN_0 rt_pin_get("PF.0")
//S2
#define BUTTON_PIN_1 rt_pin_get("PF.1")
//#define NUM_OF_SONGS (1000u)
static struct button btn_0;
static struct button btn_1;
uint8_t cur_volume = 50;
int stopstate = 0;
rt_mutex_t mutex1;
int EndState = 0;
static uint32_t cnt_0 = 0;
//static uint32_t cnt_1 = 0;
uint16_t currentSong = 0;
static uint32_t NUM_OF_SONGS = 0;
char table[200];

static struct dfs_fd fd1;
static struct dirent dirent1;
void readFileListos()
{
struct stat stat;
int length, fd;
char* fullpath, * path;

fullpath = RT_NULL;
NUM_OF_SONGS = 1;
//system("cd .");
rt_thread_mdelay(10);
rm("wav.txt");
rt_thread_mdelay(50);
fd = open("wav.txt", O_WRONLY | O_CREAT | O_APPEND);
path = rt_strdup("/WAV");
if (dfs_file_open(&fd1, path, O_DIRECTORY) == 0)
{
//rt_kprintf("Directory %s:\n", path);
do
{
memset(&dirent1, 0, sizeof(dirent1));
length = dfs_file_getdents(&fd1, &dirent1, sizeof(dirent1));
if (length > 0)
{
memset(&stat, 0, sizeof(struct stat));

// build full path for each file
fullpath = dfs_normalize_path(path, dirent1.d_name);
if (fullpath == RT_NULL)
break;

if (dfs_file_stat(fullpath, &stat) == 0)
{
char songPath[200] = "WAV/";
strcat(songPath, dirent1.d_name);
strcat(songPath, "\n");
write(fd, songPath, sizeof(songPath));
//rt_kprintf("%s\n", songPath);
if (S_ISDIR(stat.st_mode))
{
rt_kprintf("%-25s\n", "

while (read(fd, songPath, sizeof(songPath)) > 0)
{
if (i == currentSong) {
int32_t len = strlen(songPath);
songPath[len - 1] = '\0';
strcpy(table, songPath);
}
i++;
}
}
close(fd);
}
void saia_channels_set(uint8_t channels);
void saia_volume_set(rt_uint8_t volume);
uint8_t saia_volume_get(void);

static uint8_t button_read_pin_0(void)
{
return rt_pin_read(BUTTON_PIN_0);
}

static uint8_t button_read_pin_1(void)
{
return rt_pin_read(BUTTON_PIN_1);
}

static void button_S3_callback(void* btn)
{
uint32_t btn_event_val;
btn_event_val = get_button_event((struct button*)btn);
switch (btn_event_val)
{
case SINGLE_CLICK:
cnt_0++;
cur_volume = cnt_0 * 10;
if (cnt_0 == 10)
{
cnt_0 = 1;
}
saia_volume_set(cur_volume);
rt_kprintf("vol=%d\n", saia_volume_get());
rt_kprintf("button S3 single click\n");
break;
case DOUBLE_CLICK:
if (cnt_0 > 1)
{
cnt_0--;
}
cur_volume = cnt_0 * 10;
wavplayer_volume_set(cur_volume);
rt_kprintf("button S3 double click\n");
break;
case LONG_PRESS_START:
rt_kprintf("button S3 long press start\n");
break;
case LONG_PRESS_HOLD:
rt_kprintf("button S3 long press hold\n");
break;
}
}

static void button_S2_callback(void* btn)
{
uint32_t btn_event_val;
int state = 0;
EndState = 1;
btn_event_val = get_button_event((struct button*)btn);

switch (btn_event_val)
{
case SINGLE_CLICK:
if (currentSong == NUM_OF_SONGS) {
currentSong = 0;
}
GetCurrentPath();
stopstate = 0;
wavplayer_play(table);
currentSong++;

rt_kprintf("button S2 single click\n");
break;
case DOUBLE_CLICK:
state = wavplayer_state_get();
switch (state)
{
case PLAYER_STATE_PLAYING:
wavplayer_pause();
break;
case PLAYER_STATE_PAUSED:
wavplayer_resume();
break;
case PLAYER_STATE_STOPED:
GetCurrentPath();
wavplayer_play(table);
rt_kprintf("button S2 double click\n");
break;
default:
break;
}
default:
break;
}

stopstate = 0;
EndState = 0;
}

static void btn_thread_entry(void* p)
{
while (1)
{
rt_thread_delay(RT_TICK_PER_SECOND / 500);
rt_err_t result = rt_mutex_take(mutex1, 2);
if (result == RT_EOK) {
button_ticks();
rt_mutex_release(mutex1);
}
}
}
static void endCheck_thread_entry(void* p)
{
while (1)
{
rt_thread_mdelay(2500);
rt_err_t result = rt_mutex_take(mutex1, 2);
int state = wavplayer_state_get();
if (result == RT_EOK) {
if ((state == PLAYER_STATE_STOPED) && (EndState == 0)) {
if ((stopstate == 1)) {
stopstate = 0;
if (currentSong == NUM_OF_SONGS) {
currentSong = 0;
}
GetCurrentPath();
wavplayer_play(table);
currentSong++;
}
}
rt_mutex_release(mutex1);
}
}
}

static int multi_button_test(void)
{
rt_thread_t thread = RT_NULL, thread1 = RT_NULL;
mutex1 = rt_mutex_create("xx", RT_IPC_FLAG_PRIO);
//Create background ticks thread
rt_thread_mdelay(2000);
readFileListos();
GetCurrentPath();
saia_volume_set(cur_volume);
wavplayer_play(table);
currentSong++;
thread = rt_thread_create("btn", btn_thread_entry, RT_NULL, 2048, 10, 10);
thread1 = rt_thread_create("endCHeck", endCheck_thread_entry, RT_NULL, 2000, 11, 10);
if (thread == RT_NULL)
{
return RT_ERROR;
}
rt_thread_startup(thread);
if (thread1 == RT_NULL)
{
return RT_ERROR;
}
rt_thread_startup(thread1);
// low level drive
rt_pin_mode(BUTTON_PIN_0, PIN_MODE_INPUT_PULLUP);
button_init(&btn_0, button_read_pin_0, PIN_LOW);
button_attach(&btn_0, SINGLE_CLICK, button_S3_callback);
button_attach(&btn_0, DOUBLE_CLICK, button_S3_callback);
button_attach(&btn_0, LONG_PRESS_START, button_S3_callback);
button_attach(&btn_0, LONG_PRESS_HOLD, button_S3_callback);
button_start(&btn_0);

rt_pin_mode(BUTTON_PIN_1, PIN_MODE_INPUT_PULLUP);
button_init(&btn_1, button_read_pin_1, PIN_LOW);
button_attach(&btn_1, SINGLE_CLICK, button_S2_callback);
button_attach(&btn_1, DOUBLE_CLICK, button_S2_callback);
button_attach(&btn_1, LONG_PRESS_START, button_S2_callback);
button_attach(&btn_1, LONG_PRESS_HOLD, button_S2_callback);
button_start(&btn_1);
return RT_EOK;
}

INIT_APP_EXPORT(multi_button_test);

即可实现AB32VG1评估板 音乐播放器!

目前只支持.WAV格式,其实一个好的播放器应该支持多种音频文件格式!如:MP3,AIFF!有兴趣的爱好者可以在此基础上实现更多或者自己更喜欢的方式!!!

欢迎留言点赞!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RTOS
    +关注

    关注

    25

    文章

    862

    浏览量

    122569
  • RISC
    +关注

    关注

    6

    文章

    485

    浏览量

    86070
  • RTThread
    +关注

    关注

    8

    文章

    133

    浏览量

    42524
  • 中科蓝讯
    +关注

    关注

    10

    文章

    64

    浏览量

    10569
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【精选资料】开发测评大赛作品合集!

    电子发烧友携手16家生态厂商发起开发测评大赛,设OpenHarmony、RISC-V、Rockchip三大赛道,共计21款、160+块开发,通过评测开发
    的头像 发表于 09-23 08:09 733次阅读
    【精选资料】开发<b class='flag-5'>板</b>测评<b class='flag-5'>大赛</b><b class='flag-5'>作品</b>合集!

    作品精选】2025电子发烧友开发测评大赛作品合集!

    电子发烧友开发测评大赛--最受欢迎开发 以下为本次大赛作品合集: 微五科技CF5010RBT60开发
    发表于 09-03 15:24

    作品合集】创龙科技TLT113/TL3562-MiniEVM开发测评

    TL3562-MiniEVM开发试用体验】8、FreeType显示矢量文字【创龙TL3562-MiniEVM开发试用体验】9、带音频波形显示的QT音乐播放器【创龙TL3562-Mi
    发表于 09-02 11:25

    2222#RTT设计大赛 #眼图

    RTT
    jf_34552825
    发布于 :2025年08月11日 11:43:45

    Made with KiCad(135):Echo - 开源的音乐播放器

    “  Echo 是一个开源硬件平台,专为音乐播放器设计。该项目的目标是开发一款基于开源软件并采用开源设计的高品质音乐播放器。 ”   Made with KiCad 系列将支持新的展示
    的头像 发表于 07-16 11:17 2727次阅读
    Made with KiCad(135):Echo - 开源的<b class='flag-5'>音乐</b><b class='flag-5'>播放器</b>

    基于STM32的音乐播放器电路+PCB源文件+源码+论文等打包下载

    基于STM32的音乐播放器电路+PCB源文件+源码+论文等打包,推荐下载!
    发表于 05-29 21:37

    dfd#电路知识 #RTT设计大赛

    RTT
    jf_34552825
    发布于 :2025年05月08日 19:50:18

    【开源分享】用ESP32复刻一个iPod :便携式音乐播放器Tangara

    Tangara是一款便携式开源音乐播放器,硬件电路使用KiCad设计,而且它的外壳和固件也是100%开源,点击阅读原文或下载链接可跳转下载。它通过3.5毫米耳机插孔或蓝牙输出高品质声音,电池续航
    的头像 发表于 04-22 08:05 1725次阅读
    【开源分享】用ESP32复刻一个iPod :便携式<b class='flag-5'>音乐</b><b class='flag-5'>播放器</b>Tangara

    Made with KiCad:Tangara 便携式音乐播放器

    Tangara 的固件采用分层架构设计,开发者可根据自身技术偏好灵活切入开发。实际上,在尝试打造一款趣味音乐播放器的过程中,我们意外创造出了一块对硬件极客极具吸引力的多功能开发。 在顶层交互逻辑中
    发表于 04-16 14:01

    Made with KiCad(120):Tangara 便携式音乐播放器

    “  Tangara 是一款便携式音乐播放器。它可通过 3.5 毫米耳机插孔或蓝牙输出高品质音质,电池续航时间长。 ” Made with KiCad 系列将支持新的展示方式。直接将以下链接复制到
    的头像 发表于 03-21 11:17 953次阅读
    Made with KiCad(120):Tangara 便携式<b class='flag-5'>音乐</b><b class='flag-5'>播放器</b>

    海贝HiBy R1播放器体验

    之前分享过用接入便携耳放来提升音质,让手机端也能享受HiFi级的听感体验。这个方案对于没有数码播放器的初烧用户来说,确实是种非常高效的方法。 但缺点也是有的,比如歌曲存放需要占用手机存储空间,手机
    的头像 发表于 01-24 11:27 4674次阅读
    海贝HiBy R<b class='flag-5'>1</b><b class='flag-5'>播放器</b>体验

    云服务 Flexus X 实例,Docker 集成搭建 YesPlayMusic 网易云音乐播放器

    YesPlayMusic 是一款基于 Electron 的开源网易云音乐桌面播放器,以简洁的界面和丰富的功能受到了许多用户的喜爱,特别是对于希望在桌面上享受网易云音乐服务的用户 Docker 安装并
    的头像 发表于 01-13 18:17 1067次阅读
    云服务<b class='flag-5'>器</b> Flexus X 实例,Docker 集成搭建 YesPlayMusic 网易云<b class='flag-5'>音乐</b><b class='flag-5'>播放器</b>

    索尼发布空间现实显示播放器新版本

    索尼于2024年12月发布适用于空间现实显示屏ELF-SR1和ELF-SR2的空间现实显示播放器新版本。
    的头像 发表于 12-24 15:19 945次阅读

    毕业设计竞赛选题推荐 | 嵌入式Linux应用之音乐播放器项目实战(含文档及源码)

    01引言随着数字化娱乐日益普及,音乐播放器作为人们生活中不可或缺的一部分,扮演着重要的角色。无论是通勤途中、健身锻炼还是工作学习,一个好用的音乐播放器都能为用户提供愉悦的音频体验,丰富
    的头像 发表于 12-23 16:50 1348次阅读
    毕业设计竞赛选题推荐 | 嵌入式Linux应用之<b class='flag-5'>音乐</b><b class='flag-5'>播放器</b>项目实战(含文档及源码)

    海贝R1便携音乐播放器开箱

    ,插上耳机,你就拥有了一片独立的小天地。 海贝R1这款便携音乐播放器的颜值相当出色,75克的机身塞进去了3英寸的高清触摸屏。圆润的外形配合透明中框和多色可选主题配色,颜值非常的能打。纯净的HiBy OS不仅简单易用,也进一步优化
    的头像 发表于 12-09 09:40 1979次阅读
    海贝R<b class='flag-5'>1</b>便携<b class='flag-5'>音乐</b><b class='flag-5'>播放器</b>开箱