1. 程式人生 > >STM32中通過普通延時函式來精確延時

STM32中通過普通延時函式來精確延時

在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<nTimer;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--);
}
本圖高清圖片點選開啟連結

更過資訊見電子發燒友(bbs.elecfans.com/forum.php?mod=viewthread&tid=428925)