blob: 23f338c8ea94ac98731847597ac83e4af87e69a8 [file] [log] [blame]
/***************************************************************************//**
* \file cy_systick.c
* \version 1.10.1
*
* Provides the API definitions of the SisTick driver.
*
********************************************************************************
* \copyright
* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*******************************************************************************/
#include "cy_systick.h"
#include <stddef.h> /* for NULL */
static Cy_SysTick_Callback Cy_SysTick_Callbacks[CY_SYS_SYST_NUM_OF_CALLBACKS];
static void Cy_SysTick_ServiceCallbacks(void);
/*******************************************************************************
* Function Name: Cy_SysTick_Init
****************************************************************************//**
*
* Initializes the SysTick driver:
* - Initializes the callback addresses with pointers to NULL
* - Associates the SysTick system vector with the callback functions
* - Sets the SysTick clock by calling \ref Cy_SysTick_SetClockSource()
* - Sets the SysTick reload interval by calling \ref Cy_SysTick_SetReload()
* - Clears the SysTick counter value by calling \ref Cy_SysTick_Clear()
* - Enables the SysTick by calling \ref Cy_SysTick_Enable(). Note the \ref
* Cy_SysTick_Enable() function also enables the SysTick interrupt by calling
* \ref Cy_SysTick_EnableInterrupt().
*
* \param clockSource The SysTick clock source \ref cy_en_systick_clock_source_t
* \param interval The SysTick reload value.
*
* \sideeffect Clears the SysTick count flag if it was set.
*
*******************************************************************************/
void Cy_SysTick_Init(cy_en_systick_clock_source_t clockSource, uint32_t interval)
{
uint32_t i;
for (i = 0u; i<CY_SYS_SYST_NUM_OF_CALLBACKS; i++)
{
Cy_SysTick_Callbacks[i] = NULL;
}
__ramVectors[CY_SYSTICK_IRQ_NUM] = &Cy_SysTick_ServiceCallbacks;
Cy_SysTick_SetClockSource(clockSource);
Cy_SysTick_SetReload(interval);
Cy_SysTick_Clear();
Cy_SysTick_Enable();
}
/*******************************************************************************
* Function Name: Cy_SysTick_Enable
****************************************************************************//**
*
* Enables the SysTick timer and its interrupt.
*
* \sideeffect Clears the SysTick count flag if it was set
*
*******************************************************************************/
void Cy_SysTick_Enable(void)
{
Cy_SysTick_EnableInterrupt();
SYSTICK_CTRL |= SysTick_CTRL_ENABLE_Msk;
}
/*******************************************************************************
* Function Name: Cy_SysTick_Disable
****************************************************************************//**
*
* Disables the SysTick timer and its interrupt.
*
* \sideeffect Clears the SysTick count flag if it was set
*
*******************************************************************************/
void Cy_SysTick_Disable(void)
{
Cy_SysTick_DisableInterrupt();
SYSTICK_CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
/*******************************************************************************
* Function Name: Cy_SysTick_SetClockSource
****************************************************************************//**
*
* Sets the clock source for the SysTick counter.
*
* Clears the SysTick count flag if it was set. If the clock source is not ready
* this function call will have no effect. After changing the clock source to the
* low frequency clock, the counter and reload register values will remain
* unchanged so the time to the interrupt will be significantly longer and vice
* versa.
*
* Changing the SysTick clock source and/or its frequency will change
* the interrupt interval and Cy_SysTick_SetReload() should be
* called to compensate this change.
*
* \param clockSource \ref cy_en_systick_clock_source_t Clock source.
*
*******************************************************************************/
void Cy_SysTick_SetClockSource(cy_en_systick_clock_source_t clockSource)
{
if (clockSource == CY_SYSTICK_CLOCK_SOURCE_CLK_CPU)
{
SYSTICK_CTRL |= SysTick_CTRL_CLKSOURCE_Msk;
}
else
{
CPUSS->SYSTICK_CTL = _VAL2FLD(CPUSS_SYSTICK_CTL_CLOCK_SOURCE, (uint32_t) clockSource);
SYSTICK_CTRL &= ~SysTick_CTRL_CLKSOURCE_Msk;
}
}
/*******************************************************************************
* Function Name: Cy_SysTick_GetClockSource
****************************************************************************//**
*
* Gets the clock source for the SysTick counter.
*
* \returns \ref cy_en_systick_clock_source_t Clock source
*
*******************************************************************************/
cy_en_systick_clock_source_t Cy_SysTick_GetClockSource(void)
{
cy_en_systick_clock_source_t returnValue;
if ((SYSTICK_CTRL & SysTick_CTRL_CLKSOURCE_Msk) != 0u)
{
returnValue = CY_SYSTICK_CLOCK_SOURCE_CLK_CPU;
}
else
{
returnValue = (cy_en_systick_clock_source_t) ((uint32_t) _FLD2VAL(CPUSS_SYSTICK_CTL_CLOCK_SOURCE, CPUSS->SYSTICK_CTL));
}
return(returnValue);
}
/*******************************************************************************
* Function Name: Cy_SysTick_SetCallback
****************************************************************************//**
*
* Sets the callback function to the specified callback number.
*
* \param number The number of the callback function addresses to be set.
* The valid range is from 0 to \ref CY_SYS_SYST_NUM_OF_CALLBACKS - 1.
*
* \param function The pointer to the function that will be associated with the
* SysTick ISR for the specified number.
*
* \return Returns the address of the previous callback function.
* The NULL is returned if the specified address in not set or incorrect
* parameter is specified.
* \sideeffect
* The registered callback functions will be executed in the interrupt.
*
*******************************************************************************/
Cy_SysTick_Callback Cy_SysTick_SetCallback(uint32_t number, Cy_SysTick_Callback function)
{
Cy_SysTick_Callback retVal;
if (number < CY_SYS_SYST_NUM_OF_CALLBACKS)
{
retVal = Cy_SysTick_Callbacks[number];
Cy_SysTick_Callbacks[number] = function;
}
else
{
retVal = NULL;
}
return (retVal);
}
/*******************************************************************************
* Function Name: Cy_SysTick_GetCallback
****************************************************************************//**
*
* Gets the specified callback function address.
*
* \param number The number of the callback function address to get. The valid
* range is from 0 to \ref CY_SYS_SYST_NUM_OF_CALLBACKS - 1.
*
* \return Returns the address of the specified callback function.
* The NULL is returned if the specified address in not initialized or incorrect
* parameter is specified.
*
*******************************************************************************/
Cy_SysTick_Callback Cy_SysTick_GetCallback(uint32_t number)
{
Cy_SysTick_Callback retVal;
if (number < CY_SYS_SYST_NUM_OF_CALLBACKS)
{
retVal = Cy_SysTick_Callbacks[number];
}
else
{
retVal = NULL;
}
return (retVal);
}
/*******************************************************************************
* Function Name: Cy_SysTick_ServiceCallbacks
****************************************************************************//**
*
* The system Tick timer interrupt routine.
*
*******************************************************************************/
static void Cy_SysTick_ServiceCallbacks(void)
{
uint32_t i;
/* Verify that tick timer flag was set */
if (0u != Cy_SysTick_GetCountFlag())
{
for (i=0u; i < CY_SYS_SYST_NUM_OF_CALLBACKS; i++)
{
if (Cy_SysTick_Callbacks[i] != NULL)
{
(void)(Cy_SysTick_Callbacks[i])();
}
}
}
}
/* [] END OF FILE */