在STM32中處處會用到延時函數(shù),一般而言,對于普通的控制延時,并不會要求特別精確,所以可以使用普通的延時函數(shù),例如
void delay(u32 time)
{
while(time--);
}
但是在某些情況下,例如讀取傳感器數(shù)據(jù),就需要精確的延時,對于這種,這時候可以考慮使用軟件定時器或者系統(tǒng)定時器進行精確定時延時。在這篇博文中不在詳細對這兩種進行描述。
本文主要是針對某些情況下,使用系統(tǒng)滴答定時器或者軟件定時器對工程造成阻塞影響或者定時器用作其他用途,不夠使用的情況下的另一種解決方法。
因此本文主要是解決通過普通延時函數(shù)實現(xiàn)精確的定時。
博主測試的開發(fā)板芯片是STM32f103c8t6,外部晶振是8M,系統(tǒng)使用經(jīng)過倍頻至72M,編譯器選擇的Keil5,使用的是庫函數(shù)開發(fā)。通過普通延時函數(shù)來實現(xiàn)讀取溫濕度傳感器DHT11的數(shù)據(jù),由于使用的freeRTOS操作系統(tǒng),同時各個軟件定時器用作其他用途。。。理由不再贅述。
剛開始,通過使用__NOP()函數(shù),因為使用了8M晶振9倍頻,72MHz,所以一個nop約等于1/72us,所以使用72個nop函數(shù)為一個us,然后根據(jù)需要的定時時間進行計算。
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); } 之后通過測試讀取傳感器數(shù)據(jù),得到了數(shù)據(jù),證明該延時函數(shù)相對比較準確,但是由于博主身邊并沒有邏輯分析儀或示波器,所以不能對其延時時間進行精確測試。 第二種延時方法是在電子發(fā)燒友論壇看到版主通過邏輯分析儀對另一種普通延時進行的精確測試。同樣可以實現(xiàn)讀取數(shù)據(jù)。具體延時函數(shù)如下所示: void delay_us(u32 time) { u32 i=8*time; while(i--); } void delay_ms(u32 time) { u32 i=8000*time; while(i--); }
上海意泓電子科技有限責任公司 版權所有 未經(jīng)授權禁止復制或鏡像
CopyRight 2020-2025 www.hljhgw.com All rights reserved 滬ICP備2021005866號