问题:定时器中断和按键中断属于什么操作模式,轮询吗?
具体怎么实现
定时器中断 (判断) 时间参数 按键中断(修改)
中断 向量表.s文件
DCD SysTick_Handler ; SysTick Handler
中断文件中定时器相关的
stm32f1xx_it.c
void SysTick_Handler(void)
{HAL_IncTick();//增加计数值,extern void check_timer(void);check_timer();}
stm32f1xxx_hal.c
__weak void HAL_IncTick(void)
{uwTick += uwTickFreq;
}__weak uint32_t HAL_GetTick(void)
{return uwTick;
}
main.c
指针的时间和时钟的时间
pTimer结构体包含时间和处理计数值的函数
在系统的时钟处理函数处加上时钟检查函数,check_timer中的if语句限制 指针时间小于等于时钟时间
如果中断,通过中断回调函数让自己指针的时间加10ms,期间若又发生中断,指针时间再加10,
当未发生中断或者中断(n*10)ms内,都不满足进入check_timer中的if函数体的条件;
直至没有抖动时候进入if函数体中,通过定时器函数和check_timer函数调用结构体中的函数,使计数值增加
struct soft_timer {uint32_t timeout;void * args;void (*func)(void *);
};int g_key_cnt = 0;void key_timeout_func(void *args);
struct soft_timer key_timer = {~0, NULL, key_timeout_func};
void key_timeout_func(void *args)
{g_key_cnt++;key_timer.timeout = ~0;
}void mod_timer(struct soft_timer *pTimer, uint32_t timeout)
{pTimer->timeout = HAL_GetTick() + timeout;
}void check_timer(void)
{if (key_timer.timeout <= HAL_GetTick()){key_timer.func(key_timer.args);}
}、、数据处理的源头,发生中断
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if (GPIO_Pin == GPIO_PIN_14){ mod_timer(&key_timer, 10);}
}
int main(){OLED_Init(); OLED_Clear(); OLED_PrintString(0, 4, "Key ISR cnt = ");while (1){OLED_PrintSignedVal(0, 6, g_key_cnt);}}
stm32f1xx_it.c
DCD EXTI15_10_IRQHandler ; EXTI Line 15..10
void EXTI15_10_IRQHandler(void)
{/* USER CODE BEGIN EXTI15_10_IRQn 0 *//* USER CODE END EXTI15_10_IRQn 0 */HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);/* USER CODE BEGIN EXTI15_10_IRQn 1 *//* USER CODE END EXTI15_10_IRQn 1 */
}
stm32f1xxx_hal_gpio.c
数据处理的源头,发生中断
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{/* EXTI line interrupt detected */if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u){__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);HAL_GPIO_EXTI_Callback(GPIO_Pin);}
}