定时器的使用步骤:
1、定义一个handle,xTimerCreate创建。2、启动定时器
在Task1中调用
通过队列通知守护任务来执行定时器任务,要再config头文件中定义守护任务相关配置。
虽然定时器是在task1中启动,但是定时器的任务是在回调函数中里面执行,不是在中断中执行任务。
这些创建、复位等函数都是通过往队列中写入数据,再在回调函数中处理。
3、运行现象
task1在执行过程中,到设定时间就会被打断而执行回调函数中的任务。
注意:定时器的优先级最多取到
定时器消抖
当按键按下,触发中断
void KeyIntInit(void)
{
EXTI_InitTypeDef EXTI_InitStructure;//定义初始化结构体
NVIC_InitTypeDef NVIC_InitStructure;//定义结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); /* 使能AFIO复用时钟 */
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); /* 将GPIO口与中断线映射起来 */
EXTI_InitStructure.EXTI_Line=EXTI_Line0; // 中断线
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; // 双边沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); // 初始化
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel; //使能外部中断所在的通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 使能外部中断通道
NVIC_Init(&NVIC_InitStructure); // 初始化
}
创建的定时器是一次性的,执行一次再次执行要通过中断中的Reset函数来复位。
进入中断函数 ,通过xTimerReset()复位定时器,定时器延时为2s,时间到再去回调任务中执行任务。
每按下一次按键,进入一次中断,定时器复位
实验现象:一直按按键就一直进入中断复位定时器,延时回调函数的执行。只有在定时器时间到了才会进入回调函数处理按键状态。