api-hal-irda.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #include "cmsis_os.h"
  2. #include "api-hal-tim_i.h"
  3. #include "api-hal-irda.h"
  4. #include <stm32wbxx_ll_tim.h>
  5. #include <stm32wbxx_ll_gpio.h>
  6. #include <stdio.h>
  7. #include <furi.h>
  8. #include "main.h"
  9. #include "api-hal-pwm.h"
  10. static struct{
  11. TimerISRCallback callback;
  12. void *ctx;
  13. } timer_irda;
  14. void api_hal_irda_tim_isr(TimerIRQSource source)
  15. {
  16. uint32_t duration = 0;
  17. bool level = 0;
  18. switch (source) {
  19. case TimerIRQSourceCCI1:
  20. duration = LL_TIM_OC_GetCompareCH1(TIM2);
  21. LL_TIM_SetCounter(TIM2, 0);
  22. level = 1;
  23. break;
  24. case TimerIRQSourceCCI2:
  25. duration = LL_TIM_OC_GetCompareCH2(TIM2);
  26. LL_TIM_SetCounter(TIM2, 0);
  27. level = 0;
  28. break;
  29. default:
  30. furi_check(0);
  31. }
  32. if (timer_irda.callback)
  33. timer_irda.callback(timer_irda.ctx, level, duration);
  34. }
  35. void api_hal_irda_rx_irq_init(void)
  36. {
  37. LL_TIM_InitTypeDef TIM_InitStruct = {0};
  38. LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
  39. /* Peripheral clock enable */
  40. LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM2);
  41. LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA);
  42. /**TIM2 GPIO Configuration
  43. PA0 ------> TIM2_CH1
  44. */
  45. GPIO_InitStruct.Pin = LL_GPIO_PIN_0;
  46. GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  47. GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  48. GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  49. GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  50. GPIO_InitStruct.Alternate = LL_GPIO_AF_1;
  51. LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  52. TIM_InitStruct.Prescaler = 64 - 1;
  53. TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
  54. TIM_InitStruct.Autoreload = 0xFFFFFFFF;
  55. TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1;
  56. LL_TIM_Init(TIM2, &TIM_InitStruct);
  57. LL_TIM_SetClockSource(TIM2, LL_TIM_CLOCKSOURCE_INTERNAL);
  58. LL_TIM_EnableARRPreload(TIM2);
  59. LL_TIM_SetTriggerOutput(TIM2, LL_TIM_TRGO_RESET);
  60. LL_TIM_DisableMasterSlaveMode(TIM2);
  61. LL_TIM_IC_SetActiveInput(TIM2, LL_TIM_CHANNEL_CH1, LL_TIM_ACTIVEINPUT_DIRECTTI);
  62. LL_TIM_IC_SetPrescaler(TIM2, LL_TIM_CHANNEL_CH1, LL_TIM_ICPSC_DIV1);
  63. LL_TIM_IC_SetFilter(TIM2, LL_TIM_CHANNEL_CH1, LL_TIM_IC_FILTER_FDIV1);
  64. LL_TIM_IC_SetPolarity(TIM2, LL_TIM_CHANNEL_CH1, LL_TIM_IC_POLARITY_FALLING);
  65. LL_TIM_IC_SetActiveInput(TIM2, LL_TIM_CHANNEL_CH2, LL_TIM_ACTIVEINPUT_INDIRECTTI);
  66. LL_TIM_IC_SetPrescaler(TIM2, LL_TIM_CHANNEL_CH2, LL_TIM_ICPSC_DIV1);
  67. LL_TIM_IC_SetFilter(TIM2, LL_TIM_CHANNEL_CH2, LL_TIM_IC_FILTER_FDIV1);
  68. LL_TIM_IC_SetPolarity(TIM2, LL_TIM_CHANNEL_CH2, LL_TIM_IC_POLARITY_RISING);
  69. LL_TIM_EnableIT_CC1(TIM2);
  70. LL_TIM_EnableIT_CC2(TIM2);
  71. LL_TIM_CC_EnableChannel(TIM2, LL_TIM_CHANNEL_CH1);
  72. LL_TIM_CC_EnableChannel(TIM2, LL_TIM_CHANNEL_CH2);
  73. LL_TIM_SetCounter(TIM2, 0);
  74. LL_TIM_EnableCounter(TIM2);
  75. NVIC_SetPriority(TIM2_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),5, 0));
  76. NVIC_EnableIRQ(TIM2_IRQn);
  77. }
  78. void api_hal_irda_rx_irq_deinit(void) {
  79. LL_TIM_DisableIT_CC1(TIM2);
  80. LL_TIM_DisableIT_CC2(TIM2);
  81. LL_TIM_CC_DisableChannel(TIM2, LL_TIM_CHANNEL_CH1);
  82. LL_TIM_CC_DisableChannel(TIM2, LL_TIM_CHANNEL_CH2);
  83. }
  84. bool api_hal_irda_rx_irq_is_busy(void) {
  85. return (LL_TIM_IsEnabledIT_CC1(TIM2) || LL_TIM_IsEnabledIT_CC2(TIM2));
  86. }
  87. void api_hal_irda_rx_irq_set_callback(TimerISRCallback callback, void *ctx) {
  88. furi_check(callback);
  89. timer_irda.callback = callback;
  90. timer_irda.ctx = ctx;
  91. }
  92. void api_hal_irda_pwm_set(float value, float freq) {
  93. hal_pwmn_set(value, freq, &IRDA_TX_TIM, IRDA_TX_CH);
  94. }
  95. void api_hal_irda_pwm_stop() {
  96. hal_pwmn_stop(&IRDA_TX_TIM, IRDA_TX_CH);
  97. }