問題:定時器中斷和按鍵中斷屬于什么操作模式,輪詢嗎?
具體怎么實現
定時器中斷? (判斷)? ? ? ? 時間參數? ? ? ? ? ?按鍵中斷(修改)
中斷 向量表.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);}
}