当前位置: 首页 > news >正文

07_任务状态——改进播放控制

一、声明

        在05和06的程序里面可以达到的一个效果就是很完美的播放音乐,并且不会影响到其它任务的运行,但是这个代码有一个弊端就是要么创建任务从头开始播放要么就直接删除任务。

        我们现在的程序就增加了音乐的暂停和恢复的功能,那么能够达到的一个效果就是:按下中间的play按键的时候就能够创建音乐播放任务,再次按下play(三角符号)的时候音乐就会暂停,再次按下就会从上一次暂停的地方继续播放音乐

        如果在软件的配置找不出任何问题,硬件上也没有连接错误的话,那么外设还是没有反应有可能是连线接触不良

        示例代码:temp09,自己程序:07

二、基本CubeMx的配置

三、外设的配置

OLED

硬件连接

PB7——SDA

PB6——SCL

软件配置
CubeMx

        直接点击I2C配置就好,其它的参数都是默认的

keil5

        包含的头文件:这个里面不需要写#include "driver_oled.h"因为在#include "driver_lcd.h"里面已经包含了。好像在OLED的使用里面也用到了timer的文件,所以在添加文件的时候也把"driver_timer"这个文件也要添加进去

        添加文件的时候要注意"ascii_font.c"这个文件只需要在BSP的文件包里面要包含这个文件,并不需要把这个添加到keil5里面的BSP文件下面去,也不需要在头文件包含里面写这个头文件

RGB的Led灯

硬件连接

VCC——5V

R——PA2

B——PB3

G——PA15

软件配置
CubeMx

        记得要开一个内部时钟(虽然也不知道内部时钟有什么用),记得下面的PSC和ARR要配置一下,不然RGB灯的亮度会有点问题 

keil5

蜂鸣器

硬件连接

IO——PA8

VCC——5V

软件配置
CubeMx

        要开一个PWM输出,还有下面的PSC以及ARR要配置一下 

keil5

CBT6的Led

软件配置
CubeMx

keil5

包含的头文件:

        因为#include "driver_led.h"里面使用到了mdelay的延时函数,而这个延时函数是包含在#include "driver_timer.h"这个文件里面,所以我们除了要包含led的库函数文件还要包含timer的库函数文件

红外遥控接收模块

硬件连接

VCC——3.3V

IO——PB10(外部中断)

软件配置
CubeMx

        下降沿模式、上拉 输入、别忘了还要开一个中断

keil5

        最开始我写了一个程序烧入进去没有反应就是因为我没有添加中断的文件( "driver_irq"),还有旋转编码器的文件 

四、代码讲解 

/*	C8T6板子上的LED灯	*/
#include "driver_timer.h"
#include "driver_led.h"/*	OLED显示	*/
#include "driver_lcd.h"/*	RGB的LED显示		*/
#include  "driver_color_led.h"/*	蜂鸣器	*/
#include "driver_passive_buzzer.h"/*	红外遥控模块		*/
#include "driver_ir_receiver.h"
#include "driver_rotary_encoder.h"
/* USER CODE BEGIN Variables */static StackType_t g_pucStackOfLightTask[128];
static StaticTask_t g_TCBofLightTask;
static TaskHandle_t xLightTaskHandle;static StackType_t g_pucStackOfColorTask[128];
static StaticTask_t g_TCBofColorTask;
static TaskHandle_t xColorTaskHandle;/* USER CODE END Variables *//* USER CODE BEGIN RTOS_THREADS *//* add threads, ... *//* 创建任务: 声 */
//  extern void PlayMusic(void *params);
//  ret = xTaskCreate(PlayMusic, "SoundTask", 128, NULL, osPriorityNormal, &xSoundTaskHandle);/* 创建任务: 光 */xLightTaskHandle = xTaskCreateStatic(Led_Test, "LightTask", 128, NULL, osPriorityNormal, g_pucStackOfLightTask, &g_TCBofLightTask);/* 创建任务: 色 */xColorTaskHandle = xTaskCreateStatic(ColorLED_Test, "ColorTask", 128, NULL, osPriorityNormal, g_pucStackOfColorTask, &g_TCBofColorTask);/* USER CODE END RTOS_THREADS *//* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void *argument)
{/* USER CODE BEGIN StartDefaultTask *//* Infinite loop */uint8_t dev, data;int len;int bRunning;TaskHandle_t xSoundTaskHandle = NULL;BaseType_t ret;LCD_Init();LCD_Clear();IRReceiver_Init();LCD_PrintString(0, 0, "Waiting control");while (1){/* 读取红外遥控器 */if (0 == IRReceiver_Read(&dev, &data)){		if (data == 0xa8) /* play */{/* 创建播放音乐的任务 */extern void PlayMusic(void *params);if (xSoundTaskHandle == NULL){LCD_ClearLine(0, 0);LCD_PrintString(0, 0, "Create Task");ret = xTaskCreate(PlayMusic, "SoundTask", 128, NULL, osPriorityNormal+1, &xSoundTaskHandle);bRunning = 1;}else{/* 要么suspend要么resume */if (bRunning==1){LCD_ClearLine(0, 0);LCD_PrintString(0, 0, "Suspend Task");vTaskSuspend(xSoundTaskHandle);PassiveBuzzer_Control(0); /*如果不加这一步停止蜂鸣器的话,那么蜂鸣器播放音乐会被暂停但是保持在同一音调 */bRunning = 0;}else{LCD_ClearLine(0, 0);LCD_PrintString(0, 0, "Resume Task");vTaskResume(xSoundTaskHandle);bRunning = 1;}}}else if (data == 0xa2) /* power */{/* 删除播放音乐的任务 */if (xSoundTaskHandle != NULL){LCD_ClearLine(0, 0);LCD_PrintString(0, 0, "Delete Task");vTaskDelete(xSoundTaskHandle);PassiveBuzzer_Control(0); /* 停止蜂鸣器 */xSoundTaskHandle = NULL;}}}}/* USER CODE END StartDefaultTask */
}

