Berbagi teknologi

Gunakan pengatur waktu untuk menghilangkan jitter

2024-07-12

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

Pertanyaan: Mode operasi apa yang termasuk dalam interupsi pengatur waktu dan interupsi kunci, apakah mereka melakukan polling?

Bagaimana cara mengimplementasikannya secara spesifik

Interupsi pengatur waktu (penilaian) interupsi kunci parameter waktu (modifikasi)

File .s tabel vektor interupsi

        DCD     SysTick_Handler            ; SysTick Handler

Timer terkait dalam file interupsi
stm32f1xx_id.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. }

utama.c

Waktu jarum jam dan waktu jam

struktur pengatur waktuFungsi yang berisi nilai hitungan waktu dan proses

didalam sistemfungsi penanganan jamTambahkan fungsi pemeriksaan jam, dan pernyataan if di check_timer membatasi waktu penunjuk menjadi kurang dari atau sama dengan waktu jam.

Jika terputus, lewatiInterupsi fungsi panggilan balikTambahkan 10ms ke waktu penunjuk Anda sendiri,Jika gangguan lain terjadi selama periode ini, waktu penunjuk akan bertambah 10.

Jika tidak ada interupsi yang terjadi atau interupsi terjadi dalam (n*10) ms, kondisi untuk memasukkan isi fungsi if di check_timer tidak terpenuhi;

Masukkan isi fungsi if hingga tidak ada jitter.Memanggil fungsi dalam struktur melalui fungsi timer dan fungsi check_timer,membuatHitung nilaiMeningkatkan

  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_id.c

DCD EXTI15_10_IRQHandler ; EXTI Baris 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 

Sumber pengolahan data, terjadi gangguan

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