기술나눔

타이머를 사용하여 지터 제거

2024-07-12

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

질문: 타이머 인터럽트와 키 인터럽트는 어떤 작동 모드에 속합니까? 폴링합니까?

구체적으로 구현하는 방법

타이머 인터럽트(판정) 시간 매개변수 키 인터럽트(수정)

인터럽트 벡터 테이블 .s 파일

        DCD     SysTick_Handler            ; SysTick Handler

인터럽트 파일에 관련된 타이머
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. }

메인.c

바늘 시간과 시계 시간

pTimer 구조시간 및 프로세스 카운트 값을 포함하는 함수

시스템에서시계 처리 기능시계 확인 기능을 추가하고 check_timer의 if 문은 포인터 시간을 시계 시간보다 작거나 같도록 제한합니다.

중단되면 통과인터럽트 콜백 함수자신의 포인터 시간에 10ms를 추가합니다.이 기간 동안 또 다른 중단이 발생하면 포인터 시간이 10씩 증가합니다.

중단이 발생하지 않거나 (n*10) ms 내에 중단이 발생하면 check_timer에 if 함수 본문을 입력하기 위한 조건이 충족되지 않습니다.

지터가 없어질 때까지 if 함수 본문을 입력합니다.타이머 함수와 check_timer 함수를 통해 구조체 내 함수 호출,만들다카운트 값증가하다

  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_IRQ핸들러; 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 

데이터 처리 소스, 중단 발생

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