正点原子学习小组
直播中

cszzlsw

9年用户 200经验值
擅长:嵌入式技术
私信 关注

【正点原子STM32战舰V4开发板体验】第三弹,完善带屏音乐播放器案例

lgvl音乐播放器

1.接前文

【正点原子STM32战舰V4开发板体验】第二弹,lvgl显示移植

把lvgl移植完成之后,就可以着手做以下几件事了:

  • 对接触摸芯片,让屏幕支持触摸
  • 编写sd卡驱动,挂挂载sd卡,并需要初始化文件系统,以便后面能够读取到MP3文件
  • 编写音频芯片驱动,以实现音乐播放

本次实验的最终效果后面会放到帖子的视频栏中.

2.编写触摸芯片驱动并添加到lvgl的indev

我们所使用的触摸芯片是ft6236,所以在rtt的软件包里加载rt6236驱动:

image.png

然后在软件包里就能看到ft6236软件包了:
image.png

然后还要加载touch驱动:
image.png

最后就是lv_port_indev_init完善:
image.png

这里面有一个touchpad_read函数需要完善,这是一个回调函数,会不停的读取屏幕上的点击:
image.png

这样就完成了触摸屏的对接,接下来检测一下是否可以使用:
image.png

3.实现sd卡的挂载并初始化文件系统

rtthread这方面做的比较好,直接开启几个软件包就可以使用了:

image.png
image.png

开启这几个选项之后,保存之后,就可以看到多了几个组件,比如fat文件系统:

image.png

直接编译,并烧录固件,然后找一张sd卡,在电脑上格式化成FAT32格式之后,插入到战舰V4的卡槽里去,可以在开机日志看到sd卡已经挂载到"/"下:

image.png

然后输入help可以看到多了很多跟文件系统的指令,比如cd,cp等:
image.png

cd到/目录下查看对应文件:
image.png

可以看到文件了,说明sd卡文件系统挂载成功

4.编写音乐播放驱动

关于音乐播放这块,其实用的是咱们原子官方的代码库:
image.png

只需要将对应的文件拷贝到工程里,然后改一些include的目录就可了

5.编写音乐播放器界面

将原来的音乐播放界面删除掉,重新画一个界面:
image.png

这个button绑定一个点击事件,点击事件里是当按钮按下时判断当前状态,进行状态切换,如果是播放状态慢开启音频播放,同时将button的文字进行改变:
image.png

这个界面的运行效果如下:
522a97494f5ab04c578c0eed7cdeac0.jpg

6.编写简单的播放器线程

播放器线程用player.c包裹,在系统启动的时候即启动该线程:
image.png

线程的主体就是等待lvgl发送播放和停止,音量加减等信号,然后做出相应的处理:
image.png

这里audio_play()函数主要内容就是读取音频文件然后播放,播放采用每4k一取的方式:

oid audio_play()
{
    rt_kprintf(">> %s:%d \\n", __func__, __LINE__);
    cur_state = player_state_played;
    uint16_t br;
    FIL fmp3;
    FRESULT res = f_open(&fmp3, "/music/langren.MP3", FA_READ);
    if (res != FR_OK)
    {
        rt_kprintf("open music file failed\\n");
        return;
    }
    rt_kprintf("open music file ok!\\n");

    vs10xx_reset();
    vs10xx_soft_reset();

    vs10xx_restart_play(); /* 重启播放 */
    vs10xx_set_all(); /* 设置音量等信息 */
    vs10xx_reset_decode_time(); /* 复位解码时间 */

    vs10xx_spi_speed_high(); /* 高速 */

    while (cur_state)
    {
        res = f_read(&fmp3, databuf, 4096, (UINT *) &br); /* 读出4096个字节 */
        int i = 0;
        rt_kprintf(">> f_read:%d %d \\n", res, br);

        if (br != 4096 || res != 0)
        {

            rt_kprintf(">> %s:%d  \\n", __func__, __LINE__);
            break; /* 读完了 */
        }

        do /* 主播放循环 */
        {
            if (vs10xx_send_music_data(databuf + i) == 0) /* 给VS10XX发送音频数据 */
            {
                i += 32;
            }

        } while (i < 4096); /* 循环发送4096个字节 */


    }

    f_close(&fmp3);

}

7.总结

经过这段时间的摸索,总算是把lvgl+音频播放还有文件系统这几块大的知识整体过了一遍,也算是弥补了一直没有做过一个嵌入式的音乐播放器的梦.
后续的工作:有时间的话想优化一下播放器的界面,添加播放进度显示和音量加减按钮,还有音乐文件的显示等等,

这里再次感谢发烧友平台和正点原子提供的开发板试用机会,希望以后还有获得试用的机会,给大家带来好的帖子.

更多回帖

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