单片机交流
直播中

张虎豹

7年用户 1500经验值
私信 关注
[问答]

怎么实现基于STM32F4的音乐播放器的设计?

怎么实现基于STM32F4的音乐播放器的设计?

回帖(1)

甘璐妲

2021-9-23 11:15:54
基于STM32的音乐播放器






哔哩哔哩视频链接:https://www.bilibili.com/video/BV1cp4y1678G/
资料链接:https://download.csdn.net/download/mbs520/13711787
百度网盘链接:https://pan.baidu.com/s/1G-Q1CA1Px8RSZJtTYjmELw
提取码:abcd
取走记得点赞
一、项目要求:

硬件驱动+软件工具类项目
项目需要的技术:



  • UCOSIII
  • GUI显示
  • IIS协议
  • 声卡驱动----资料及参考代码提供
  • SD卡驱动—资料及参考代码提供
  • Fatfs文件系统
  • IIC/SPI 及W25Q128驱动
  • 字库在MCU屏的使用
  • mp3、WAV解码库的移植及使用–资料及参考代码提供
  • JPG、BMP解码库的移植及使用–资料及参考代码提供
  • DMA使用

功能基本和现在的MP3设备一样
①能够通过SD卡驱动嵌入文件系统实现对SD卡目录的扫描获取音乐文件(.mp3 .wav等)
②驱动WM8978声卡芯片 使用IIS实现对SD卡读取的音频数据后的向声卡传输 并控制声卡播放音乐
③能够自己在mcu屏中显示MP3播放器相关信息
歌曲名。。。。
可以使用字库显示相关中文
二、材料准备

1、STM32F4开发板一块(需要音频接口支持)(我用的GEC M4)
(注意要买能插LCD屏的、最好有板载wm8978,没有的话可以外接音频驱动模块)
作用:主控芯片、处理各种数据





或者:





+





2、800*480 4.3寸电容触摸LCD屏(我用的正点原子的屏)
(注意不兼容其他分辨率的屏)
作用:显示与触摸控制





3、一张32G以下的SD卡和一个读卡器
作用:存储mp3、wav 文件、图片文件等必要文件





二、硬件连接

1、把屏幕插到开发板上即可
三、下载调试

1、下载好相关资料





2、下载源代码到单片机
3、将SD卡根目录文件拷贝到SD卡根目录下





4、上电启动系统,供电要足,不然屏幕半亮、声卡驱动异常。
能正常显示图片、按钮控件即移植成功。
四、相关知识点

(一)、FATFS文件系统(就是个用来读写SD卡文件的)
1、FATFS 是一个完全免费开源的 FAT 文件系统模块,专门为小型的嵌入式系统而设计。它完
全用标准 C 语言编写,所以具有良好的硬件平***立性,可以移植到 8051、PIC、AVR、SH、
Z80、H8、ARM 等系列单片机上而只需做简单的修改。它支持 FATl2、FATl6 和 FAT32,支持多个存储媒介;
2、为什么需要文件系统?
因为SD卡只是一种存储器,普通的读写操作只能是针对地址进行读取,读取出来的数据都是一些字符数据,并没有文件的概念,加入了文件系统的SD卡可以利用FATFS文件系统进行管理,比如说要存储一张图片只需要以文件的形式存储,而普通的读写只能是把图片数据一个字节一个字节地存到一块指定内存中,读取也要严格根据地址位置读取
3、正点原子提供了比较好用的FATFS源码可以直接移植使用
代码文件可以到正点原子官网下载
下面是主要API函数: 进行对文件的读取、写入等一系列操作,与C语言文件IO差不多相似,看文件名应该知道大概的用途





(二)、MP3播放
下次再写,困了~o~
(三)、图片显示
下次再写,困了~o~
(四)、GUI界面
下次再写,困了~o~
五、程序展示

展示部分关键代码:



#include "stm32f4xx.h"




/*  开始任务  */
//任务优先级
#define START_TASK_PRIO                3
//任务堆栈大小       
#define START_STK_SIZE                 128
//任务控制块
OS_TCB StartTaskTCB;
//任务堆栈       
CPU_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *p_arg);


/*  主任务  */
//任务优先级
#define MAIN_TASK_PRIO                6
//任务堆栈大小       
#define MAIN_STK_SIZE                 512
//任务控制块
OS_TCB MainTaskTCB;
//任务堆栈       
CPU_STK MAIN_TASK_STK[MAIN_STK_SIZE];
//任务函数
void main_task(void *p_arg);






