/****************************************************************************** * Filename: systick.h * Revised: 2015-11-16 19:41:47 +0100 (Mon, 16 Nov 2015) * Revision: 45094 * * Description: Prototypes for the SysTick driver. * * Copyright (c) 2015, Texas Instruments Incorporated * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1) Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2) Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3) Neither the name of the ORGANIZATION nor the names of its contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ //***************************************************************************** // //! \addtogroup system_cpu_group //! @{ //! \addtogroup systick_api //! @{ // //***************************************************************************** #ifndef __SYSTICK_H__ #define __SYSTICK_H__ //***************************************************************************** // // If building with a C++ compiler, make all of the definitions in this header // have a C binding. // //***************************************************************************** #ifdef __cplusplus extern "C" { #endif #include #include #include #include #include #include #include //***************************************************************************** // // API Functions and Prototypes // //***************************************************************************** //***************************************************************************** // //! \brief Enables the SysTick counter. //! //! This will start the SysTick counter. If an interrupt handler has been //! registered, it will be called when the SysTick counter rolls over. //! //! \note Calling this function will cause the SysTick counter to (re)commence //! counting from its current value. The counter is not automatically reloaded //! with the period as specified in a previous call to \ref SysTickPeriodSet(). If //! an immediate reload is required, the NVIC_ST_CURRENT register must be //! written to force this. Any write to this register clears the SysTick //! counter to 0 and will cause a reload with the supplied period on the next //! clock. //! //! \return None // //***************************************************************************** __STATIC_INLINE void SysTickEnable(void) { // // Enable SysTick. // HWREG(NVIC_ST_CTRL) |= NVIC_ST_CTRL_CLK_SRC | NVIC_ST_CTRL_ENABLE; } //***************************************************************************** // //! \brief Disables the SysTick counter. //! //! This will stop the SysTick counter. If an interrupt handler has been //! registered, it will no longer be called until SysTick is restarted. //! //! \return None // //***************************************************************************** __STATIC_INLINE void SysTickDisable(void) { // // Disable SysTick. // HWREG(NVIC_ST_CTRL) &= ~(NVIC_ST_CTRL_ENABLE); } //***************************************************************************** // //! \brief Registers an interrupt handler for the SysTick interrupt. //! //! This sets the handler to be called when a SysTick interrupt occurs. //! //! \param pfnHandler is a pointer to the function to be called when the //! SysTick interrupt occurs. //! //! \return None //! //! \sa \ref IntRegister() for important information about registering interrupt //! handlers. // //***************************************************************************** __STATIC_INLINE void SysTickIntRegister(void (*pfnHandler)(void)) { // // Register the interrupt handler, returning an error if an error occurs. // IntRegister(INT_SYSTICK, pfnHandler); // // Enable the SysTick interrupt. // HWREG(NVIC_ST_CTRL) |= NVIC_ST_CTRL_INTEN; } //***************************************************************************** // //! \brief Unregisters the interrupt handler for the SysTick interrupt. //! //! This function will clear the handler to be called when a SysTick interrupt //! occurs. //! //! \return None //! //! \sa \ref IntRegister() for important information about registering interrupt //! handlers. // //***************************************************************************** __STATIC_INLINE void SysTickIntUnregister(void) { // // Disable the SysTick interrupt. // HWREG(NVIC_ST_CTRL) &= ~(NVIC_ST_CTRL_INTEN); // // Unregister the interrupt handler. // IntUnregister(INT_SYSTICK); } //***************************************************************************** // //! \brief Enables the SysTick interrupt. //! //! This function will enable the SysTick interrupt, allowing it to be //! reflected to the processor. //! //! \note The SysTick interrupt handler does not need to clear the SysTick //! interrupt source as this is done automatically by NVIC when the interrupt //! handler is called. //! //! \return None // //***************************************************************************** __STATIC_INLINE void SysTickIntEnable(void) { // // Enable the SysTick interrupt. // HWREG(NVIC_ST_CTRL) |= NVIC_ST_CTRL_INTEN; } //***************************************************************************** // //! \brief Disables the SysTick interrupt. //! //! This function will disable the SysTick interrupt, preventing it from being //! reflected to the processor. //! //! \return None // //***************************************************************************** __STATIC_INLINE void SysTickIntDisable(void) { // // Disable the SysTick interrupt. // HWREG(NVIC_ST_CTRL) &= ~(NVIC_ST_CTRL_INTEN); } //***************************************************************************** // //! \brief Sets the period of the SysTick counter. //! //! This function sets the rate at which the SysTick counter wraps; this //! equals to the number of processor clocks between interrupts. //! //! \note Calling this function does not cause the SysTick counter to reload //! immediately. If an immediate reload is required, the NVIC_ST_CURRENT //! register must be written. Any write to this register clears the SysTick //! counter to 0 and will cause a reload with the \c ui32Period supplied here //! on the next clock after the SysTick is enabled. //! //! \param ui32Period is the number of clock ticks in each period of the //! SysTick counter; must be between 1 and 16,777,216 (0x1000000), both included. //! //! \return None // //***************************************************************************** __STATIC_INLINE void SysTickPeriodSet(uint32_t ui32Period) { // // Check the arguments. // ASSERT((ui32Period > 0) && (ui32Period <= 16777216)); // // Set the period of the SysTick counter. // HWREG(NVIC_ST_RELOAD) = ui32Period - 1; } //***************************************************************************** // //! \brief Gets the period of the SysTick counter. //! //! This function returns the rate at which the SysTick counter wraps; this //! equals to the number of processor clocks between interrupts. //! //! \return Returns the period of the SysTick counter. // //***************************************************************************** __STATIC_INLINE uint32_t SysTickPeriodGet(void) { // // Return the period of the SysTick counter. // return(HWREG(NVIC_ST_RELOAD) + 1); } //***************************************************************************** // //! \brief Gets the current value of the SysTick counter. //! //! This function returns the current value of the SysTick counter; this will //! be a value between the (period - 1) and zero, both included. //! //! \return Returns the current value of the SysTick counter // //***************************************************************************** __STATIC_INLINE uint32_t SysTickValueGet(void) { // // Return the current value of the SysTick counter. // return(HWREG(NVIC_ST_CURRENT)); } //***************************************************************************** // // Mark the end of the C bindings section for C++ compilers. // //***************************************************************************** #ifdef __cplusplus } #endif #endif // __SYSTICK_H__ //***************************************************************************** // //! Close the Doxygen group //! @} //! @} // //*****************************************************************************