2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Interruption de minuterie (jugement) Interruption de touche de paramètre de temps (modification)
DCD SysTick_Handler ; SysTick Handler
- void SysTick_Handler(void)
- {
-
- HAL_IncTick();//增加计数值,
-
- extern void check_timer(void);
- check_timer();
-
- }
- __weak void HAL_IncTick(void)
- {
- uwTick += uwTickFreq;
- }
-
- __weak uint32_t HAL_GetTick(void)
- {
- return uwTick;
- }
Heure des aiguilles et heure de l'horloge
Structure du minuteurFonction contenant des valeurs de temps et de nombre de processus
dans le systèmefonction de gestion de l'horlogeAjoutez une fonction de vérification de l'horloge et l'instruction if dans check_timer limite l'heure du pointeur à une valeur inférieure ou égale à l'heure de l'horloge.
En cas d'interruption, passezFonction de rappel d'interruptionAjoutez 10 ms au temps de votre propre pointeur,Si une autre interruption survient pendant cette période, le temps du pointeur sera augmenté de 10.
Lorsqu'aucune interruption ne se produit ou que l'interruption se produit dans un délai de (n*10) ms, les conditions d'entrée du corps de la fonction if dans check_timer ne sont pas remplies ;
Entrez le corps de la fonction if jusqu'à ce qu'il n'y ait plus de gigue.Appeler des fonctions dans la structure via la fonction timer et la fonction check_timer,faireValeur de comptageAugmenter
- 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);
-
- }
-
- }
Gestionnaire d'IRQ DCD EXTI15_10 ; Ligne EXTI 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 */
- }
Source du traitement des données, une interruption se produit
- 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);
- }
- }