1樓:來自火星的世界
微控制器程式設計過程中經常用到延時函式,最常用的莫過於微秒級延時delay_us(
)和毫秒級delay_ms(
)。1.普通延時法這個比較簡單,讓微控制器做一些無關緊要的工作來打發時間,經常用迴圈來實現,不過要做的比較精準還是要下一番功夫。
下面的**是在網上搜到的,經測試延時比較精準。//粗延時函式,微秒
void delay_us(u16 time)
u16 i=0;
while(time--)
i=10; //自己定義
while(i--) ;
//毫秒級的延時
void delay_ms(u16 time)
u16 i=0;
while(time--)
i=12000; //自己定義
while(i--) ;
}2.systick 定時器延時cm3 核心的處理器,內部包含了乙個systick
定時器,systick 是乙個24 位的倒計數定時器,當計到0 時,將從reload
暫存器中自動重裝載定時初值。只要不把它在systick
控制及狀態暫存器中的使能位清除,就永不停息。systick 在stm32
的參考手冊裡面介紹的很簡單,其詳細介紹,請參閱《cortex-m3 權威指南》。
這裡面也有兩種方式實現:a.中斷方式
如下,定義延時時間time_delay,systick_config()定義中斷時間段,在中斷中遞減time_delay,從而實現延時。
volatile unsigned long time_delay; //
延時時間,注意定義為全域性變數
//延時n_ms
void delay_ms(volatile unsigned long nms)
//systick分頻--1ms的系統時鐘中斷
if (systick_config(systemfrequency/1000))
while (1);
time_delay=nms;//讀取定時時間
while(time_delay);
systick->ctrl=0x00; //關閉計數器
systick->val =0x00; //清空計數器
//延時nus
void delay_us(volatile unsigned long nus)
//systick分頻--1us的系統時鐘中斷
if (systick_config(systemfrequency/1000000))
while (1);
time_delay=nus;//讀取定時時間
while(time_delay);
systick->ctrl=0x00; //關閉計數器
systick->val =0x00; //清空計數器
} //在中斷中將time_delay遞減。實現延時void
systick_handler(void)
if(time_delay)
time_delay--;
2樓:匿名使用者
以systick的初值是720為例,系統時鐘為72m。systick記720個數產生一次中斷。這樣算也就是1秒產生100000次中斷(1次10us)。
當delay(x)中x大於0時會將x傳給乙個全域性的變數使他在每發生一次中斷之後自減1.系統卡在等待這個變數變為零的死迴圈上直到這個全域性來量變為零。
3樓:匿名使用者
首先取決於你的時鐘頻率選定為多少。
以24位的systick定時器為例,在3.5版本的庫函式(該版本簡化了對該計時器的配置函式)中,呼叫函式 systeminit(); 初始化systick計時器為stm32主時鐘的8分頻,假設主頻達到72mhz
則此時計時器的頻率為9mhz,即1秒可 向下記數 9000000(9m)次。
f=9mhz,所以週期為t=1/f,即1/9000000。
再呼叫systick_config(systemcoreclock / x) (x表示乙個數,填入多少就能獲得 1/x 秒數)
delay中呼叫這些便可實現精確計時。
例如void delay(vu32 count);然後再在stm32f10x_it.c 檔案中的定義void systick_handler(void)就可以實現計時了。
回答感覺夠詳細的話就採納吧~
微控制器: _nop_和delay(1)延時時間是多久?和晶振頻率的關係是什麼?
4樓:修者世界
_nop_的延時
時間是乙個機器週期,與晶振的關係是:osc/12/1000000微秒比如12m晶振,=12*1000000/12/1000000=1usdelay(1)則不知道是多少延時時間了,這與你的子程式本身有關。比如:
delay(unsigned char a)那麼delay(1)則是在12m晶振的情況下延時約為1毫秒。
5樓:lq右邊
_nop_只是一條語句,就是空操作,占用一條指令週期,晶振週期的12倍就是這個時間了,delay(1)的話這就沒法說了,得看你的delay函式怎麼定義了,因為函式裡邊定義的延時不一樣
stm32學習困惑,stm32 學習困惑 30
正點原子的iap例程,應該能幫到你一點。stm32的內部快閃記憶體 flash 地址起始於0x08000000,一般情況下,程式檔案就從此地 址開始寫入。此外stm32是基於cortex m3核心的微控制器,其內部通過一張 中斷向量表 來響應中斷,程式啟動後,將首先從 中斷向量表 取出復位中斷向量執...
對於stm32為什麼,對於STM32,為什麼 GPIOA CRH 0X0F0FFFFF 的意思是PA13,15設定成輸入,線上等
認真看下手冊,下面是我引用的一段,應該能助你理解了 埠低配置暫存器暫存器的復位值為0x4444 4444,復位值其實就是配置埠為浮空輸 入模式。stm32的crl控制著每個io埠 a g 的低8位的模式。每 個io埠的位占用crl的4個位,高兩位為cnf,低兩位為mode。這裡我們可以記住幾個 常用...
stm32復位問題,STM32微控制器的復位問題
stm32復位腳有內部上拉電阻,執行是沒什麼問題,只是沒辦法手動復位而且上電覆位不可靠,最好接個104左右的電容到復位腳,確保上電時可靠復位。 這個疏忽不應該,但也可以理解。軟體復位是指程式執行過程中,通過向控制暫存器寫入特定資料,實現復位。現在你沒有硬體復位電路,程式啟動都成問題,怎麼實行軟體復位...