Работает

Была исправлена симуляция таймеров и его статус регситра
This commit is contained in:
2025-11-16 11:32:32 +03:00
parent 115be84ccd
commit bb5b9886d7
8 changed files with 48 additions and 59 deletions

View File

@@ -1,5 +1,7 @@
#include "mcu_wrapper_conf.h"
#ifdef ARM_MATH_LOOPUNROLL
#include "dsp/none.h"
#endif
#define __disable_irq()

View File

@@ -131,13 +131,14 @@ void CC_PWM_Ch1_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
}
if (TIMx->DIER & TIM_IT_CC1)
{
TIMx->SR |= TIM_SR_CC1IF;
if (((TIMS->tx_cnt - TIMS->tx_step) < TIMx->CCR1) && (TIMS->tx_cnt >= TIMx->CCR1))
{
TIMx->SR |= TIM_SR_CC1IF;
TIM_Call_IRQHandller(TIMx);
}
else if (((TIMS->tx_cnt - TIMS->tx_step) > TIMx->CCR1) && (TIMS->tx_cnt <= TIMx->CCR1))
{
TIMx->SR |= TIM_SR_CC1IF;
TIM_Call_IRQHandller(TIMx);
}
}
@@ -184,20 +185,21 @@ void CC_PWM_Ch2_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
}
if (TIMx->DIER & TIM_IT_CC2)
{
TIMx->SR |= TIM_SR_CC2IF;
if (((TIMS->tx_cnt - TIMS->tx_step) < TIMx->CCR2) && (TIMS->tx_cnt >= TIMx->CCR2))
{
TIMx->SR |= TIM_SR_CC2IF;
TIM_Call_IRQHandller(TIMx);
}
else if (((TIMS->tx_cnt - TIMS->tx_step) > TIMx->CCR2) && (TIMS->tx_cnt <= TIMx->CCR2))
{
TIMx->SR |= TIM_SR_CC2IF;
TIM_Call_IRQHandller(TIMx);
}
}
}
void CC_PWM_Ch3_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
{ // определяет режим канала
switch (TIMx->CCMR2 & TIM_CCMR1_OC1M)
switch (TIMx->CCMR2 & TIM_CCMR2_OC3M)
{
case (TIM_OCMODE_ACTIVE): // ACTIVE mode
if (abs(TIMx->CNT - TIMx->CCR3) < 2*TIMS->tx_step)
@@ -237,20 +239,21 @@ void CC_PWM_Ch3_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
}
if (TIMx->DIER & TIM_IT_CC3)
{
TIMx->SR |= TIM_SR_CC3IF;
if (((TIMS->tx_cnt - TIMS->tx_step) < TIMx->CCR3) && (TIMS->tx_cnt >= TIMx->CCR3))
{
TIMx->SR |= TIM_SR_CC3IF;
TIM_Call_IRQHandller(TIMx);
}
else if (((TIMS->tx_cnt - TIMS->tx_step) > TIMx->CCR3) && (TIMS->tx_cnt <= TIMx->CCR3))
{
TIMx->SR |= TIM_SR_CC3IF;
TIM_Call_IRQHandller(TIMx);
}
}
}
void CC_PWM_Ch4_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
{ // определяет режим канала
switch (TIMx->CCMR2 & TIM_CCMR1_OC2M)
switch (TIMx->CCMR2 & TIM_CCMR2_OC4M)
{
case ((TIM_OCMODE_ACTIVE) << (TIM_OCMODE_SECOND_SHIFT)): // ACTIVE mode
if (abs(TIMx->CNT - TIMx->CCR4) < 2*TIMS->tx_step)
@@ -290,13 +293,14 @@ void CC_PWM_Ch4_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
}
if (TIMx->DIER & TIM_IT_CC4)
{
TIMx->SR |= TIM_SR_CC4IF;
if (((TIMS->tx_cnt - TIMS->tx_step) < TIMx->CCR4) && (TIMS->tx_cnt >= TIMx->CCR4))
{
TIMx->SR |= TIM_SR_CC4IF;
TIM_Call_IRQHandller(TIMx);
}
else if (((TIMS->tx_cnt - TIMS->tx_step) > TIMx->CCR4) && (TIMS->tx_cnt <= TIMx->CCR4))
{
TIMx->SR |= TIM_SR_CC4IF;
TIM_Call_IRQHandller(TIMx);
}
}
@@ -649,9 +653,13 @@ __weak void TIM8_BRK_TIM12_IRQHandler(void) {}
__weak void TIM8_TRG_COM_TIM14_IRQHandler(void) {}
//#endif
/* Вызов прерывания */
void TIM_Call_IRQHandller(TIM_TypeDef* TIMx)
{ // calling HANDLER
SR_STORE(TIMx, SR);
if ((TIMx == TIM1) || (TIMx == TIM10))
TIM1_UP_TIM10_IRQHandler();
else if (TIMx == TIM2)
@@ -676,5 +684,7 @@ void TIM_Call_IRQHandller(TIM_TypeDef* TIMx)
TIM8_BRK_TIM12_IRQHandler();
else if ((TIMx == TIM8) || (TIMx == TIM14))
TIM8_TRG_COM_TIM14_IRQHandler();
SR_PROCESS(TIMx, SR);
}
//------------------------------------------------------------------//

View File

@@ -147,4 +147,14 @@ static void ADC_SIM_DEINIT() {}
//-----------------------------------------------------------------------//
#define SR_STORE(periph, srname) \
uint32_t sr_origin = periph->srname; \
uint32_t sr_new = periph->srname;
#define SR_PROCESS(periph, srname) \
sr_new = sr_origin & periph->srname; \
periph->srname = sr_new;
#endif // _MATLAB_SETUP_H_