IAR For Arm 的精确定时及延时等

网上查了一些,一种是使用循环,但是时间是估算的。还有的是使用intrinsics.h文件中的__delay_cycles(x)函数。

但是在我的IAR 7.8版本中,没有看到此函数。 我使用的是德州仪器TMS570LS系列的芯片,它是有定时功能的,我们可以使用RTI模块的代码,获取定时器开启后的时钟数, 依照我们的配置文件Hal Code Generator中的RTI配置,1000个周期是0.1ms, 这个应该是根据cpu频率不同,可以用hal来查看。

IAR For Arm 的精确定时及延时等_第1张图片


然后我们就可以添加一个函数来获取定时器开启后的tick数。 参数compare表示是那个定时器,根据cpu型号来定取值范围。

uint32_t rtiGetTick(uint32_t compare)
{
    uint32_t tick;
    uint32_t counter = ((rtiREG1->COMPCTRL & (1U << (compare << 2U))) != 0U) ? 1U : 0U;
    tick = rtiREG1->CNT[counter].FRCx;

    return tick;

}

这个函数返回的就是定时器启动后的tick数,按照我的项目的配置,是1000tick数代表0.1ms,这样我们就可以再编写下面的函数。 这样就可以得到一个精度是0.1ms的延时程序了。 需要注意的是,这个函数只有在定时器启动后才可以使用。 

void rtiDelay(uint32_t msec)
{
uint32_t curTick = rtiGetTick(0);

uint32_t endTick = curTick + msec * 1000 * 10;    

while(  curTick < endTick)

{
curTick = rtiGetTick(0);      
}
}

你可能感兴趣的:(IAR For Arm 的精确定时及延时等)