UCOSII软件定时器

一、基本知识

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;
}


  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值