Teknologian jakaminen

Käytä ajastimia värinän poistamiseen

2024-07-12

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

Kysymys: Mihin toimintatilaan ajastinkeskeytykset ja näppäinkeskeytykset kuuluvat, pollaavatko ne?

Miten se toteutetaan erityisesti

Ajastinkeskeytys (tuomio) aikaparametrin avainkeskeytys (muokkaus)

Keskeytä vektoritaulukon .s-tiedosto

        DCD     SysTick_Handler            ; SysTick Handler

Ajastin liittyy keskeytystiedostoon
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. }

main.c

Käden aika ja kellon aika

pAjastimen rakenneFunktio, joka sisältää aika- ja prosessilukuarvot

järjestelmässäkellonkäsittelytoimintoLisää kellontarkistustoiminto, ja check_timerin if-lause rajoittaa osoittimen ajan olemaan pienempi tai yhtä suuri kuin kelloaika.

Jos keskeytetään, ohitaKeskeytä takaisinsoittotoimintoLisää 10 ms oman osoittimen aikaan,Jos tänä aikana ilmenee toinen keskeytys, osoittimen aikaa pidennetään 10:llä.

Kun keskeytystä ei tapahdu tai keskeytys tapahtuu (n*10) ms:n sisällä, edellytykset if-funktion runkoon syöttämiselle check_timer-kentässä eivät täyty;

Syötä if-funktion runko, kunnes värinää ei enää esiinny.Kutsu toimii rakenteessa ajastintoiminnon ja check_timer-toiminnon kautta,tehdälaske arvoLisääntyä

  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 Line 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 

Tietojen käsittelyn lähde, keskeytys tapahtuu

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