api-hal-interrupt.c 3.6 KB

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