国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

    文章

    866

    瀏覽量

    122973
  • RISC
    +關注

    關注

    6

    文章

    485

    瀏覽量

    86598
  • RTThread
    +關注

    關注

    8

    文章

    132

    瀏覽量

    42720
  • 中科藍訊
    +關注

    關注

    10

    文章

    66

    瀏覽量

    10661
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    花椒直播開源鴻蒙專屬直播播放器 助力高效開發高性能直播應用

    近日,花椒直播開源了專注于直播場景的播放器“HJPlayer”。它基于自研的通用多媒體框架“HJMedia”打造,與早前開源的推流“HJPusher”共同構成了覆蓋主播推流到觀眾播放的完整客戶端
    的頭像 發表于 10-22 11:20 ?364次閱讀
    花椒直播開源鴻蒙專屬直播<b class='flag-5'>播放器</b> 助力高效開發高性能直播應用

    [投票評選]2025電子發燒友開發測評大賽--最受歡迎開發

    call吧,助力開發者生態持續成長! 投票入口: 2025電子發燒友開發測評大賽--最受歡迎開發 本次投票結果,將作為平臺后續挑選試用產品重要參考,歡迎大家踴躍參加哦~ 作品測評
    發表于 10-13 16:25

    【精選資料】開發測評大賽作品合集!

    電子發燒友攜手16家生態廠商發起開發測評大賽,設OpenHarmony、RISC-V、Rockchip三大賽道,共計21款、160+塊開發,通過評測開發
    的頭像 發表于 09-23 08:09 ?1115次閱讀
    【精選資料】開發<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

    創通聯達助力飛傲M27革新便攜HiFi播放器體驗

    2025年8月15日,飛傲在第19屆深圳國際音頻展(SIAS)正式發布年度旗艦播放器FIIO M27。作為基于創通聯達TurboX C6490 SOM打造的標桿產品,M27憑借該模塊的卓越性能與飛傲自研聲學技術形成協同突破,為用戶帶來全方位、全場景的優秀音頻體驗,全面革新便攜HiFi
    的頭像 發表于 08-19 16:15 ?2126次閱讀

    2222#RTT設計大賽 #眼圖

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

    【創龍TL3562-MiniEVM開發試用體驗】9、帶音頻波形顯示的QT音樂播放器

    IMX6U倉庫/正點原子I.MX6U 嵌入式Qt開發指南例程源碼 本文主要目標是在原播放器基礎上增加可視化時域波形(音頻振幅)功能。 以下是完整實現方法: 1. 核心思路 時域波形 :直接繪制音頻 PCM
    發表于 08-08 19:18

    Made with KiCad(135):Echo - 開源的音樂播放器

    “? Echo 是一個開源硬件平臺,專為音樂播放器設計。該項目的目標是開發一款基于開源軟件并采用開源設計的高品質音樂播放器。 ” ? Made with KiCad 系列將支持新的展示
    的頭像 發表于 07-16 11:17 ?3106次閱讀
    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

    【開源獲獎案例】基于T5L智能屏的音樂播放與歌詞顯示方案

    ——來自迪文開發者論壇本期為大家推送迪文開發者論壇獲獎開源案例——基于T5L智能屏的音樂播放與歌詞顯示方案。該方案通過T5L串口與通用開發、解碼進行數據交互,將解析完成的音頻和歌詞
    的頭像 發表于 05-08 09:52 ?853次閱讀
    【開源獲獎案例】基于T5L智能屏的<b class='flag-5'>音樂</b><b class='flag-5'>播放</b>與歌詞顯示方案

    【開源分享】用ESP32復刻一個iPod :便攜式音樂播放器Tangara

    Tangara是一款便攜式開源音樂播放器,硬件電路使用KiCad設計,而且它的外殼和固件也是100%開源,點擊閱讀原文或下載鏈接可跳轉下載。它通過3.5毫米耳機插孔或藍牙輸出高品質聲音,電池續航
    的頭像 發表于 04-22 08:05 ?2103次閱讀
    【開源分享】用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 ?1213次閱讀
    Made with KiCad(120):Tangara 便攜式<b class='flag-5'>音樂</b><b class='flag-5'>播放器</b>