首先中斷,您可以輪詢定時器,沒有必要與中斷矯枉過正。是這些例子使用中斷的原因,但這並不意味着這是使用計時器的唯一方法。
蓋伊Sirton的回答是合理的,但我更喜歡彙編,我可以精確控制它的時鐘週期(只要有在途中沒有得到中斷或其他物品)。計時器通常是,雖然作爲代碼更加輕便一點(改變處理器的時鐘頻率更容易,你必須重新調整環,具有定時,有時候你需要做的是改變初始化代碼使用不同的預分頻器,或者改變尋找計算的計數的那一行),並且允許系統中的中斷和這樣的事情。
在這種情況下,雖然你說的是12MHz的,和一微秒,也就是12條指令是嗎?放入12個小餅。或分支的一些彙編與像10個空指令或8,不管它出來,以彌補在兩個分支管道沖洗。定時器和中斷將耗費超過12個指令週期的開銷。即使在循環中輪詢計時器也會變得渺茫。計數循環將工作太,你需要,雖然和調整理解分支的成本爲:
delay_one_ms:
mov r0,#3
wait:
sub r0,#1 @cortex-m3 means thumb/thumb2 and gas complains about subs.
bne wait
nop @might need some nops to tune the loop accurately
nop
bx lr
調用此函數,是什麼在使用GPIO循環3000萬次領導或UART輸出和秒錶和看到眨眼間隔30秒。
ldr r4,=uart_tx_register_address
mov r5,#0x55
again:
ldr r6,=24000000
str r5,[r4]
top:
bl delay_one_ms
sub r6,#1
bne top
str r5,[r4]
b again
實際上因爲我假定每個分支2個時鐘中,測試環具有3個時鐘,延遲被假定爲是一個總的12個時鐘每循環,使15個時鐘,30秒30000000微秒,理想3000萬個循環,但我需要十二分之一的迴路數來補償。如果您的示波器的時基有些準確,或者至少與您想要的這種延遲一樣準確,那麼這會更容易。
我沒有研究過ARM的支費自己否則我會對此作出評論。這可能是兩三個鍾。所以mov是1,sub是一個循環次數的一倍,這個循環可以說是循環次數的兩倍。兩個分支到這裏來回兩個。 5+(3個*循環)+的NOP = 12。 (3 *循環)+ nops = 7循環是2並且nops是1,是嗎?我覺得串起了許多的NOP一起要容易得多:
delay_one_ms:
nop
nop
nop
nop
nop
nop
nop
nop
bx lr
您可能需要暫時燒幾個指令禁止中斷,如果你使用它們。如果你正在尋找「至少」一微秒,那麼不要擔心它。
它需要多準確?你可以用nops做一個循環,並且爲你的硬件進行校準,即找出每次迭代有多少個週期並計算迭代次數。 –
注意12MHz是(通常是)晶振頻率,它被時鐘電路乘以得到實際的處理器時鐘頻率。 LPC1768可以高達100MHz的頻率運行。 –