/** * @file systick.c * Provide access to the system tick with 1 millisecond resolution */ /********************* * INCLUDES *********************/ #include "lv_hal_tick.h" #include /********************* * DEFINES *********************/ #define LV_HAL_TICK_CALLBACK_NUM 32 /********************** * TYPEDEFS **********************/ /********************** * STATIC PROTOTYPES **********************/ /********************** * STATIC VARIABLES **********************/ static uint32_t sys_time = 0; static volatile uint8_t tick_irq_flag; static volatile uint8_t tick_cb_sem; /*Semaphore for tick callbacks*/ static void (*tick_callbacks[LV_HAL_TICK_CALLBACK_NUM])(void); /********************** * MACROS **********************/ /********************** * GLOBAL FUNCTIONS **********************/ /** * You have to call this function in every milliseconds */ void lv_tick_inc(void) { tick_irq_flag = 0; sys_time++; } /** * Get the elapsed milliseconds since start up * @return the elapsed milliseconds */ uint32_t lv_tick_get(void) { uint32_t result; do { tick_irq_flag = 1; result = sys_time; } while(!tick_irq_flag); /*'lv_tick_inc()' clears this flag which can be in an interrupt. Continue until make a non interrupted cycle */ return result; } /** * Get the elapsed milliseconds science a previous time stamp * @param prev_tick a previous time stamp (return value of systick_get() ) * @return the elapsed milliseconds since 'prev_tick' */ uint32_t lv_tick_elaps(uint32_t prev_tick) { uint32_t act_time = lv_tick_get(); /*If there is no overflow in sys_time simple subtract*/ if(act_time >= prev_tick) { prev_tick = act_time - prev_tick; } else { prev_tick = UINT32_MAX - prev_tick + 1; prev_tick += act_time; } return prev_tick; } /********************** * STATIC FUNCTIONS **********************/