Compartilhamento de tecnologia

Use temporizadores para eliminar o jitter

2024-07-12

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

Pergunta: A que modo de operação pertencem as interrupções de temporizador e de chave?

Como implementá-lo especificamente

Interrupção do temporizador (julgamento) interrupção da chave do parâmetro de tempo (modificação)

Arquivo .s da tabela de vetores de interrupção

        DCD     SysTick_Handler            ; SysTick Handler

Temporizador relacionado no arquivo de interrupção
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. }

principal.c

Hora manual e hora do relógio

Estrutura do pTimerFunção contendo valores de contagem de tempo e processo

no sistemafunção de manipulação de relógioAdicione uma função de verificação de relógio e a instrução if em check_timer limita o tempo do ponteiro para ser menor ou igual ao tempo do relógio.

Se interrompido, passeInterromper função de retorno de chamadaAdicione 10ms ao tempo do seu próprio ponteiro,Se ocorrer outra interrupção durante este período, o tempo do ponteiro será aumentado em 10.

Quando nenhuma interrupção ocorre ou a interrupção ocorre dentro de (n*10) ms, as condições para inserir o corpo da função if em check_timer não são atendidas;

Insira o corpo da função if até que não haja jitter.Chame funções na estrutura por meio da função timer e da função check_timer,fazerValor de contagemAumentar

  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; Linha 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 de processamento de dados, ocorre interrupção

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