IAR For Arm 的精確定時及延時等

網上查了一些,一種是使用循環,但是時間是估算的。還有的是使用intrinsics.h文件中的__delay_cycles(x)函數。

但是在我的IAR 7.8版本中,沒有看到此函數。 我使用的是德州儀器TMS570LS系列的芯片,它是有定時功能的,我們可以使用RTI模塊的代碼,獲取定時器開啓後的時鐘數, 依照我們的配置文件Hal Code Generator中的RTI配置,1000個週期是0.1ms, 這個應該是根據cpu頻率不同,可以用hal來查看。


然後我們就可以添加一個函數來獲取定時器開啓後的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);      
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章