音乐播放器-按键版本
- 1 背景介绍
- 1.1 导入音乐播放器
- 1.2 导入按键扫描按键包
- 2 功能设计
- 2.1 需求分析
- 2.2 程序架构设计
- 2.3 相关知识储备
- 3 代码编写
- 3.1 led代码实现
- 3.2 按键扫描
- 3.3 音乐播放线程
- 4 低功耗设计
- 4.1 睡眠模式
- 4.2 停止模式
- 4.3 待机模式
1 背景介绍
这个音乐播放器分为了三个版本:第一个版本:基于按键的控制;第二个版本:基于串口的控制;第三个版本:基于触摸屏控制。
这里是介绍第一个版本的创建过程。通过一个综合案例或者项目,引导出片上资源的引用。
1.1 导入音乐播放器
这个音乐播放器的采用开源的案例,具体步骤参考这篇文章:rt-thread 的软件报包-RTT-BeepPlayer-pkg
1.2 导入按键扫描按键包
这个按键扫描检测的代码,也是采用开源的案例导入而来。具体导入步骤,可以参考笔者这篇文章:rt-thread 的软件报包-button 软件包
2 功能设计
2.1 需求分析
1 按按键0,可以切换播放状态:播放和暂停;
2 按按键1,可以播放下一首歌;
3 按按键2,可以播放上一首歌;
4 按按键keyup,进入睡眠模式;
2.2 程序架构设计
- 创建一个线程1:扫描读取按键的状态;
- 创建一个线程2:用来控制播放器的状态;
- 线程1和线程2,通过邮箱来传递按键的状态;
- 创建一个线程3:闪烁LED灯,提示系统的工作状态;
2.3 相关知识储备
1 线程创建:嵌入式系统应用-第四章操作系统(rt_thread)内核kernel 上
2 邮箱知识:嵌入式系统应用-第四章操作系统(rt_thread)内核kernel 下
3 低功耗技术:
- STM32&GD32电源管理及低功耗设计
- 嵌入式系统应用-拓展-STM32 低功耗设计
3 代码编写
3.1 led代码实现
这里采用软定时器,每隔500ms闪烁一次。
// 定时器回调函数
static void timer_callback(void *parameter)
{
// 翻转LED状态
// rt_pin_write(LED_PIN, !rt_pin_read(LED_PIN));
// rt_kprintf("LED toggled!\n");
GPIO_ToggleBits(GPIOF,GPIO_Pin_9);
}
/**
* @brief 创建并启动定时器
*/
void timer_init(void)
{
// 创建定时器
rt_timer_t timer = rt_timer_create(
"led_timer", // 定时器名称
timer_callback, // 定时器回调函数
RT_NULL, // 回调函数参数
500, // 定时器周期 (500ms)
RT_TIMER_FLAG_PERIODIC // 周期性定时器
|RT_TIMER_FLAG_HARD_TIMER
);
// 启动定时器
if (timer != RT_NULL)
{
rt_timer_start(timer);
// rt_kprintf("Timer started successfully!\n");
}
else
{
// rt_kprintf("Failed to create timer!\n");
}
}
/**
* @brief 硬件初始化函数
*/
void soft_timer_init(void)
{
// 初始化LED GPIO
// led_gpio_init();
gpio_init();
// 初始化定时器
timer_init();
}
// 导出到自动初始化
INIT_APP_EXPORT(soft_timer_init);
3.2 按键扫描
按键扫描程序创建按键对象,同时创建邮箱;利用邮箱发送安装的状态到音乐播放线程。
3.3 音乐播放线程
等待邮箱的指令发送,如果接受到对应指令,操作音乐播放器:播放、暂停、下一首、上一首等。