📄 tmr.c
字号:
/********************************************************************************************************
* 文 件 名 : TMR.C
* 说 明 :
********************************************************************************************************/
#define TMR_GLOBALS
#include "includes.h"
#if TMR_MODULE_EN > 0
/********************************************************************************************************
* 功 能 : 设置软定时器触发函数
* 入 口 : n 指定软定时 最大为 0..TMR_MAX_TMR-1
* fnct 指向触发的函数的指针
* arg 指向触发函数传人数据的指针
* tenths 1/10秒的时间
* 返 回 : 无
********************************************************************************************************/
void TmrCfgFnct (INT8U n, void (*fnct)(void), INT16U tenths)
{
TMR *ptmr;
if (n < TMR_MAX_TMR) {
OS_ENTER_CRITICAL();
ptmr = &TmrTbl[n];
ptmr->TmrFnct = fnct;
ptmr->TmrInit = tenths;
ptmr->TmrCtr = tenths;
OS_EXIT_CRITICAL();
}
}
/********************************************************************************************************
* 功 能 : 设置1/10秒的时间
* 入 口 : n 指定的软定时器编号 0..TMR_MAX_TMR-1
* tenths 1/10秒的时间
* 返 回 : None.
********************************************************************************************************/
void TmrSetT (INT8U n, INT16U tenths)
{
TMR *ptmr;
if (n < TMR_MAX_TMR) {
OS_ENTER_CRITICAL();
ptmr = &TmrTbl[n];
ptmr->TmrInit = tenths;
ptmr->TmrCtr = tenths;
OS_EXIT_CRITICAL();
}
}
/*********************************************************************************************************
* 功 能 : 初始化软定时的工作环境
* 入 口 : 无
* 返 回 : 无
********************************************************************************************************/
void TmrInit (void)
{
INT8U i;
TMR *ptmr;
ptmr = &TmrTbl[0];
for (i=0; i<TMR_MAX_TMR; i++) {
ptmr->TmrEn = FALSE;
ptmr->TmrCtr = 0;
ptmr->TmrInit = 0;
ptmr->TmrFnct = NULL;
ptmr++;
}
}
/********************************************************************************************************
* 功 能 : 启动一个软定时器
* 入 口 : n 指定的软定时器编号
* 返 回 : 无.
********************************************************************************************************/
void TmrStart (INT8U n)
{
if (n < TMR_MAX_TMR) {
OS_ENTER_CRITICAL();
TmrTbl[n].TmrEn = TRUE;
OS_EXIT_CRITICAL();
}
}
/********************************************************************************************************
* 功 能 : 停止一个正在工作的软定时器
* 入 口 : n 指定的软定时器编号
* 返 回 : 无
********************************************************************************************************/
void TmrStop (INT8U n)
{
if (n < TMR_MAX_TMR) {
OS_ENTER_CRITICAL();
TmrTbl[n].TmrEn = FALSE;
OS_EXIT_CRITICAL();
}
}
/********************************************************************************************************
* 功 能 : 这个是软件定时器的维护任务 要求中断中能处理1/10秒的时间
* 入 口 : None.
* 返 回 : None.
* 说明 : 1) 当一个软定时器计时到时 将触发一个外部的处理函数
********************************************************************************************************/
void TmrTask (void )
{
INT8U i;
void (*pfnct)(void);
TMR *ptmr;
pfnct = NULL;
ptmr = &TmrTbl[0];
for (i=0; i <TMR_MAX_TMR; i++) {
//OS_ENTER_CRITICAL();
//cli();
if (ptmr->TmrEn == TRUE) {
if (ptmr->TmrCtr > 0) {
ptmr->TmrCtr--;
if (ptmr->TmrCtr == 0) {
ptmr->TmrCtr = ptmr->TmrInit; // 复位时间
pfnct = ptmr->TmrFnct; // 功能函数
}
}
}
//OS_EXIT_CRITICAL();
//sei();
if (pfnct != NULL) {
(*pfnct)();
pfnct = NULL;
}
ptmr++;
}
}
#endif
/********************************************************************************************************
* End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -