/* * Copyright (c) 2020, 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: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * 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. * * * Neither the name of Texas Instruments Incorporated 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 OWNER 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. */ /*!**************************************************************************** * @file dl_systick.h * @brief System Tick Timer (SysTick) Driver Library * @defgroup SYSTICK M0P System Tick Timer (SysTick) * * @anchor ti_dl_m0p_dl_systick_Overview * # Overview * * SysTick is a simple timer that is part of the Cortex-M architecture. Its * intended purpose is to provide a periodic interrupt for an RTOS, but it can * be used for other simple timing purposes. * *
****************************************************************************** */ /** @addtogroup SYSTICK * @{ */ #ifndef ti_dl_m0p_dl_systick__include #define ti_dl_m0p_dl_systick__include #include #include #include #ifdef __cplusplus extern "C" { #endif /* clang-format off */ /** * @brief Redirects DL_SYSTICK_config to CMSIS standard SysTick_Config */ #define DL_SYSTICK_config(x) SysTick_Config(x) /* clang-format on */ /** * @brief Initializes the System Tick Timer (SysTick) * * Initializes the System Tick Timer by configuring the desired period. Resets * the counter so that, once enabled, the SysTick starts counting from 0. Does * not start the timer or enable the interrupt. * * @param[in] period The period in ticks for the SysTick to fire. Value * between 0x00000002 - 0x01000000. */ __STATIC_INLINE void DL_SYSTICK_init(uint32_t period) { SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk; SysTick->LOAD = period - (uint32_t) 1; SysTick->VAL = 0; } /** * @brief Set the period for the SysTick * * Calling this function does not cause the SysTick counter to reload * immediately. If you want to change the period and reset the counter use * the @ref DL_SYSTICK_init function or @ref DL_SYSTICK_resetValue. * * @param[in] period The period in ticks for the SysTick to fire. Value * between 0x00000002 - 0x01000000. */ __STATIC_INLINE void DL_SYSTICK_setPeriod(uint32_t period) { SysTick->LOAD = period - (uint32_t) 1; } /** * @brief Reset the current value of the SysTick * * Resets the current value of the SysTick back to 0, essentially resetting * the period. */ __STATIC_INLINE void DL_SYSTICK_resetValue(void) { SysTick->VAL = 0; } /** * @brief Get the period for the SysTick * * @return The period in ticks for the SysTick to fire * * @retval Value between 0x00000002 - 0x01000000. */ __STATIC_INLINE uint32_t DL_SYSTICK_getPeriod(void) { return (SysTick->LOAD + (uint32_t) 1); } /** * @brief Get the current value of SysTick counter * * @return The current value of the counter in ticks * * @retval Value between 0x00000000 - 0x00FFFFFF. */ __STATIC_INLINE uint32_t DL_SYSTICK_getValue(void) { return SysTick->VAL; } /** * @brief Enable the SysTick interrupt */ __STATIC_INLINE void DL_SYSTICK_enableInterrupt(void) { SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk; } /** * @brief Disable the SysTick interrupt */ __STATIC_INLINE void DL_SYSTICK_disableInterrupt(void) { SysTick->CTRL &= ~(SysTick_CTRL_TICKINT_Msk); } /** * @brief Enable the SysTick, starts counting once enabled * * Once enabled, the SysTick will start counting from whatever value it was * disabled with. To ensure a full period, use @ref DL_SYSTICK_init * or @ref DL_SYSTICK_resetValue before enabling. */ __STATIC_INLINE void DL_SYSTICK_enable(void) { SysTick->CTRL |= (SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk); } /** * @brief Disable the SysTick, stops counting once disabled */ __STATIC_INLINE void DL_SYSTICK_disable(void) { SysTick->CTRL &= ~(SysTick_CTRL_ENABLE_Msk); } /** * @brief Checks if the SysTick is enabled * * @return Returns the enabled status of the SysTick * * @retval true The SysTick is enabled and counting * @retval false The SysTick is disabled and not counting */ __STATIC_INLINE bool DL_SYSTICK_isEnabled(void) { return ( (SysTick->CTRL & SysTick_CTRL_ENABLE_Msk) == SysTick_CTRL_ENABLE_Msk); } #ifdef __cplusplus } #endif #endif /* ti_dl_m0p_dl_systick__include */ /** @}*/