моделирование чет непонятное
This commit is contained in:
@@ -1247,7 +1247,7 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to
|
||||
* @arg TIM_IT_BREAK: Break interrupt
|
||||
* @retval None
|
||||
*/
|
||||
#define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR = ~(__INTERRUPT__))
|
||||
#define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR &= ~(__INTERRUPT__))
|
||||
|
||||
/**
|
||||
* @brief Indicates whether or not the TIM Counter is used as downcounter.
|
||||
|
||||
@@ -1254,7 +1254,7 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to
|
||||
* @arg TIM_IT_BREAK: Break interrupt
|
||||
* @retval None
|
||||
*/
|
||||
#define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR = ~(__INTERRUPT__))
|
||||
#define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR &= ~(__INTERRUPT__))
|
||||
|
||||
/**
|
||||
* @brief Indicates whether or not the TIM Counter is used as downcounter.
|
||||
|
||||
@@ -13,10 +13,14 @@ void TIM_Call_IRQHandller(TIM_TypeDef* TIMx);
|
||||
/* Базовая функция для симуляции таймера: она вызывается каждый шаг симуляции */
|
||||
void TIM_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
|
||||
{
|
||||
if (!(TIMx->CR1 & TIM_CR1_CEN)) // таймер не включен - возврат
|
||||
{
|
||||
TIMS->RepititiveCnt = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
Overflow_Check(TIMx, TIMS);
|
||||
|
||||
|
||||
|
||||
// Выбор режима работы таймера
|
||||
switch (TIMx->SMCR & TIM_SMCR_SMS) // TIMER MODE
|
||||
{
|
||||
@@ -50,9 +54,9 @@ void TIM_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
|
||||
/* Счет таймера за один такт */
|
||||
void TIMx_Count(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS)
|
||||
{
|
||||
if ((TIMx->CR1 & TIM_CR1_DIR) && TIMx->CR1) // up COUNTER and COUNTER ENABLE
|
||||
if ((TIMx->CR1 & TIM_CR1_DIR)) // up COUNTER ENABLE
|
||||
TIMS->tx_cnt -= TIMS->tx_step / (TIMx->PSC + 1);
|
||||
else if (((TIMx->CR1 & TIM_CR1_DIR) == 0) && TIMx->CR1) // down COUNTER and COUNTER ENABLE
|
||||
else if (((TIMx->CR1 & TIM_CR1_DIR) == 0)) // down COUNTER ENABLE
|
||||
TIMS->tx_cnt += TIMS->tx_step / (TIMx->PSC + 1);
|
||||
TIMx->CNT = (uint32_t)TIMS->tx_cnt;
|
||||
}
|
||||
@@ -66,20 +70,40 @@ void Overflow_Check(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS)
|
||||
if ((TIMx->CR1 & TIM_CR1_ARPE) == 0) TIMS->RELOAD = TIMx->ARR; // PRELOAD disable - update ARR every itteration
|
||||
if (TIMS->tx_cnt > TIMS->RELOAD || TIMS->tx_cnt < 0) // OVERFLOW
|
||||
{
|
||||
TIMS->RELOAD = TIMx->ARR; // RELOAD ARR
|
||||
|
||||
if (TIMS->tx_cnt > TIMx->ARR) // reset COUNTER
|
||||
TIMS->tx_cnt -= TIMS->RELOAD + 1;
|
||||
else if (TIMS->tx_cnt < 0)
|
||||
TIMS->tx_cnt += TIMS->RELOAD + 1;
|
||||
|
||||
if (TIMS->tx_step > TIMS->RELOAD)
|
||||
TIMS->tx_cnt = 0;
|
||||
|
||||
if (!(TIMx->CR1 & TIM_CR1_OPM)) // if no one pulse
|
||||
{
|
||||
TIMS->Updated = 1;
|
||||
TIMS->RELOAD = TIMx->ARR; // RELOAD ARR
|
||||
|
||||
if (TIMS->tx_cnt > TIMx->ARR) // reset COUNTER
|
||||
TIMS->tx_cnt -= TIMS->RELOAD+1;
|
||||
else if (TIMS->tx_cnt < 0)
|
||||
TIMS->tx_cnt += TIMS->RELOAD+1;
|
||||
|
||||
if(TIMS->tx_step > TIMS->RELOAD)
|
||||
TIMS->tx_cnt = 0;
|
||||
|
||||
if (TIMx->DIER & TIM_DIER_UIE) {
|
||||
TIMx->SR |= TIM_SR_UIF;
|
||||
TIMx->SR |= TIM_SR_UIF;
|
||||
}
|
||||
}
|
||||
else // if one pulse mode enabled
|
||||
{
|
||||
if (TIMS->RepititiveCnt >= TIMx->RCR)
|
||||
{
|
||||
TIMS->RepititiveCnt = 0;
|
||||
TIMS->Updated = 1;
|
||||
TIMx->CR1 &= ~TIM_CR1_CEN;
|
||||
if (TIMx->DIER & TIM_DIER_UIE) {
|
||||
TIMx->SR |= TIM_SR_UIF;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
TIMS->RepititiveCnt++;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -73,6 +73,7 @@ struct TIM_Sim
|
||||
double tx_cnt; // счетчик таймера
|
||||
double tx_step; // шаг счета за один шаг симуляции
|
||||
long long RELOAD; // буфер, если PRELOAD = 1
|
||||
long long RepititiveCnt; // буфер, если PRELOAD = 1
|
||||
struct Channels_Sim Channels; // структура для симуляции каналов
|
||||
};
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -217,10 +217,10 @@ void Init_TIM_SIM(void)
|
||||
tim8s.Channels.OC1_PIN_SHIFT = 0;
|
||||
tim8s.Channels.OC2_GPIOx = GPIOA;
|
||||
tim8s.Channels.OC2_PIN_SHIFT = 0;
|
||||
tim8s.Channels.OC3_GPIOx = GPIOA;
|
||||
tim8s.Channels.OC3_PIN_SHIFT = 0;
|
||||
tim8s.Channels.OC4_GPIOx = GPIOA;
|
||||
tim8s.Channels.OC4_PIN_SHIFT = 0;
|
||||
tim8s.Channels.OC3_GPIOx = GPIOC;
|
||||
tim8s.Channels.OC3_PIN_SHIFT = 8;
|
||||
tim8s.Channels.OC4_GPIOx = GPIOC;
|
||||
tim8s.Channels.OC4_PIN_SHIFT = 9;
|
||||
#endif
|
||||
#ifdef USE_TIM9
|
||||
memset(&tim9s, 0, sizeof(tim9s));
|
||||
|
||||
Reference in New Issue
Block a user