123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- #include "stm32f0xx_hal.h"
- #include "tim.h"
- #include "led.h"
- #include "button.h"
- #include "logic.h"
- TIM_HandleTypeDef Tim16Handle;
- TIM_HandleTypeDef Tim17Handle;
- extern uint16_t freq_voltage;
- // TIM17 - индикация нажатия курка
- // TIM16 - отвечает за частоту срабатывания строки
- void tim_init(void)
- {
- __HAL_RCC_TIM16_CLK_ENABLE();
- __HAL_RCC_TIM17_CLK_ENABLE();
-
- Tim16Handle.Instance = TIM16;
- Tim16Handle.Init.Period = 1000 - 1;
- Tim16Handle.Init.Prescaler = 48000 - 1;
- Tim16Handle.Init.ClockDivision = 0;
- Tim16Handle.Init.CounterMode = TIM_COUNTERMODE_UP;
- Tim16Handle.Init.RepetitionCounter = 0;
- Tim16Handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
- HAL_TIM_Base_Init(&Tim16Handle);
-
- HAL_NVIC_SetPriority(TIM16_IRQn, 2, 0);
-
- HAL_NVIC_EnableIRQ(TIM16_IRQn);
- HAL_TIM_Base_Start_IT(&Tim16Handle);
-
-
- Tim17Handle.Instance = TIM17;
- Tim17Handle.Init.Period = 1000 - 1;
- Tim17Handle.Init.Prescaler = 48000 - 1;
- Tim17Handle.Init.ClockDivision = 0;
- Tim17Handle.Init.CounterMode = TIM_COUNTERMODE_UP;
- Tim17Handle.Init.RepetitionCounter = 0;
- Tim17Handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; //TIM_AUTORELOAD_PRELOAD_DISABLE;
- HAL_TIM_Base_Init(&Tim17Handle);
-
- HAL_NVIC_SetPriority(TIM17_IRQn, 2, 0);
-
- HAL_NVIC_EnableIRQ(TIM17_IRQn);
- //HAL_TIM_Base_Start_IT(&Tim17Handle);
- }
- //
- void tim_set_string_timer(bool state)
- {
- if (state) {
- TIM17->CNT = 0;
- HAL_TIM_Base_Start_IT(&Tim17Handle);
- }
- else {
- HAL_TIM_Base_Stop_IT(&Tim17Handle);
- }
- }
- //
- void tim_set_string_freq(void)
- {
- TIM16->PSC = 11.707*(float)freq_voltage + 47;
-
- TIM17->PSC = 11.707*(float)freq_voltage + 47;
- }
- //
- void tim_signal_start(void)
- {
- __HAL_TIM_CLEAR_IT(&Tim17Handle, TIM_IT_UPDATE);
- HAL_TIM_Base_Start_IT(&Tim17Handle);
- }
- //
- void tim_inf_set_time(uint16_t time)
- {
- __HAL_TIM_CLEAR_IT(&Tim16Handle, TIM_IT_UPDATE);
- TIM16->ARR = time;
- HAL_TIM_Base_Start_IT(&Tim16Handle);
- }
- //
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
- {
- static bool warmup = false;
-
- if (htim->Instance == TIM16)
- {
- if (but_is_string()) {
- led_freq_toggle();
- }
- }
- else if (htim->Instance == TIM17)
- {
- if (warmup) {
- logic_string_next();
- }
- else {
- warmup = true;
- HAL_TIM_Base_Stop_IT(&Tim17Handle);
- }
- }
- }
- // Сразу после настройки таймера TIM17 делаем разовое срабатывание
- void tim_warmup(void)
- {
- TIM17->PSC = 47;
- tim_set_string_timer(true);
- }
- //
- void TIM16_IRQHandler(void)
- {
- HAL_TIM_IRQHandler(&Tim16Handle);
- }
- //
- void TIM17_IRQHandler(void)
- {
- HAL_TIM_IRQHandler(&Tim17Handle);
- }
|