τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Διακοπή χρονοδιακόπτη (κρίση) χρονική παράμετρος διακοπή κλειδιού (τροποποίηση)
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;
- }
Η ώρα του χεριού και η ώρα του ρολογιού
Δομή pTimerΣυνάρτηση που περιέχει τιμές μέτρησης χρόνου και διεργασιών
μέσα στο σύστημαλειτουργία χειρισμού ρολογιούΠροσθέστε μια συνάρτηση ελέγχου ρολογιού και η δήλωση if στο check_timer περιορίζει τον χρόνο του δείκτη να είναι μικρότερος ή ίσος με τον χρόνο του ρολογιού.
Εάν διακοπεί, περάστεΔιακοπή λειτουργίας επανάκλησηςΠροσθέστε 10 ms στον χρόνο του δικού σας δείκτη,Εάν συμβεί άλλη διακοπή κατά τη διάρκεια αυτής της περιόδου, ο χρόνος του δείκτη θα αυξηθεί κατά 10.
Όταν δεν υπάρχει διακοπή ή η διακοπή συμβαίνει εντός (n*10) ms, δεν πληρούνται οι προϋποθέσεις για την εισαγωγή του σώματος της λειτουργίας if στο check_timer.
Εισαγάγετε το σώμα της συνάρτησης if μέχρι να μην υπάρχει jitter.Κλήση συναρτήσεων στη δομή μέσω της λειτουργίας χρονοδιακόπτη και της λειτουργίας 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);
-
- }
-
- }
DCD EXTI15_10_IRQHandler ; 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 */
- }
Πηγή επεξεργασίας δεδομένων, εμφανίζεται διακοπή
- 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);
- }
- }