打印
[技术问答]

M451计时器的时延函数TIMER

[复制链接]
522|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
两只袜子|  楼主 | 2022-7-21 10:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void TIMER_Delay(TIMER_T *timer, uint32_t u32Usec)    //TIMER0,100
{
    uint32_t u32Clk = TIMER_GetModuleClock(timer);  //#define TIMER0               ((TIMER_T *) TMR01_BASE)   
uint32_t u32Prescale = 0UL, u32Delay = (SystemCoreClock / u32Clk) + 1UL;//SystemCoreClock为系统时钟源为HXT,频率12MHz; u32Delay = (12/12)+1=2
    uint32_t u32Cmpr, u32NsecPerTick;

    /* Clear current timer configuration */
    timer->CTL = 0UL;
    timer->EXTCTL = 0UL;

    if(u32Clk <= 1000000UL)   /* min delay is 1000 us if timer clock source is <= 1 MHz */
    {
        if(u32Usec < 1000UL)
        {
            u32Usec = 1000UL;
        }
        if(u32Usec > 1000000UL)
        {
            u32Usec = 1000000UL;
        }
    }
    else
    {
        if(u32Usec < 100UL)
        {
            u32Usec = 100UL;
        }
        if(u32Usec > 1000000UL)
        {
            u32Usec = 1000000UL;
        }
    }

    if(u32Clk <= 1000000UL)
    {
        u32Prescale = 0UL;
        u32NsecPerTick = 1000000000UL / u32Clk; //若u32Clk为12M,则1*10^9/12*10^6
        u32Cmpr = (u32Usec * 1000UL) / u32NsecPerTick; //x*1000/83
    }
                //u32Usec*u32Clk*10^(-6)
    else
    {
        u32Cmpr = u32Usec * (u32Clk / 1000000UL);
        u32Prescale = (u32Cmpr >> 24);  /* for 24 bits CMPDAT */
        if (u32Prescale > 0UL) //若u32Cmpr大于16777216则大于0;即u32Clk大于16.7MHz
            u32Cmpr = u32Cmpr / (u32Prescale + 1UL); //除以2
    }

    timer->CMP = u32Cmpr;//若为12MHz,则每次计数时间为1/12us
    timer->CTL = TIMER_CTL_CNTEN_Msk | TIMER_ONESHOT_MODE | u32Prescale;



其中u32Usec为输入的时延参数,单位us;u32Clk为时钟频率,单位Hz
函数限制时延必须在100us到1秒之间;频率小的话限制更强

在官方BSP里边的时延函数void TIMER_Delay(TIMER_T *timer, uint32_t u32Usec)里面为什么要通过
时钟频率来限制可用时延长短?我测试了在范围外,如10us,结果是真实显示时延有误差。


新手入坑,有没有大佬懂的,请指教。

使用特权

评论回复
沙发
asmine| | 2022-7-21 18:42 | 只看该作者
要精确的,用定时器

使用特权

评论回复
板凳
sparrow054| | 2022-8-1 20:13 | 只看该作者
定时器是比较常规的模块了

使用特权

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

本版积分规则

2038

主题

7364

帖子

10

粉丝