api-hal-interrupt.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #include "api-hal-interrupt.h"
  2. #include <furi.h>
  3. #include <main.h>
  4. #include <stm32wbxx_ll_tim.h>
  5. volatile ApiHalInterruptISR api_hal_tim_tim2_isr = NULL;
  6. #define API_HAL_INTERRUPT_DMA_COUNT 2
  7. #define API_HAL_INTERRUPT_DMA_CHANNELS_COUNT 8
  8. volatile ApiHalInterruptISR api_hal_dma_channel_isr[API_HAL_INTERRUPT_DMA_COUNT][API_HAL_INTERRUPT_DMA_CHANNELS_COUNT] = {0};
  9. void api_hal_interrupt_init() {
  10. NVIC_SetPriority(DMA1_Channel1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 5, 0));
  11. NVIC_EnableIRQ(DMA1_Channel1_IRQn);
  12. FURI_LOG_I("FuriHalInterrupt", "Init OK");
  13. }
  14. void api_hal_interrupt_set_timer_isr(TIM_TypeDef* timer, ApiHalInterruptISR isr) {
  15. if (timer == TIM2) {
  16. if (isr) {
  17. furi_assert(api_hal_tim_tim2_isr == NULL);
  18. } else {
  19. furi_assert(api_hal_tim_tim2_isr != NULL);
  20. }
  21. api_hal_tim_tim2_isr = isr;
  22. } else {
  23. furi_check(0);
  24. }
  25. }
  26. void api_hal_interrupt_set_dma_channel_isr(DMA_TypeDef* dma, uint32_t channel, ApiHalInterruptISR isr) {
  27. --channel; // Pascal
  28. furi_check(dma);
  29. furi_check(channel < API_HAL_INTERRUPT_DMA_CHANNELS_COUNT);
  30. if (dma == DMA1) {
  31. api_hal_dma_channel_isr[0][channel] = isr;
  32. } else if (dma == DMA1) {
  33. api_hal_dma_channel_isr[1][channel] = isr;
  34. } else {
  35. furi_check(0);
  36. }
  37. }
  38. extern void api_interrupt_call(InterruptType type, void* hw);
  39. /* ST HAL symbols */
  40. /* Comparator trigger event */
  41. void HAL_COMP_TriggerCallback(COMP_HandleTypeDef* hcomp) {
  42. api_interrupt_call(InterruptTypeComparatorTrigger, hcomp);
  43. }
  44. /* Timer update event */
  45. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim) {
  46. api_interrupt_call(InterruptTypeTimerUpdate, htim);
  47. }
  48. /* Timer 2 */
  49. void TIM2_IRQHandler(void) {
  50. if (api_hal_tim_tim2_isr) {
  51. api_hal_tim_tim2_isr();
  52. } else {
  53. HAL_TIM_IRQHandler(&htim2);
  54. }
  55. }
  56. /* DMA 1 */
  57. void DMA1_Channel1_IRQHandler(void) {
  58. if (api_hal_dma_channel_isr[0][0]) api_hal_dma_channel_isr[0][0]();
  59. }
  60. void DMA1_Channel2_IRQHandler(void) {
  61. if (api_hal_dma_channel_isr[0][1]) api_hal_dma_channel_isr[0][1]();
  62. }
  63. void DMA1_Channel3_IRQHandler(void) {
  64. if (api_hal_dma_channel_isr[0][2]) api_hal_dma_channel_isr[0][2]();
  65. }
  66. void DMA1_Channel4_IRQHandler(void) {
  67. if (api_hal_dma_channel_isr[0][3]) api_hal_dma_channel_isr[0][3]();
  68. }
  69. void DMA1_Channel5_IRQHandler(void) {
  70. if (api_hal_dma_channel_isr[0][4]) api_hal_dma_channel_isr[0][4]();
  71. }
  72. void DMA1_Channel6_IRQHandler(void) {
  73. if (api_hal_dma_channel_isr[0][5]) api_hal_dma_channel_isr[0][5]();
  74. }
  75. void DMA1_Channel7_IRQHandler(void) {
  76. if (api_hal_dma_channel_isr[0][6]) api_hal_dma_channel_isr[0][6]();
  77. }
  78. void DMA1_Channel8_IRQHandler(void) {
  79. if (api_hal_dma_channel_isr[0][7]) api_hal_dma_channel_isr[0][7]();
  80. }
  81. /* DMA 2 */
  82. void DMA2_Channel1_IRQHandler(void) {
  83. if (api_hal_dma_channel_isr[1][0]) api_hal_dma_channel_isr[1][0]();
  84. }
  85. void DMA2_Channel2_IRQHandler(void) {
  86. if (api_hal_dma_channel_isr[1][1]) api_hal_dma_channel_isr[1][1]();
  87. }
  88. void DMA2_Channel3_IRQHandler(void) {
  89. if (api_hal_dma_channel_isr[1][2]) api_hal_dma_channel_isr[1][2]();
  90. }
  91. void DMA2_Channel4_IRQHandler(void) {
  92. if (api_hal_dma_channel_isr[1][3]) api_hal_dma_channel_isr[1][3]();
  93. }
  94. void DMA2_Channel5_IRQHandler(void) {
  95. if (api_hal_dma_channel_isr[1][4]) api_hal_dma_channel_isr[1][4]();
  96. }
  97. void DMA2_Channel6_IRQHandler(void) {
  98. if (api_hal_dma_channel_isr[1][5]) api_hal_dma_channel_isr[1][5]();
  99. }
  100. void DMA2_Channel7_IRQHandler(void) {
  101. if (api_hal_dma_channel_isr[1][6]) api_hal_dma_channel_isr[1][6]();
  102. }
  103. void DMA2_Channel8_IRQHandler(void) {
  104. if (api_hal_dma_channel_isr[1][7]) api_hal_dma_channel_isr[1][7]();
  105. }