clock_timer.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #include "clock_timer.h"
  2. #include <stdlib.h>
  3. #include <furi_hal_interrupt.h>
  4. #include <furi_hal_bus.h>
  5. #include <stm32wbxx_ll_tim.h>
  6. #define FURI_HAL_CLOCK_TIMER TIM2
  7. #define FURI_HAL_CLOCK_TIMER_BUS FuriHalBusTIM2
  8. #define FURI_HAL_CLOCK_TIMER_IRQ FuriHalInterruptIdTIM2
  9. typedef struct {
  10. ClockTimerCallback callback;
  11. void* context;
  12. } ClockTimer;
  13. static ClockTimer clock_timer = {
  14. .callback = NULL,
  15. .context = NULL,
  16. };
  17. static void clock_timer_isr(void* context) {
  18. if(clock_timer.callback) {
  19. clock_timer.callback(context);
  20. }
  21. LL_TIM_ClearFlag_UPDATE(FURI_HAL_CLOCK_TIMER);
  22. }
  23. void clock_timer_init(ClockTimerCallback callback, void* context, float period) {
  24. clock_timer.callback = callback;
  25. clock_timer.context = context;
  26. furi_hal_bus_enable(FURI_HAL_CLOCK_TIMER_BUS);
  27. // init timer to produce interrupts
  28. LL_TIM_InitTypeDef TIM_InitStruct = {0};
  29. TIM_InitStruct.Autoreload = (SystemCoreClock / period) - 1;
  30. LL_TIM_Init(FURI_HAL_CLOCK_TIMER, &TIM_InitStruct);
  31. furi_hal_interrupt_set_isr(FURI_HAL_CLOCK_TIMER_IRQ, clock_timer_isr, clock_timer.context);
  32. }
  33. void clock_timer_start(void) {
  34. LL_TIM_EnableIT_UPDATE(FURI_HAL_CLOCK_TIMER);
  35. LL_TIM_EnableCounter(FURI_HAL_CLOCK_TIMER);
  36. }
  37. void clock_timer_stop(void) {
  38. LL_TIM_DisableIT_UPDATE(FURI_HAL_CLOCK_TIMER);
  39. LL_TIM_DisableCounter(FURI_HAL_CLOCK_TIMER);
  40. }
  41. void clock_timer_deinit(void) {
  42. furi_hal_bus_disable(FURI_HAL_CLOCK_TIMER_BUS);
  43. furi_hal_interrupt_set_isr(FURI_HAL_CLOCK_TIMER_IRQ, NULL, NULL);
  44. }