在STM32中處處會用到延時函數,一般而言,對于普通的控制延時,并不會要求特別精確,所以可以使用普通的延時函數,例如
void delay(u32 time)
{
while(time--);
}
但是在某些情況下,例如讀取傳感器數據,就需要精確的延時,對于這種,這時候可以考慮使用軟件定時器或者系統定時器進行精確定時延時。在這篇博文中不在詳細對這兩種進行描述。
本文主要是針對某些情況下,使用系統滴答定時器或者軟件定時器對工程造成阻塞影響或者定時器用作其他用途,不夠使用的情況下的另一種解決方法。
因此本文主要是解決通過普通延時函數實現精確的定時。
博主測試的開發板芯片是STM32f103c8t6,外部晶振是8M,系統使用經過倍頻至72M,編譯器選擇的Keil5,使用的是庫函數開發。通過普通延時函數來實現讀取溫濕度傳感器DHT11的數據,由于使用的freeRTOS操作系統,同時各個軟件定時器用作其他用途。。。理由不再贅述。
剛開始,通過使用__NOP()函數,因為使用了8M晶振9倍頻,72MHz,所以一個nop約等于1/72us,所以使用72個nop函數為一個us,然后根據需要的定時時間進行計算。
void delay_us(u32 nTimer)
{
u32 i=0;
for(i=0;i __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP(); __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP(); __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP(); __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP(); __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP(); } } void delay_ms(u32 nTimer) { u32 i=1000*nTimer; delay_us(i); } 之后通過測試讀取傳感器數據,得到了數據,證明該延時函數相對比較準確,但是由于博主身邊并沒有邏輯分析儀或示波器,所以不能對其延時時間進行精確測試。 第二種延時方法是在電子發燒友論壇看到版主通過邏輯分析儀對另一種普通延時進行的精確測試。同樣可以實現讀取數據。具體延時函數如下所示: void delay_us(u32 time) { u32 i=8*time; while(i--); } void delay_ms(u32 time) { u32 i=8000*time; while(i--); }