注意: 

在 C 和 C++ 中,bRunning 通常被定义为 bool 类型。对于 bool 类型而言:

当 bRunning 为 true 时,在条件判断里其本质等价于整数 1。
当 bRunning 为 false 时,在条件判断里其本质等价于整数 0。

      

在上述代码中,当 bRunning 为 true 时,if 条件判断通过;为 false 时,!bRunning 条件判断通过。

不过在 C 和 C++ 里,非 bool 类型的值也能用于条件判断。例如整数,非零值会被视为 true,零值会被视为 false。

        所以一般的if(bRunning)里面就相当于if(bRunning==1);

相关文章:

07_任务状态——改进播放控制

一、声明 在05和06的程序里面可以达到的一个效果就是很完美的播放音乐,并且不会影响到其它任务的运行,但是这个代码有一个弊端就是要么创建任务从头开始播放要么就直接删除任务。 我们现在的程序就增加了音乐的暂停和恢复的功能,那么能够达到…...

【R语言】apply函数族

在R语言中使用循环操作时是使用自身来实现的,效率较低。所以R语言有一个符合其统计语言出身的特点:向量化。R语言中的向量化运用了底层的C语言,而C语言的效率比高层的R语言的效率高。 apply函数族主要是为了解决数据向量化运算的问题&#x…...

Retrieval-Augmented Generation,检索增强生成流程

RAG流程 用户输入接收 系统接收用户输入的查询问题或文本内容,例如“李白有哪些著名的作品?”用户输入可以通过自然语言处理(NLP)模型的输入端口或用户交互界面(如聊天应用、搜索引擎输入框等)接收。 查询…...

[AI][本地部署]离线升级后报ChromeDb错误

【背景】 升级了OpenWebUI,在离线环境下补足了很多需要的Package后终于成功启动了Backend的服务,但是一旦上传文件,就会报ChromaDb错误,少了Collection这一列云云。 【分析】 两个环境ChromaDb的版本不同,所以怀疑是…...

Pinocchio: 刚体动力学算法库介绍

Pinocchio 是一个高性能的开源刚体动力学计算库,广泛应用于机器人学研究与开发。它主要致力于提供高效、精确的运动学和动力学算法,实现机器人模型的建模、前向运动学、反向动力学、力动力学计算等功能。下面将详细介绍该库的一些关键特点和应用场景。 基…...

电商平台的设计与实现(代码+数据库+LW)

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统商品交易信息管理难度大,容错率低&#xff0…...

c#对接deepseek 聊天AI接口

注意:不是免费 对接文档:对话补全 | DeepSeek API Docs 注册地址:DeepSeek 申请key 在线请求示例 apifox deepseek - deepseek...

Node.js中http模块(二)

一、http模块 http 模块是 Node.js 官方提供的、用来创建 web 服务器的模块。通过 http 模块提供的 http.createServer0) 方法,就能方便的把一台普通的电脑,变成一台 Web 服务器,从而对外提供 Web 资源服务。 二、域名和域名服务器 尽管 I…...

主流顶级域名服务商ZDNS连续十余年跟进国际顶级域名政策制定

