35 switch (TIMx->SMCR & TIM_SMCR_SMS)
38 case(TIM_SLAVEMODE_DISABLE):
45 case(TIM_SLAVEMODE_TRIGGER):
65 if ((TIMx->CR1 & TIM_CR1_DIR) && TIMx->CR1)
67 else if (((TIMx->CR1 & TIM_CR1_DIR) == 0) && TIMx->CR1)
69 TIMx->CNT = (uint32_t)TIMS->
tx_cnt;
83 if ((TIMx->CR1 & TIM_CR1_UDIS) == 0)
85 if ((TIMx->CR1 & TIM_CR1_ARPE) == 0) TIMS->
RELOAD = TIMx->ARR;
90 if (TIMS->
tx_cnt > TIMx->ARR)
95 if(TIMx->DIER & TIM_DIER_UIE)
139switch (TIMx->CCMR1 & TIM_CCMR1_OC1M)
141 case (TIM_OCMODE_ACTIVE):
142 if (abs(TIMx->CNT - TIMx->CCR1) < 2*TIMS->
tx_step)
146 case (TIM_OCMODE_INACTIVE):
147 if (abs(TIMx->CNT - TIMx->CCR1) < 2*TIMS->
tx_step)
151 case (TIM_OCMODE_TOGGLE):
152 if (abs(TIMx->CNT - TIMx->CCR1) < 2*TIMS->
tx_step)
156 case (TIM_OCMODE_PWM1):
157 if (TIMx->CNT < TIMx->CCR1)
163 case (TIM_OCMODE_PWM2):
164 if (TIMx->CNT < TIMx->CCR1)
170 case (TIM_OCMODE_FORCED_ACTIVE):
173 case (TIM_OCMODE_FORCED_INACTIVE):
187switch (TIMx->CCMR1 & TIM_CCMR1_OC2M)
190 if (abs(TIMx->CNT - TIMx->CCR2) < 2*TIMS->
tx_step)
195 if (abs(TIMx->CNT - TIMx->CCR2) < 2*TIMS->
tx_step)
200 if (abs(TIMx->CNT - TIMx->CCR2) < 2*TIMS->
tx_step)
205 if (TIMx->CNT < TIMx->CCR2)
212 if (TIMx->CNT < TIMx->CCR2)
235switch (TIMx->CCMR2 & TIM_CCMR1_OC1M)
237 case (TIM_OCMODE_ACTIVE):
238 if (abs(TIMx->CNT - TIMx->CCR3) < 2*TIMS->
tx_step)
242 case (TIM_OCMODE_INACTIVE):
243 if (abs(TIMx->CNT - TIMx->CCR3) < 2*TIMS->
tx_step)
247 case (TIM_OCMODE_TOGGLE):
248 if (abs(TIMx->CNT - TIMx->CCR3) < 2*TIMS->
tx_step)
252 case (TIM_OCMODE_PWM1):
253 if (TIMx->CNT < TIMx->CCR3)
259 case (TIM_OCMODE_PWM2):
260 if (TIMx->CNT < TIMx->CCR3)
266 case (TIM_OCMODE_FORCED_ACTIVE):
269 case (TIM_OCMODE_FORCED_INACTIVE):
283switch (TIMx->CCMR2 & TIM_CCMR1_OC2M)
286 if (abs(TIMx->CNT - TIMx->CCR4) < 2*TIMS->
tx_step)
291 if (abs(TIMx->CNT - TIMx->CCR4) < 2*TIMS->
tx_step)
296 if (abs(TIMx->CNT - TIMx->CCR4) < 2*TIMS->
tx_step)
301 if (TIMx->CNT < TIMx->CCR4)
308 if (TIMx->CNT < TIMx->CCR4)
336 if (TIMx->CCER & TIM_CCER_CC1P)
353 if (TIMx->CCER & TIM_CCER_CC2P)
370 if (TIMx->CCER & TIM_CCER_CC3P)
387 if (TIMx->CCER & TIM_CCER_CC4P)
414 if ((TIMx->CR2 & TIM_CR2_MMS) == (0b100 << TIM_CR2_MMS_Pos))
418 else if ((TIMx->CR2 & TIM_CR2_MMS) == (0b101 << TIM_CR2_MMS_Pos))
422 else if ((TIMx->CR2 & TIM_CR2_MMS) == (0b110 << TIM_CR2_MMS_Pos))
426 else if ((TIMx->CR2 & TIM_CR2_MMS) == (0b111 << TIM_CR2_MMS_Pos))
433 else if (TIMx == TIM2)
435 else if (TIMx == TIM3)
437 else if (TIMx == TIM4)
439 else if (TIMx == TIM5)
441 else if (TIMx == TIM6)
443 else if (TIMx == TIM7)
445 else if (TIMx == TIM8)
468 if ((TIMx->SMCR & TIM_SMCR_TS) == TIM_TS_ITR0)
470 else if ((TIMx->SMCR & TIM_SMCR_TS) == TIM_TS_ITR1)
472 else if ((TIMx->SMCR & TIM_SMCR_TS) == TIM_TS_ITR2)
474 else if ((TIMx->SMCR & TIM_SMCR_TS) == TIM_TS_ITR3)
477 else if (TIMx == TIM3)
479 if ((TIMx->SMCR & TIM_SMCR_TS) == TIM_TS_ITR0)
481 else if ((TIMx->SMCR & TIM_SMCR_TS) == TIM_TS_ITR1)
483 else if ((TIMx->SMCR & TIM_SMCR_TS) == TIM_TS_ITR2)
485 else if ((TIMx->SMCR & TIM_SMCR_TS) == TIM_TS_ITR3)
488 else if (TIMx == TIM4)
490 if ((TIMx->SMCR & TIM_SMCR_TS) == TIM_TS_ITR0)
492 else if ((TIMx->SMCR & TIM_SMCR_TS) == TIM_TS_ITR1)
494 else if ((TIMx->SMCR & TIM_SMCR_TS) == TIM_TS_ITR2)
496 else if ((TIMx->SMCR & TIM_SMCR_TS) == TIM_TS_ITR3)
499 else if (TIMx == TIM5)
501 if ((TIMx->SMCR & TIM_SMCR_TS) == TIM_TS_ITR0)
503 else if ((TIMx->SMCR & TIM_SMCR_TS) == TIM_TS_ITR1)
505 else if ((TIMx->SMCR & TIM_SMCR_TS) == TIM_TS_ITR2)
507 else if ((TIMx->SMCR & TIM_SMCR_TS) == TIM_TS_ITR3)
577 memset(&tim2s, 0,
sizeof(tim2s));
586 memset(&tim5s, 0,
sizeof(tim5s));
589 memset(&tim6s, 0,
sizeof(tim6s));
595 memset(&tim8s, 0,
sizeof(tim8s));
598 memset(&tim9s, 0,
sizeof(tim9s));
601 memset(&tim10s, 0,
sizeof(tim10s));
604 memset(&tim11s, 0,
sizeof(tim11s));
610 memset(&tim13s, 0,
sizeof(tim13s));
613 memset(&tim14s, 0,
sizeof(tim14s));
622#ifndef USE_TIM1_UP_TIM10_HANDLER
625#ifndef USE_TIM2_HANDLER
628#ifndef USE_TIM3_HANDLER
631#ifndef USE_TIM4_HANDLER
634#ifndef USE_TIM5_HANDLER
637#ifndef USE_TIM6_HANDLER
640#ifndef USE_TIM7_HANDLER
643#ifndef USE_TIM8_UP_TIM13_HANDLER
646#ifndef USE_TIM1_BRK_TIM9_HANDLER
649#ifndef USE_TIM1_TRG_COM_TIM11_HANDLER
652#ifndef USE_TIM8_BRK_TIM12_HANDLER
655#ifndef USE_TIM8_TRG_COM_TIM14_HANDLER
667 if ((TIMx == TIM1) || (TIMx == TIM10))
669 else if (TIMx == TIM2)
671 else if (TIMx == TIM3)
673 else if (TIMx == TIM4)
675 else if (TIMx == TIM5)
677 else if (TIMx == TIM6)
679 else if (TIMx == TIM7)
681 else if ((TIMx == TIM8) || (TIMx == TIM13))
683 else if ((TIMx == TIM1) || (TIMx == TIM9))
685 else if ((TIMx == TIM1) || (TIMx == TIM11))
687 else if ((TIMx == TIM8) || (TIMx == TIM12))
689 else if ((TIMx == TIM8) || (TIMx == TIM14))
void Overflow_Check(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
Проверка на переполнение и дальнейшая его обработка.
#define Check_OC3_GPIO_Output(_tims_)
Дефайн для проверки выводить ли канал 3 на GPIO (настроен ли GPIO на альтернативную функцию)
void Write_OC_to_GPIO(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
Запись каналов таймера в порты GPIO.
void Simulate_TIMs(void)
Симуляция выбранных таймеров.
void TIM_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
Симуляция таймера на один такт симуляции.
void Write_OC_to_TRGO(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
Запись каналов таймера в глабальную структуру с TRIGGER OUTPUT.
void TIM_SIM_DEINIT(void)
Деинициализирование выбранных таймеров.
void TIMx_Count(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
Симуляция счетчика таймера на один такт симуляции.
void CC_PWM_Ch1_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
Выбор режима первого канала и его симуляция.
void Slave_Mode_Check_Source(TIM_TypeDef *TIMx)
Определение источника для запуска таймера в SLAVE MODE.
void Channels_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
Симуляция каналов таймера.
#define Check_OC1_GPIO_Output(_tims_)
Дефайн для проверки выводить ли канал 1 на GPIO (настроен ли GPIO на альтернативную функцию)
void CC_PWM_Ch3_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
Выбор режима третьего канала и его симуляция.
void call_IRQHandller(TIM_TypeDef *TIMx)
Вызов прерывания таймера TIMx.
#define Check_OC2_GPIO_Output(_tims_)
Дефайн для проверки выводить ли канал 2 на GPIO (настроен ли GPIO на альтернативную функцию)
void CC_PWM_Ch4_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
Выбор режима четвертого канала и его симуляция.
#define Check_OC4_GPIO_Output(_tims_)
Дефайн для проверки выводить ли канал 4 на GPIO (настроен ли GPIO на альтернативную функцию)
#define TIM_OCMODE_SECOND_SHIFT
Дефайн для сдвига между первой и второй половиной CCMRx регистров
void CC_PWM_Ch2_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
Выбор режима второго канала и его симуляция.
void TIM6_DAC_IRQHandler(void)
void TIM1_TRG_COM_TIM11_IRQHandler(void)
void TIM8_BRK_TIM12_IRQHandler(void)
void TIM2_IRQHandler(void)
void TIM1_BRK_TIM9_IRQHandler(void)
void TIM8_TRG_COM_TIM14_IRQHandler(void)
void TIM5_IRQHandler(void)
struct SlaveChannels Slave_Channels
структура для связи и синхронизации таймеров
void TIM4_IRQHandler(void)
void TIM8_UP_TIM13_IRQHandler(void)
void TIM7_IRQHandler(void)
void TIM3_IRQHandler(void)
void TIM1_UP_TIM10_IRQHandler(void)
Заголовочный файл для симулятора таймеров.
GPIO_TypeDef * OC2_GPIOx
Порт второго канала
unsigned OC4REF
Четвертый канал
uint32_t OC1_PIN_SHIFT
Пин первого канала
GPIO_TypeDef * OC1_GPIOx
Порт первого канала
GPIO_TypeDef * OC3_GPIOx
Порт третьего канала
GPIO_TypeDef * OC4_GPIOx
Порт четвертого канала
unsigned OC2REF
Второй канал
uint32_t OC4_PIN_SHIFT
Пин четвертого канала
unsigned OC1REF
Первый канал
unsigned OC3REF
Третьий канал
uint32_t OC3_PIN_SHIFT
Пин третьего канала
uint32_t OC2_PIN_SHIFT
Пин второго канала
Структура для управления Слейв Таймерами
unsigned TIM1_TRGO
Синган синхронизации таймера 1.
unsigned TIM6_TRGO
Синган синхронизации таймера 6.
unsigned TIM8_TRGO
Синган синхронизации таймера 8
unsigned TIM2_TRGO
Синган синхронизации таймера 2.
unsigned TIM7_TRGO
Синган синхронизации таймера 7.
unsigned TIM5_TRGO
Синган синхронизации таймера 5.
unsigned TIM3_TRGO
Синган синхронизации таймера 3.
unsigned TIM4_TRGO
Синган синхронизации таймера 4.
Структура для моделирования таймера
int RELOAD
Буфер для периода таймера (для реализации функции PRELOAD)
double tx_cnt
Счетчик таймера (double, т.к. кол-во тактов за шаг симуляции может быть дробным)
struct Channels_Sim Channels
Структура для симуляции каналов
double tx_step
Шаг счета за один шаг симуляции (double, т.к. кол-во тактов за шаг симуляции может быть дробным)