打印

分享一个强大的定时器吧。使用灵活

[复制链接]
149|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
菊江先生|  楼主 | 2018-7-15 11:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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]

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

446

主题

447

帖子

0

粉丝