顶级域名(TLD,Top-Level Domain)是域名层次结构中的最高层,位于域名最后一段,也即最右边的点(.)之后的字符。品牌顶级域名是顶级域名的一种,以品牌相关名称命名,由品牌所属企业申请、运营、并自由分配二级域名,能够直接反映企业或品牌的形象和特色,如.citic、.中信、.baidu、.联…...

低至3折,百度智能云千帆宣布全面支持DeepSeek-R1/V3调用

DeepSeek-R1和 DeepSeek-V3模型已在百度智能云千帆平台上架 。 出品|产业家 新年伊始,百度智能云又传来新动作 。 2月3日百度智能云宣布, DeepSeek-R1和 DeepSeek-V3模型已在百度智能云千帆平台上架,同步推出超低价格方案,并…...

解释一下数据库中的事务隔离级别,在 Java 中如何通过 JDBC设置事务隔离级别?

数据库中的事务隔离级别是用于控制并发事务之间相互影响的一种机制。 它定义了事务之间的可见性和影响范围,常见的隔离级别包括: 读未提交(Read Uncommitted):最低的隔离级别,事务中的修改即使没有提交也…...

【自动化测试】使用Python selenium类库模拟手人工操作网页

使用Python selenium类库模拟手人工操作网页 背景准备工作安装Python版本安装selenium类库下载selenium驱动配置本地环境变量 自动化脚本输出页面表单自动化填充相关代码 背景 待操作网页必须使用IE浏览器登录访问用户本地只有edge浏览器,通过edge浏览器IE模式访问…...

【Apache Paimon】-- 15 -- 利用 paimon-flink-action 同步 postgresql 表数据

利用 Paimon Schema Evolution 核心特性同步变更的 postgresql 表结构和数据 1、背景信息 在Paimon 诞生以前,若 mysql/pg 等数据源的表结构发生变化时,我们有几种处理方式 (1)人工消息通知,然后手动同步到数据仓库中(2)使用 flink 消费 DDL binlog ,然后自动更新 Hi…...

PostgreSql-COALESCE函数、NULLIF函数、NVL函数使用

COALESCE函数 COALESCE函数是返回参数中的第一个非null的值,它要求参数中至少有一个是非null的; select coalesce(1,null,2),coalesce(null,2,1),coalesce(null,null,null); NULLIF(ex1,ex2)函数 如果ex1与ex2相等则返回Null,不相等返回第一个表达式的值…...

springboot+vue导入ruoyi项目的框架

一、介绍 RuoYi-Vue版本,采用了前后端分离的单体架构设计软件环境:JDK、Mysql、Redis、Maven、Node技术选型: Spring Boot、Spring Security、MyBatis、Jwt、Vue3、Element-Plus官方地址: https://gitee.com/y_project/RuoYi-Vue 官方推荐的版本如下&a…...

金蛇祈福,鸿运开年!广州白云皮具城2025开市大吉!

锣鼓一响,黄金万两!2月6日大年初九,广州白云皮具城举行盛大的醒狮开市仪式!象征吉祥如意的醒狮,将好运、财运传递给全体商户和八方来客。 醒狮点睛 金鼓一响黄金万两,十头醒狮登台,董事总经理刘…...

DeepSeek本地化部署

文章目录 前言一、主机配置二、工具下载Ollama下载安装退出Ollama下载DeepSeek R1模型下载安装ChatBox实现可视化交互ChatBox设置模型 前言 最近的国产大模型DeepSeek横空出事,笔者也关注了下。网页版的免费而且推理速度很快,重量级的是它把自己详细的推…...

MoviePy,利用Python自动剪辑tiktok视频

Python剪辑视频是非常强大的,而且能流水线批量操作,可以使用MoviePy库实现。 最近看到一个Github项目,作者利用Python写了一个自动生成tiktok视频的脚本,受到热捧。 现在像抖音、tiktok上有很多流水线生产的视频,不少…...

ubuntu20.04+RTX4060Ti大模型环境安装

装显卡驱动 这里是重点,因为我是跑深度学习的,要用CUDA,所以必须得装官方的驱动,Ubuntu的附件驱动可能不太行. 进入官网https://www.nvidia.cn/geforce/drivers/,选择类型,最新版本下载。 挨个运行&#…...

2024~2025学年佛山市普通高中教学质量检测(一)【高三数学】

一、选择题 本题共8小题&#xff0c;每小题5分&#xff0c;共40分。在每小题给出的四个选项中。只有一项是符合题目要求的。 1、若 5 z 2 i 1 \frac{5}{z}2i1 z5​2i1&#xff0c;则 z z z A. 1-2i B. 12i C. 2-i D. 2i2、已知集合 A { x ∣ 1 < x < a } A\left\{…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...