Condivisione della tecnologia

Utilizza i timer per eliminare il jitter

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Domanda: A quale modalità operativa appartengono gli allarmi del timer e gli allarmi dei tasti? Sono polling?

Come implementarlo nello specifico

Interruzione del timer (giudizio) Interruzione del tasto del parametro temporale (modifica)

File .s della tabella vettoriale di interruzione

        DCD     SysTick_Handler            ; SysTick Handler

Temporizzatore relativo nel file di interruzione
stm32f1xx_it.c

  1. void SysTick_Handler(void)
  2. {
  3. HAL_IncTick();//增加计数值,
  4. extern void check_timer(void);
  5. check_timer();
  6. }

stm32f1xxx_hal.c

  1. __weak void HAL_IncTick(void)
  2. {
  3. uwTick += uwTickFreq;
  4. }
  5. __weak uint32_t HAL_GetTick(void)
  6. {
  7. return uwTick;
  8. }

principale.c

Orario della lancetta e ora dell'orologio

Struttura del pTimerFunzione contenente valori di conteggio del tempo e del processo

nel sistemafunzione di gestione dell'orologioAggiungi una funzione di controllo dell'orologio e l'istruzione if in check_timer limita il tempo del puntatore a essere inferiore o uguale all'ora dell'orologio.

Se interrotto, passaFunzione di richiamata di interruzioneAggiungi 10ms al tempo del tuo puntatore,Se durante questo periodo si verifica un'altra interruzione, il tempo del puntatore verrà aumentato di 10.

Quando non si verifica alcuna interruzione o l'interruzione avviene entro (n*10) ms, le condizioni per inserire il corpo della funzione if in check_timer non sono soddisfatte;

Immettere il corpo della funzione if finché non si verifica più jitter.Chiamare le funzioni nella struttura tramite la funzione timer e la funzione check_timer,FareContare il valoreAumento

  1. struct soft_timer {
  2. uint32_t timeout;
  3. void * args;
  4. void (*func)(void *);
  5. };
  6. int g_key_cnt = 0;
  7. void key_timeout_func(void *args);
  8. struct soft_timer key_timer = {~0, NULL, key_timeout_func};
  9. void key_timeout_func(void *args)
  10. {
  11. g_key_cnt++;
  12. key_timer.timeout = ~0;
  13. }
  14. void mod_timer(struct soft_timer *pTimer, uint32_t timeout)
  15. {
  16. pTimer->timeout = HAL_GetTick() + timeout;
  17. }
  18. void check_timer(void)
  19. {
  20. if (key_timer.timeout <= HAL_GetTick())
  21. {
  22. key_timer.func(key_timer.args);
  23. }
  24. }
  25. 、、数据处理的源头,发生中断
  26. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  27. {
  28. if (GPIO_Pin == GPIO_PIN_14)
  29. {
  30. mod_timer(&key_timer, 10);
  31. }
  32. }
  1. int main(){
  2. OLED_Init();
  3. OLED_Clear();
  4. OLED_PrintString(0, 4, "Key ISR cnt = ");
  5. while (1)
  6. {
  7. OLED_PrintSignedVal(0, 6, g_key_cnt);
  8. }
  9. }

stm32f1xx_it.c

DCD EXTI15_10_IRQHandler; Linea EXTI 15..10

  1. void EXTI15_10_IRQHandler(void)
  2. {
  3. /* USER CODE BEGIN EXTI15_10_IRQn 0 */
  4. /* USER CODE END EXTI15_10_IRQn 0 */
  5. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);
  6. /* USER CODE BEGIN EXTI15_10_IRQn 1 */
  7. /* USER CODE END EXTI15_10_IRQn 1 */
  8. }

stm32f1xxx_hal_gpio.c 

Fonte del trattamento dei dati, si verifica l'interruzione

  1. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
  2. {
  3. /* EXTI line interrupt detected */
  4. if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u)
  5. {
  6. __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
  7. HAL_GPIO_EXTI_Callback(GPIO_Pin);
  8. }
  9. }