STM32定时器比较多,使用起来也比较混乱。
windows下做过编程的人一定对SetTimer有印象,不过该定时器也不那么好用,因为id要自己维护,并且保证不跟程序中的其他id冲突。
手头上的项目要用到定时器,又不想每次都跑到寄存器里详细设定参数,所以就写了个类似SetTimer的定时器。
注:请在STM32F407上使用该定时器,其他内核需要修改,如M3内核是没有32位定时器的
使用方法:
u8 SetTimer(u32 unTime, u32 unCount, TIMERFUN pHandler,u32 ucPara)
使用SetTimer去向系统申请一个定时器,如果成功,返回定时器ID,失败返回0.为了使定时器ID更有意义,这里设定返回值为定时器编号
这里根据计时时间自动分配定时器。比如你需要一个比较长时间的定时,那么SetTimer会给你分配一个32位定时器(M4内核)
参数:
unTime:计时时间(ms,如需ns请自行修改或者使用delay)
unCount :计时器运行次数,0为无限运行,非零的话,运行unCount次后,该定时器关闭。
pHandler:定时器定时后执行的函数,该处如果不需要执行,可填0(什么都不需要做,干嘛要开启定时器?),当然这里可以自己定义函数指针类型(比如传2个参数或者变参:呃,变参太变态)
ucPara:函数参数
/*关闭定时器
tmrId:定时器ID
*/
void KillTimer(TIMER tmrId);
例如:
[mw_shl_code=c,true] //每隔0.5s反转4bit灯
tmrIrb = SetTimer(500, 0, IndRvsBit, 4);
printf("IndRvsBit Timer Id: %d
",tmrIrb);
if(0 != tmrIrb)
{
ucCnt = SetTimer(10 * 1000, 1, KillBlink, tmrIrb); //10s后关闭位4反转
printf("KillBlink Timer Id: %d
",ucCnt);
}[/mw_shl_code]
[mw_shl_code=c,true][/mw_shl_code]
[mw_shl_code=c,true][/mw_shl_code]
[mw_shl_code=c,true][/mw_shl_code]
[mw_shl_code=c,true][/mw_shl_code]
[mw_shl_code=c,true][/mw_shl_code]
[mw_shl_code=c,true][/mw_shl_code]
这里要提前定义好参数里的函数指针
[mw_shl_code=c,true]void KillBlink(u8 ucOpt)
{
// RTC_ShutWakeUp();
KillTimer(ucOpt);
printf("KillBlink(%d)
", ucOpt);
}
void AdPickTime(u8 ucOpt)
{
PushCmd(0xF2,0);
}
void IndRvsBit(u8 ucOpt)
{
SubBoardIndSingle(4, acCurInd[4] ^ (1 << ucOpt));
}[/mw_shl_code] |