clock_timer.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  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_start(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. LL_TIM_EnableIT_UPDATE(FURI_HAL_CLOCK_TIMER);
  33. LL_TIM_EnableCounter(FURI_HAL_CLOCK_TIMER);
  34. }
  35. void clock_timer_stop(void) {
  36. LL_TIM_DisableIT_UPDATE(FURI_HAL_CLOCK_TIMER);
  37. LL_TIM_DisableCounter(FURI_HAL_CLOCK_TIMER);
  38. furi_hal_bus_disable(FURI_HAL_CLOCK_TIMER_BUS);
  39. furi_hal_interrupt_set_isr(FURI_HAL_CLOCK_TIMER_IRQ, NULL, NULL);
  40. }