tim.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. #include "stm32f0xx_hal.h"
  2. #include "tim.h"
  3. #include "led.h"
  4. #include "button.h"
  5. #include "logic.h"
  6. TIM_HandleTypeDef Tim16Handle;
  7. TIM_HandleTypeDef Tim17Handle;
  8. extern uint16_t freq_voltage;
  9. // TIM17 - индикация нажатия курка
  10. // TIM16 - отвечает за частоту срабатывания строки
  11. void tim_init(void)
  12. {
  13. __HAL_RCC_TIM16_CLK_ENABLE();
  14. __HAL_RCC_TIM17_CLK_ENABLE();
  15. Tim16Handle.Instance = TIM16;
  16. Tim16Handle.Init.Period = 1000 - 1;
  17. Tim16Handle.Init.Prescaler = 48000 - 1;
  18. Tim16Handle.Init.ClockDivision = 0;
  19. Tim16Handle.Init.CounterMode = TIM_COUNTERMODE_UP;
  20. Tim16Handle.Init.RepetitionCounter = 0;
  21. Tim16Handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  22. HAL_TIM_Base_Init(&Tim16Handle);
  23. HAL_NVIC_SetPriority(TIM16_IRQn, 2, 0);
  24. HAL_NVIC_EnableIRQ(TIM16_IRQn);
  25. HAL_TIM_Base_Start_IT(&Tim16Handle);
  26. Tim17Handle.Instance = TIM17;
  27. Tim17Handle.Init.Period = 1000 - 1;
  28. Tim17Handle.Init.Prescaler = 48000 - 1;
  29. Tim17Handle.Init.ClockDivision = 0;
  30. Tim17Handle.Init.CounterMode = TIM_COUNTERMODE_UP;
  31. Tim17Handle.Init.RepetitionCounter = 0;
  32. Tim17Handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; //TIM_AUTORELOAD_PRELOAD_DISABLE;
  33. HAL_TIM_Base_Init(&Tim17Handle);
  34. HAL_NVIC_SetPriority(TIM17_IRQn, 2, 0);
  35. HAL_NVIC_EnableIRQ(TIM17_IRQn);
  36. //HAL_TIM_Base_Start_IT(&Tim17Handle);
  37. }
  38. //
  39. void tim_set_string_timer(bool state)
  40. {
  41. if (state) {
  42. TIM17->CNT = 0;
  43. HAL_TIM_Base_Start_IT(&Tim17Handle);
  44. }
  45. else {
  46. HAL_TIM_Base_Stop_IT(&Tim17Handle);
  47. }
  48. }
  49. //
  50. void tim_set_string_freq(void)
  51. {
  52. TIM16->PSC = 11.707*(float)freq_voltage + 47;
  53. TIM17->PSC = 11.707*(float)freq_voltage + 47;
  54. }
  55. //
  56. void tim_signal_start(void)
  57. {
  58. __HAL_TIM_CLEAR_IT(&Tim17Handle, TIM_IT_UPDATE);
  59. HAL_TIM_Base_Start_IT(&Tim17Handle);
  60. }
  61. //
  62. void tim_inf_set_time(uint16_t time)
  63. {
  64. __HAL_TIM_CLEAR_IT(&Tim16Handle, TIM_IT_UPDATE);
  65. TIM16->ARR = time;
  66. HAL_TIM_Base_Start_IT(&Tim16Handle);
  67. }
  68. //
  69. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  70. {
  71. static bool warmup = false;
  72. if (htim->Instance == TIM16)
  73. {
  74. if (but_is_string()) {
  75. led_freq_toggle();
  76. }
  77. }
  78. else if (htim->Instance == TIM17)
  79. {
  80. if (warmup) {
  81. logic_string_next();
  82. }
  83. else {
  84. warmup = true;
  85. HAL_TIM_Base_Stop_IT(&Tim17Handle);
  86. }
  87. }
  88. }
  89. // Сразу после настройки таймера TIM17 делаем разовое срабатывание
  90. void tim_warmup(void)
  91. {
  92. TIM17->PSC = 47;
  93. tim_set_string_timer(true);
  94. }
  95. //
  96. void TIM16_IRQHandler(void)
  97. {
  98. HAL_TIM_IRQHandler(&Tim16Handle);
  99. }
  100. //
  101. void TIM17_IRQHandler(void)
  102. {
  103. HAL_TIM_IRQHandler(&Tim17Handle);
  104. }