stm32的Systick定時器

2021-06-25 21:17:07 字數 2626 閱讀 5332

systick定時器簡介:

systick定時器就是系統滴答定時器,乙個24 位的倒計數定時器,計到0 時,將從reload 暫存器中自動重裝載定時初值。只要不把它在systick 控制及狀態暫存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。systick定時器被**在nvic中,用於產生systick異常(異常號:15)。

systick有四個相關的暫存器:

ctrl             systick 控制和狀態暫存器 

load            systick 自動重裝載除值暫存器 

val               systick 當前值暫存器 

calib           systick 校準值暫存器

韌體庫v3.5中systick的相關函式如下:

systick_clksourceconfig()   //systick時鐘源選擇

systick_config(uint32_t ticks) //初始化systick,時鐘為hclk,並開啟中斷

systick中斷服務函式:

void systick_handler(void);

使用systick查詢延時nus的設計思路:

1.計算出產生1us 需要多少個時鐘週期 fac_us;

2.計算出reload暫存器的值

(也就是產生相應延時所需要的時鐘週期數);

reload=fac_us * nus

3.開啟計數;

4.迴圈檢測計數到0的標誌位;

5.  清空計數器,關閉定時器;

delay_us()函式:

void delay_us(u32nus)

while(temp&0x01&&!(temp&(1<<16)));//等待時間到達

systick->ctrl&=~systick_ctrl_enable_msk;       //關閉計數器

systick->val =0x00;       //清空計數器

}

delay_ms()函式:

//延時nms

//注意nms的範圍

//systick->load為24位暫存器,所以,最大延時為:

//nms<=0xffffff*8*1000/sysclk

//sysclk單位為hz,nms單位為ms

//對72m條件下,nms<=1864

void delay_ms(u16 nms)

while(temp&0x01&&!(temp&(1<<16)));//等待時間到達

systick->ctrl&=~systick_ctrl_enable_msk;       //關閉計數器

systick->val =0x00;       //清空計數器

}

用中斷的方式實現delay:

static__io uint32_t timingdelay;

voiddelay(__io uint32_t ntime)

void systick_handler(void)

}

int main(void)

while(1)

}

STM32之SysTick定時器

systick 作業系統的心跳 systick是系統滴答定時器,可以說是作業系統的的 心跳 它被綁在nvic中,用於產生systick異常 異常號 15 一旦產生systick異常,就會產生滴答中斷,這個滴答中斷對作業系統尤其重要。例如 作業系統可以為多個任務分配不同數目的時間片,確保沒有乙個任務霸...

STM32開發 Systick定時器

參看 stm32菜鳥成長記錄 系統滴答定時器 systick 應用 參看 systick定時器和delay延遲函式 systick定時器被 在nvic中,用於產生systick異常 異常號 15 在以前,大多作業系統需要乙個硬體定時器來產生作業系統需要的滴答中斷,作為整個系統的時基。例如,為多個任務...

STM32關於Systick定時器

delay ms和delay us支援 os 需要用到的三個巨集定義 值為 1,當 os 還未執行時,該巨集定義值為 0。delay ostickspersec,用於表示 os 的時鐘節拍,即 os 每秒鐘任務排程次數。delay osintnesting,用於表示 os 中斷巢狀級別,即中斷巢狀次...