/**
******************************************************************************
* @file tsl_time.c
* @author MCD Application Team
* @version V1.4.4
* @date 31-March-2014
* @brief This file contains all functions to manage the timings in general.
******************************************************************************
* @attention
*
*
© COPYRIGHT 2014 STMicroelectronics
*
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.st.com/software_license_agreement_liberty_v2
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "tsl_time.h"
#include "tsl_globals.h"
/* Private typedefs ----------------------------------------------------------*/
/* Private defines -----------------------------------------------------------*/
/* Private macros ------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private functions prototype -----------------------------------------------*/
/**
* @brief Management of the timing module interrupt service routine.
* @param None
* @retval None
*/
void TSL_tim_ProcessIT(void)
{
static TSL_tTick_ms_T count_1s = 0;
// Count 1 global tick every xxx ms (defined by TSLPRM_TICK_FREQ parameter)
TSL_Globals.Tick_ms++;
// Check if 1 second has elapsed
count_1s++;
if (count_1s > (TSLPRM_TICK_FREQ - 1))
{
TSL_Globals.Tick_sec++; // 1 global tick every second
if (TSL_Globals.Tick_sec > 63) // Due to DTO counter on 6 bits...
{
TSL_Globals.Tick_sec = 0;
}
count_1s = 0;
}
// Callback function
#if TSLPRM_USE_TIMER_CALLBACK > 0
TSL_CallBack_TimerTick();
#endif
}
/**
* @brief Check if a delay (in ms) has elapsed.
* This function must be called regularly due to counter Roll-over only managed one time.
* @param[in] delay_ms Delay in ms
* @param[in] last_tick Variable holding the last tick value
* @retval Status
*/
TSL_Status_enum_T TSL_tim_CheckDelay_ms(TSL_tTick_ms_T delay_ms, __IO TSL_tTick_ms_T *last_tick)
{
TSL_tTick_ms_T tick;
TSL_tTick_ms_T diff;
disableInterrupts();
tick = TSL_Globals.Tick_ms;
if (delay_ms == 0)
{
enableInterrupts();
return TSL_STATUS_ERROR;
}
// Counter Roll-over management
if (tick >= *last_tick)
{
diff = tick - *last_tick;
}
else
{
diff = (0xFFFF - *last_tick) + tick + 1;
}
#if (TSLPRM_TICK_FREQ == 125)
if (diff >= (TSL_tTick_ms_T)(delay_ms >> 3)) // Divide by 8 for 8ms tick
#endif
#if (TSLPRM_TICK_FREQ == 250)
if (diff >= (TSL_tTick_ms_T)(delay_ms >> 2)) // Divide by 4 for 4ms tick
#endif
#if (TSLPRM_TICK_FREQ == 500)
if (diff >= (TSL_tTick_ms_T)(delay_ms >> 1)) // Divide by 2 for 2ms tick
#endif
#if (TSLPRM_TICK_FREQ == 1000)
if (diff >= (TSL_tTick_ms_T)delay_ms) // Direct value for 1ms tick
#endif
#if (TSLPRM_TICK_FREQ == 2000)
if (diff >= (TSL_tTick_ms_T)(delay_ms << 1)) // Multiply by 2 for 0.5ms tick
#endif
{
// Save current time
*last_tick = tick;
enableInterrupts();
return TSL_STATUS_OK;
}
enableInterrupts();
return TSL_STATUS_BUSY;
}
/**
* @brief Check if a delay (in s) has elapsed.
* @param[in] delay_sec Delay in seconds
* @param[in] last_tick Variable holding the last tick value
* @retval Status
*/
TSL_Status_enum_T TSL_tim_CheckDelay_sec(TSL_tTick_sec_T delay_sec, __IO TSL_tTick_sec_T *last_tick)
{
TSL_tTick_sec_T tick;
TSL_tTick_sec_T diff;
disableInterrupts();
tick = TSL_Globals.Tick_sec;
if (delay_sec == 0)
{
enableInterrupts();
return TSL_STATUS_ERROR;
}
// Counter Roll-over management
if (tick >= *last_tick)
{
diff = (TSL_tTick_sec_T)(tick - *last_tick);
}
else
{
diff = (TSL_tTick_sec_T)((63 - *last_tick) + tick + 1); // DTO counter is on 6 bits
}
if (diff >= delay_sec)
{
// Save current time
*last_tick = tick;
enableInterrupts();
return TSL_STATUS_OK;
}
enableInterrupts();
return TSL_STATUS_BUSY;
}
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/