05_任务的删除
一、声明
参考外部中断的文章(我还没有学过外部中断,第一次用)
https://leung-manwah.blog.csdn.net/article/details/112508465?fromshare=blogdetail&sharetype=blogdetail&sharerId=112508465&sharerefer=PC&sharesource=2301_81764359&sharefrom=from_link
写这篇文章的时候红外遥控器还没到,所以不知道CubeMx的配置是否完全正确,也不知道keil5的代码是否编写正确
二、CubeMx的配置
(1)基础配置
配置时钟
配置调试器
(2)OLED的配置
(3)C8T6板子上LED的配置
可以只开一个GPIO_Output,其它的配置都系统默认配置好了
(4)RGBLED
(5) 红外遥控器配置
(6)蜂鸣器配置
三、keil5代码的编写
(1)头文件的包含
#include "driver_led.h"
#include "driver_lcd.h"
#include "driver_color_led.h"
#include "driver_passive_buzzer.h"
#include "driver_timer.h"
#include "driver_ir_receiver.h"
(2)创建光和色的任务
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;
/* 创建任务: 光 */
xLightTaskHandle = xTaskCreateStatic(Led_Test, "LightTask", 128, NULL, osPriorityNormal, g_pucStackOfLightTask, &g_TCBofLightTask);
/* 创建任务: 色 */
xColorTaskHandle = xTaskCreateStatic(ColorLED_Test, "ColorTask", 128, NULL, osPriorityNormal, g_pucStackOfColorTask, &g_TCBofColorTask);
(3)创建和删除声的任务
不要删除默认任务,因为这个时候需要使用默认任务
void StartDefaultTask(void *argument)
{
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
uint8_t dev,data;
int len;
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,"Creat Task");//打印
ret = xTaskCreate(PlayMusic,"SoundTask",128,NULL,osPriorityNormal,&xSoundTaskHandle);
//因为播放声音已经执行,所以xSoundTaskHandle这个就不等于NULL
}
}
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;
//关掉声音之后让xSoundTaskHandle这个就等于NULL
}
}
}
}
/* USER CODE END StartDefaultTask */
}
四、删除任务的知识点
五、外部中断
首先要找到使用外部中断的引脚,选择 GPIO_EXTIx
这里的 x
是指挂载在中断线几上,如 GPIO_EXTI0 就是挂载在中断线0上
开启下降沿触发中断:即在 按下按键时 电平由高变为低时触发,则在 GPIO mode 中选择 External Interrupt Mode with Falling edge trigger detection
开启上升沿触发中断:即在 按下按键后松开时 电平由低变为高时触发,则在 GPIO mode 中选择 External Interrupt Mode with Rising edge trigger detection
开启下降沿上升沿都触发中断:即在 按下时触发,松开时再次触发,则在 GPIO mode 中选择 External Interrupt Mode with Rising/Falling edge trigger detection
如果硬件上已外部上拉或下拉,则在GPIO Pull-up/Pull-down 中选择 No pull-up and no pull-down 既不上拉也不下拉。
如果硬件外部没有上拉,则在GPIO Pull-up/Pull-down 中选择 Pull-up 内部上拉电阻。
配置 NVIC
中断优先级分组规则 Priority Group 默认为4个比特位,一般情况下不改。
勾选刚刚配置的外部中断线0和13,并配置抢占优先级 Preemption Priority 和响应优先级 Sub Priority。
抢占优先级,数字越小,优先级越高
若抢占优先级相同,判断子优先级,同样,数字越小,优先级越高
HAL_GPIO_EXTI_Callback() 按照官方提示我们应该再次定义该函数,__weak 是一个弱化标识,带有这个的函数就是一个弱化函数,就是你可以在其他地方写一个名称和参数都一模一样的函数,编译器就会忽略这一个函数,而去执行你写的那个函数;而 UNUSED(GPIO_Pin) ,这就是一个防报错的定义,当传进来的GPIO端口号没有做任何处理的时候,编译器也不会报出警告