Technologieaustausch

Verwenden Sie Timer, um Jitter zu vermeiden

2024-07-12

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

Frage: Zu welcher Betriebsart gehören Timer-Interrupts und Tasten-Interrupts, rufen sie ab?

Wie man es konkret umsetzt

Timer-Interrupt (Beurteilung) Zeitparameter-Tasten-Interrupt (Änderung)

Unterbrechen Sie die .s-Datei der Vektortabelle

        DCD     SysTick_Handler            ; SysTick Handler

Timer bezogen auf die Interrupt-Datei
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. }

Haupt c

Zeigerzeit und Uhrzeit

pTimer-StrukturFunktion, die Zeit- und Prozesszählwerte enthält

Im SystemUhrhandhabungsfunktionFügen Sie eine Uhrprüffunktion hinzu, und die if-Anweisung in check_timer begrenzt die Zeigerzeit auf weniger als oder gleich der Uhrzeit.

Wenn Sie unterbrochen werden, passen SieCallback-Funktion unterbrechenAddieren Sie 10 ms zur Zeit Ihres eigenen Zeigers.Tritt in diesem Zeitraum eine erneute Unterbrechung auf, wird die Zeigerzeit um 10 erhöht.

Wenn keine Unterbrechung auftritt oder die Unterbrechung innerhalb von (n*10) ms auftritt, sind die Bedingungen für die Eingabe des if-Funktionskörpers in check_timer nicht erfüllt;

Geben Sie den if-Funktionskörper ein, bis kein Jitter mehr auftritt.Rufen Sie Funktionen in der Struktur über die Timer-Funktion und die check_timer-Funktion auf,machenZählwertZunahme

  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; EXTI-Linie 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 

Quelle der Datenverarbeitung, es kommt zu einer Unterbrechung

  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. }