網上查了一些,一種是使用循環,但是時間是估算的。還有的是使用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);
}
}