1.接前文
【正点原子STM32战舰V4开发板体验】第二弹,lvgl显示移植
把lvgl移植完成之后,就可以着手做以下几件事了:
- 对接触摸芯片,让屏幕支持触摸
- 编写sd卡驱动,挂挂载sd卡,并需要初始化文件系统,以便后面能够读取到MP3文件
- 编写音频芯片驱动,以实现音乐播放
本次实验的最终效果后面会放到帖子的视频栏中.
2.编写触摸芯片驱动并添加到lvgl的indev
我们所使用的触摸芯片是ft6236,所以在rtt的软件包里加载rt6236驱动:
然后在软件包里就能看到ft6236软件包了:
然后还要加载touch驱动:
最后就是lv_port_indev_init完善:
这里面有一个touchpad_read
函数需要完善,这是一个回调函数,会不停的读取屏幕上的点击:
这样就完成了触摸屏的对接,接下来检测一下是否可以使用:
3.实现sd卡的挂载并初始化文件系统
rtthread这方面做的比较好,直接开启几个软件包就可以使用了:
开启这几个选项之后,保存之后,就可以看到多了几个组件,比如fat文件系统:
直接编译,并烧录固件,然后找一张sd卡,在电脑上格式化成FAT32格式之后,插入到战舰V4的卡槽里去,可以在开机日志看到sd卡已经挂载到"/"下:
然后输入help可以看到多了很多跟文件系统的指令,比如cd
,cp
等:
cd到/目录下查看对应文件:
可以看到文件了,说明sd卡文件系统挂载成功
4.编写音乐播放驱动
关于音乐播放这块,其实用的是咱们原子官方的代码库:
只需要将对应的文件拷贝到工程里,然后改一些include的目录就可了
5.编写音乐播放器界面
将原来的音乐播放界面删除掉,重新画一个界面:
这个button绑定一个点击事件,点击事件里是当按钮按下时判断当前状态,进行状态切换,如果是播放状态慢开启音频播放,同时将button的文字进行改变:
这个界面的运行效果如下:
6.编写简单的播放器线程
播放器线程用player.c包裹,在系统启动的时候即启动该线程:
线程的主体就是等待lvgl发送播放和停止,音量加减等信号,然后做出相应的处理:
这里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);
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)
{
i += 32;
}
} while (i < 4096);
}
f_close(&fmp3);
}
7.总结
经过这段时间的摸索,总算是把lvgl+音频播放还有文件系统这几块大的知识整体过了一遍,也算是弥补了一直没有做过一个嵌入式的音乐播放器的梦.
后续的工作:有时间的话想优化一下播放器的界面,添加播放进度显示和音量加减按钮,还有音乐文件的显示等等,
这里再次感谢发烧友平台和正点原子提供的开发板试用机会,希望以后还有获得试用的机会,给大家带来好的帖子.