//系统初始化
void sys_init(void)
{
        u8 key;
       
        uart_init(115200);  //串口初始化
        LED_Init();         //LED初始化
        KEY_Init();
        LCD_Init();                                        //LCD初始化  
       
        FSMC_SRAM_Init();                        //SRAM
        tp_dev.init();                        //触摸初始化       
        W25QXX_Init();                                //初始化W25Q128
        gui_init();          //gui初始化
       
        my_mem_init(SRAMIN);                //初始化内部内存池
        my_mem_init(SRAMEX);                //初始化外部内存池
        my_mem_init(SRAMCCM);                //初始化CCM内存池
        exfuns_init();                                //为fatfs相关变量申请内存  
          f_mount(fs[0],"0:",1);                 //挂载SD卡
        f_mount(fs[1],"1:",1);                 //挂载FLASH.
        piclib_init();                                                                                //初始化画图          
       
        while(font_init()) ;                        //检查字库
        while(WM8978_Init());//检查音频芯片是否正常
}


int main(void)
{
        OS_ERR err;
        CPU_SR_ALLOC();
       
        delay_init(168);          //时钟初始化
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组配置
       
        sys_init();    //系统初始化
        delay_ms(150);   
        LCD_Clear(GRAY);//清屏
       
       
        OSInit(&err);                //初始化UCOSIII
        OS_CRITICAL_ENTER();//进入临界区
        //创建开始任务
        OSTaskCreate((OS_TCB         * )&StartTaskTCB,                //任务控制块
                                 (CPU_CHAR        * )"start task",                 //任务名字
                 (OS_TASK_PTR )start_task,                         //任务函数
                 (void                * )0,                                        //传递给任务函数的参数
                 (OS_PRIO          )START_TASK_PRIO,     //任务优先级
                 (CPU_STK   * )&START_TASK_STK[0],        //任务堆栈基地址
                 (CPU_STK_SIZE)START_STK_SIZE/10,        //任务堆栈深度限位
                 (CPU_STK_SIZE)START_STK_SIZE,                //任务堆栈大小
                 (OS_MSG_QTY  )0,                                        //任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息
                 (OS_TICK          )0,                                        //当使能时间片轮转时的时间片长度,为0时为默认长度,
                 (void           * )0,                                        //用户补充的存储区
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项
                 (OS_ERR         * )&err);                                //存放该函数错误时的返回值
        OS_CRITICAL_EXIT();        //退出临界区         
        OSStart(&err);  //开启UCOSIII
        while(1);
}


//主任务
void main_task(void *pdata)
{
        while(1)
        {
                audio_play();//音乐播放器
                LCD_Clear(WHITE);
                delay_ms(1000);
        }
}
化作尘其它开源项目:

单片机项目:

基于stm32c8t6的坡道行驶巡线小车(2020年TI杯大学生电子设计竞赛 C题)https://blog.csdn.net/mbs520/article/details/115438122
基于STM32F4的音乐播放器
https://blog.csdn.net/mbs520/article/details/111313042
基于STM32F4的电子阅读器(首创)
https://blog.csdn.net/mbs520/article/details/110817173
基于51单片机WiFi视频小车(首创)
https://blog.csdn.net/mbs520/article/details/109843972
基于51单片机蓝牙小车
https://blog.csdn.net/mbs520/article/details/109775964
基于MSP430 坡道行驶电动小车(2020年TI杯大学生电子设计竞赛 C题)
https://blog.csdn.net/mbs520/article/details/109090072
基于stm32f4的智能门锁系统
https://blog.csdn.net/mbs520/article/details/106987758
基于51单片机超声波测距小车
https://blog.csdn.net/mbs520/article/details/106599219
基于51单片机定时宠物喂食系统
https://blog.csdn.net/mbs520/article/details/108292187
Linux项目:

基于QT5 Linux平台 停车场管理系统
https://blog.csdn.net/mbs520/article/details/113481824
基于QT5 Linux平台 车载系统
https://blog.csdn.net/mbs520/article/details/112873809
基于Linux系统 媒体播放器
https://blog.csdn.net/mbs520/article/details/107880118
基于Linux系统 语音识别、人机对话
https://blog.csdn.net/mbs520/article/details/113179224
基于Linux系统小钢琴程序(暂无博客)
https://download.csdn.net/download/mbs520/12798287
基于Linux系统 QQ通讯录管理系统(暂无博客)
举报

更多回帖

发帖
×
20
完善资料,
赚取积分