diff --git a/MCU_STM32F4xx_Matlab/STM32F4xx_SIMULINK/stm32f4xx_matlab_tim.c b/MCU_STM32F4xx_Matlab/STM32F4xx_SIMULINK/stm32f4xx_matlab_tim.c index c3c83ee..f8abd82 100644 --- a/MCU_STM32F4xx_Matlab/STM32F4xx_SIMULINK/stm32f4xx_matlab_tim.c +++ b/MCU_STM32F4xx_Matlab/STM32F4xx_SIMULINK/stm32f4xx_matlab_tim.c @@ -65,7 +65,15 @@ void TIMx_Count(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS) TIMS->tx_cnt -= TIMS->tx_step / TIMx->PSC; else if (((TIMx->CR1 & TIM_CR1_DIR) == 0) && TIMx->CR1) // down COUNTER and COUNTER ENABLE TIMS->tx_cnt += TIMS->tx_step / TIMx->PSC; - TIMx->CNT = (uint32_t)TIMS->tx_cnt; + + if (TIMS->tx_cnt > 0) + { + TIMx->CNT = (uint32_t)TIMS->tx_cnt; + } + else + { + TIMx->CNT = 0; + } } /** @@ -85,13 +93,17 @@ void Overflow_Check(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS) if (TIMS->tx_cnt > TIMS->RELOAD || TIMS->tx_cnt < 0) // OVERFLOW { + TIMS->RELOAD = TIMx->ARR; // RELOAD ARR switch (TIMx->CR1 & TIM_CR1_CMS) { case TIM_COUNTERMODE_CENTERALIGNED1: case TIM_COUNTERMODE_CENTERALIGNED2: case TIM_COUNTERMODE_CENTERALIGNED3: - TIMx->CR1 ^= TIM_CR1_DIR; + if(TIMS->tx_cnt > TIMS->RELOAD) + TIMx->CR1 |= TIM_CR1_DIR; + else if(TIMS->tx_cnt < 0) + TIMx->CR1 &= ~TIM_CR1_DIR; if (TIMx->DIER & TIM_DIER_UIE) // if update interrupt enable call_IRQHandller(TIMx); // call HANDLER @@ -99,7 +111,6 @@ void Overflow_Check(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS) // default counting default: - TIMS->RELOAD = TIMx->ARR; // RELOAD ARR if (TIMS->tx_cnt > TIMx->ARR) // reset COUNTER TIMS->tx_cnt = 0; diff --git a/mcu_test_r2021a.slx b/mcu_test_r2021a.slx index 8f4752b..04cf205 100644 Binary files a/mcu_test_r2021a.slx and b/mcu_test_r2021a.slx differ