一、基本知识
1、创建定时器
OS_TMR *OSTmrCreate
(
INT32U dly,
INT32U period,
INT8U opt,
OS_TMR_CALLBACK callback,
void *callback_arg,
INT8U *pname,
INT8U *perr
)
入口参数解释:
(1)dly:延时时间(单位:(1/OS_TMR_CFG_TICKS_PER_SEC)秒)
如果参数opt为:OS_TMR_OPT_ONE_SHOT,则dly表示定时器超时时间
如果参数opt为:OS_TMR_OPT_PERIODIC,则dly表示定时器在开始循环模式前等待第一次启动的超时时间
(2)period:定时器重复运行的时间周期(单位:(1/OS_TMR_CFG_TICKS_PER_SEC)秒)
如果参数opt为:OS_TMR_OPT_PERIODIC,则period表示定时器自动周期重启的时间
如果参数opt为:OS_TMR_OPT_ONE_SHOT,则period无效
(3)opt:选择定时器运行模式
如果参数opt为:OS_TMR_OPT_PERIODIC,则表示定时器会自动重载超时时间,周期运行
如果参数opt为:OS_TMR_OPT_ONE_SHOT,则表示定时器只运行一次
(4)callback:超时处理回调函数(定时器中断服务程序)
必须定义成类似这种函数接口的形式:void MyCallback (OS_TMR *ptmr, void *p_arg);
当定时器时间到了,就执行这个函数
(5)callback_arg:当callback被调用时传递给callback的入口参数
(6)pname:定时器的名称(是一个字符串,如"Timer0")
(7)*perr:定时器错误码,是下面之一:
OS_ERR_NONE:没有错误
OS_ERR_TMR_INVALID_DLY:指定了一个无效的延时时间
OS_ERR_TMR_INVALID_PERIOD:指定了一个无效的周期
OS_ERR_TMR_INVALID_OPT:指定了一个无效的选项
OS_ERR_TMR_ISR :在中断服务程序里调用错误
OS_ERR_TMR_NON_AVAIL:定时器池里没有空闲的定时器
2、启动定时器
BOOLEAN OSTmrStart (OS_TMR *ptmr, INT8U *perr)
这个函数是用来被应用程序调用,来启动定时器的。
入口参数解释:
(1)ptmr:指向待启动的定时器
(2)*perr:错误码
μC/OS-II定时器的创建、启动等函数不能在中断服务程序里调用
二、过程
于定时器相关的函数
OSTmrCreate();
OSTmrDel();
OSTmrNameGet();
OSTmrRemainGet();
OSTmrStateGet();
OSTmrStart();
OSTmrStop();
OSTmrSignal();
1、定义定时器
2、创建定时器
3、写定时器回调函数
4、启动定时器
5、停止定时器
OS_TMR *timer1; //定时器
OS_TMR *timer2;
void timer1CallBack(); //定时器回调函数
void timer2CallBack();
#define START_TASK_PRIO 10
#define START_STK_SIZE 64
OS_STK START_TASK_STK[START_STK_SIZE];
void startTask(void *p_arg);
#define SCAN_TASK_PRIO 7
#define SCAN_STK_SIZE 64
OS_STK SCAN_TASK_STK[SCAN_STK_SIZE];
void scanTask(void *p_arg);
int main()
{
delay_init(168);
LED_Init();
KEY_Init();
OSInit();
OSTaskCreate(startTask, (void*)0, (OS_STK*)&START_TASK_STK[START_STK_SIZE - 1], START_TASK_PRIO);
OSStart();
}
//开始任务,创建两个任务后在后面不再使用,删除掉开始任务
void startTask(void *p_arg)
{
OS_CPU_SR cpu_sr=0;
INT8U err = 0;
p_arg = p_arg;
OS_ENTER_CRITICAL();
timer1 = OSTmrCreate(10, 10, OS_TMR_OPT_ONE_SHOT, timer1CallBack, (void*)0, "OS_TIMER1", &err);//创建定时器
timer2 = OSTmrCreate(10, 10, OS_TMR_OPT_PERIODIC, timer2CallBack, (void*)0, "OS_TIMER2", &err);
OSTaskCreate(scanTask, (void*)0, (OS_STK*)&SCAN_TASK_STK[SCAN_STK_SIZE - 1], SCAN_TASK_PRIO); //创建任务
OSTaskSuspend(START_TASK_PRIO);
OS_EXIT_CRITICAL();
}
//按键扫描任务
void scanTask(void *p_arg)
{
u8 key, num;
INT8U err = 0;
p_arg = p_arg;
while(1)
{
key = KEY_Scan(0);
switch(key)
{
case WKUP_PRES:
OSTmrStart(timer1, &err);//启动定时器
break;
case KEY0_PRES:
OSTmrStart(timer2, &err);
break;
case KEY1_PRES: //关闭定时器
break;
}
OSTimeDlyHMSM(0, 0, 0, 10);
}
}
//LED灯亮灭
void timer1CallBack()
{
LED0 =~ LED0;
}
//LED灯亮灭
void timer2CallBack()
{
LED1 =~ LED1;
}