#include "user_timer.h" #include "ycos.h" /******************************************************************************** * @file user_timer.c * @author 晏诚科技 Mr.Wang * @version V1.0.0 * @date 11-Dec-2018 * @brief timer封装 ****************************************************************************** * @attention: *******************************************************************************/ /*********应用层外部调用文件**************/ /*****************************************/ /***************************************** *驱动内部使用常变量 ****************************************/ volatile uint32_t systickCount = 0 ; /************************************************************************************************** * 名 称: void YcOSTimerSchedulerInit(TIMERFP pLowPrioTaskCallback, TIMERFP pHighPrioTaskCallback) * 功 能: 使用TIMER5作为YcOS系统任务轮询时的调度器定时器,负责轮询处理需要轮询的任务。 * 入口参数: * @param1 pLowPrioTaskCallback 低优先级任务调度器的定时器中断回调函数,这里我们设置中断回调函数为YcOSLowPrioSchedulerCallback * @param2 pHighPrioTaskCallback 高优先级任务调度器的定时器中断回调函数,这里我们设置中断回调函数为YcOSHighPrioSchedulerCallback * 注 意: 定时器10ms中断一次。中断优先级设置为最低,保证任何其他中断都能抢占,因为所有任务都会在该定时器中断中运行。 ***************************************************************************************************/ void YcOSTimerSchedulerInit(TIMERFP pLowPrioTaskCallback, TIMERFP pHighPrioTaskCallback) { Timerx_Init(TIMER5, 1000/YCOSTICK_RATE_HZ, INT_RANK_15, DISABLE) ; //10ms中断一次,中断优先级设置最低,且整个系统中无其他同优先级中断 Timer_RegHookCallback(TIMER5, pLowPrioTaskCallback) ; Timerx_Init(TIMER4, 1000/YCOSTICK_RATE_HZ, INT_RANK_14, DISABLE) ; //10ms中断一次,中断优先级设置次最低,且整个系统中无其他同优先级中断 Timer_RegHookCallback(TIMER4, pHighPrioTaskCallback) ; } /************************************************************************************************** * 名 称: void YcOSSchedulerStart(void) * 功 能: 开启YcOS轮询任务调度器定时器 ***************************************************************************************************/ void YcOSSchedulerStart(void) { Timerx_Open(TIMER5) ; Timerx_Open(TIMER4) ; } /************************************************************************************************** * 名 称: void YcOSSchedulerClose(void) * 功 能: 关闭YcOS轮询任务调度器定时器 ***************************************************************************************************/ void YcOSSchedulerClose(void) { Timerx_Close(TIMER5) ; Timerx_Close(TIMER4) ; } /************************************************************************************************** * 名 称: void Calculate_Timer_Init(void) * 功 能: 使用TIMER7作为节拍计数器,100ms中断一次 ***************************************************************************************************/ void Calculate_Timer_Init(void) { Timerx_Init(TIMER7, 100, INT_RANK_12, DISABLE) ; //100ms中断一次 Timer_RegHookCallback(TIMER7, Calculate_Run_Time) ; } /************************************************************************************************** * 名 称: void Calculate_Start(void) * 功 能: 开启计时器 ***************************************************************************************************/ void Calculate_Start(void) { Timerx_Open(TIMER7) ; systickCount = 0 ; } /************************************************************************************************** * 名 称: uint32_t Calculate_Over(void) * 功 能: 结束节拍计时器并返回节拍数 ***************************************************************************************************/ uint32_t Calculate_Over(void) { Timerx_Close(TIMER7) ; return systickCount ; } /************************************************************************************************** * 名 称: void Calculate_Run_Time(void) * 功 能: 节拍计时器timer7中断回调函数 ***************************************************************************************************/ void Calculate_Run_Time(void) { systickCount++ ; if( systickCount >= 0xFFFFFFFF) //systickCount溢出 { systickCount = 0 ; } }