嵌入式系统应用-音乐播放器-按键版本
音乐播放器-按键版本
- 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 音乐播放线程
等待邮箱的指令发送,如果接受到对应指令,操作音乐播放器:播放、暂停、下一首、上一首等。
4 低功耗设计
4.1 睡眠模式
4.2 停止模式
4.3 待机模式
相关文章:
嵌入式系统应用-音乐播放器-按键版本
音乐播放器-按键版本 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 背景介绍 这个音乐播放器分…...
LabVIEW液压振动锤控制系统
在现代工程机械领域,液压振动锤的高效与精准控制日益显得重要。本文通过LabVIEW软件,展开液压振动锤启停共振控制技术的研究与应用,探讨如何通过改进控制系统来优化液压振动锤的工作性能,确保其在复杂工况下的稳定性与效率。 …...
简单介绍My—Batis
1.什么是My—Batis? My—Batis是一个持久层框架,提供了sql映射功能,能方便的将数据库表和java对象进行映射,通过My—Batis可以将项目中的数据存储在数据库中,以便我们进行调用。值得注意的是My—Batis和spring不是一回…...
ALTER TABLE SHRINK SPACE及MOVE的区别与适用场景
以下是 Oracle 数据库中三个收缩表空间命令的对比: 1. ALTER TABLE table_name SHRINK SPACE; 作用:直接重组表数据并移动高水位线(HWM),释放未使用的空间到表空间。 影响: 会锁表&#…...
车载通信方案为何选择CAN/CANFD?
摘要 随着汽车电子技术的飞速发展,车载通信系统在车辆的智能化、网联化进程中扮演着至关重要的角色。控制器局域网络(CAN)及其扩展版本CANFD凭借其卓越的可靠性、高效的数据传输能力和强大的抗干扰特性,成为现代汽车通信架构的核心…...
docker远程debug
1. 修改 Java 启动命令 在 Docker 容器中启动 Java 程序时,需要添加 JVM 调试参数,jdk8以上版本 java -agentlib:jdwptransportdt_socket,servery,suspendn,address*:5005 -jar your-app.jar jdk8及以下版本: java -Xdebug -Xrunjdwp:tra…...
rosbag|ROS中.bag数据包转换为matlab中.mat数据类型
代码见代码 msg_dict中设置自定义消息类型 test_config中设置需要记录的具体的值 test_config中topic_name以及message_type照搬plotjuggler打开时的参数 最后生成.mat文件在matlab中进行使用...
Java编程思想:为何有时要将子类对象赋值给父类引用
为何有时要将子类对象赋值给父类引用,用父类来进行实例化? 这就要说多态的优势: 代码的扩展性和降低耦合度,而不是完全避免修改代码。 TuXing t new Changfangxing(); Changfangxing k (Changfangxing)t;原因1: 代码可拓展性 …...
pytest-xdist 进行高效并行自动化测试
pytest-xdist 的核心功能是通过多进程分发测试任务,每个进程独立运行测试,确保测试隔离。2025 年 3 月 25 日,pytest-xdist 在 GitHub 上已有超过 1,200,000 次下载,表明其在测试社区中的广泛接受。 在自动化测试中,随…...
位置编码再思考
最近在做多模态,发现基于 transformer 的多模态,position embedding 是一个非常重要的内容,而且还没有统一方案,先暂做记录,几篇还不错的博客: Transformer学习笔记一:Positional Encoding&…...
Deepseek API+Python 测试用例一键生成与导出 V1.0.3
** 功能详解** 随着软件测试复杂度的不断提升,测试工程师需要更高效的方法来设计高覆盖率的测试用例。Deepseek API+Python 测试用例生成工具在 V1.0.3 版本中,新增了多个功能点,优化了提示词模板,并增强了对文档和接口测试用例的支持,极大提升了测试用例设计的智能化和易…...
[c语言日寄MAX]深度解析:大小端字节序
【作者主页】siy2333 【专栏介绍】⌈c语言日寄MAX⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还…...
Android ADB工具使用教程(从安装到使用)
目录 ADB工具介绍 什么是ADB? 组成 主要功能 ADB工具安装与连接设备 WIFI连接,提示计算机积极拒绝10061 WIFI成功连接后,拔掉数据线显示offline 提示adb版本不一致编辑 ADB工具使用 ★日志操作命令 adb logcat:抓取日志 日志格式…...
开个坑记录一下树莓派4B部署yolo的一些问题
问题一:操作系统与内核信息 这个问题困扰了我一天半,下载的时候显示的信息是aar64的系统,但是这并无意味着一个问题,那就是你的操作系统是64位的。需要采用如下的指令查看: getconf LONG_BIT 我在树莓派得出来的操作…...
基于SSM框架的线上甜品销售系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。因此网上销售信息的…...
基于 FPGA的HLS技术与应用
1、hls简介 HLS ( high level synthesis )即高层次综合,主要是利用高级编程语言实现算法。 2、循环优化 约束语法: #pragma HLS unroll #pragma HLS PIPELINE II1 绝大多数循环都以串行的方式执行,这种执行方…...
Redis原理:Monitor 实现
在调用 Redis 的 MONITOR 命令后,可以在对应的客户端上实时查看服务器的执行情况。今天,我们将从源码的角度来深入探讨 MONITOR 机制是如何处理这些请求以及如何将数据反馈给用户的。 MONITOR 命令的实现 Redis 中所有命令的具体实现细节都可以在其源代…...
计算机工具基础(七)——Git
Git 本系列博客为《Missing in CS Class(2020)》课程笔记 Git是一种分布式版本控制系统,被其跟踪的文件可被查询精细到行的修改记录、回退版本、建立分支等 模型 一般流程:工作区 → \to →暂存区 → \to →仓库(本地 → \to →远端) 工作区࿱…...
鸿蒙开发:父组件如何调用子组件中的方法?
前言 本文基于Api13 很多的场景下,父组件需要触发子组件中的某个方法,来实现一些特定的逻辑,但是ArkUI是声明式UI,不能直接调用子组件中的方法,那么怎么去实现这个功能呢? 举一个很常见的案例,通…...
23种设计模式-创建型模式-工厂方法
文章目录 简介场景问题1. 直接依赖具体实现2. 违反开闭原则3. 条件分支泛滥4. 代码重复风险 解决根本问题完整类图完整代码说明核心优势代码优化静态配置表动态策略 总结 简介 工厂方法是一种创建型设计模式,它提供了在父类中创建对象的接口,但允许子类…...
142. 环形链表 II——考察数学,难!
142. 环形链表 IIhttps://leetcode.cn/problems/linked-list-cycle-ii/ 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,…...
C++常见问题与思考
TLS(线程本地存储)原理 线程本地存储(Thread Local Storage,TLS)是一种机制,它允许每个线程拥有自己独立的变量实例,这些变量的生命周期与线程相同。也就是说,不同线程对同一个 TLS…...
从零开始:使用Luatools工具高效烧录Air780EPM核心板项目的完整指南
本文将深入讲解如何使用Luatools工具烧录一个具体的项目到Air780EPM开发板中。如何使用官方推荐的Luatools工具(一款跨平台、命令行驱动的烧录利器),通过“环境配置→硬件连接→参数设置→一键烧录”四大步骤,帮助用户实现Air780E…...
关于c++的几个简单算法
一. 动态规划(Dynamic Programming) 难点:状态转移方程的构建和初始化条件的设计 典型问题:01背包问题 分析: 状态定义 dp[i][j] 表示前i个物品放入容量为j的背包的最大价值。状态转移需要判断是否选择当前物品。 #i…...
WPF MergedDictionaries详解
在 WPF 中,ResourceDictionary.MergedDictionaries 是一个非常重要的特性,用于将多个资源字典(ResourceDictionary)合并到一个主资源字典中。这种机制使得资源的管理和复用变得更加灵活和高效。 1. MergedDictionaries 的作用 Me…...
一套云HIS系统源码,系统融合HIS与EMR,基于云端部署,采用B/S架构与SaaS模式
云HIS系统完全基于云端部署,采用B/S架构,并通过软件即服务(SaaS)的形式面向二级及以下医院可快速交付、便捷运维、云化的医院核心业务平台产品。融合医院HIS和EMR两大主营系统,构建涵盖患者、费用、医嘱、电子病历等核…...
DisplayPort(DP)详解
一、DisplayPort的定义与核心特性 DisplayPort(DP) 是由 视频电子标准协会(VESA) 制定的 高性能数字音视频接口,专为高分辨率显示器和多屏应用设计。其核心特性包括: 高带宽:DisplayPort 2.0支…...
C++数据结构(搜索二叉树)
1.二叉树搜索的概念 二叉搜索数也成为二叉排序树,它或者是一颗空树,或者是满足以下性质的树: 1.若他的左子树不为空,则左子树上的所有节点的值都小于等于根节点的值。 2.若他的右子树不为空,则右子树上的所有节点的值…...
OpenCV图像拼接(6)图像拼接模块的用于创建权重图函数createWeightMap()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::detail::createWeightMap 是 OpenCV 库中用于图像拼接模块的一个函数,主要用于创建权重图。这个权重图在图像拼接过程中扮演着重…...
Micropython RPI-PICO 随记-双PICO串口传数据
开发环境 MCU:双 Pico1(无wifi版),串口相连,需要共地使用固件:自编译版本开发环境:MacBook Pro Sonoma 14.5开发工具:Thonny 4.1.6开发语言:MicroPython 1.24.0 上位机…...
