利用STM32的SysTick設計精確延時函式

2021-06-07 04:05:05 字數 1421 閱讀 8231

在專案中使用i2c介面感測器時要求有比較精確的延時,在網上搜了下,如果不想用中斷systick定時器可以做到,找到如下資料:

主要仿照原子的《stm32

不完全手冊》。

systick 

的時鐘固定為

hclk 

時鐘的1/8

,在這裡我們選用內部時鐘源

72m,所以

systick

的時鐘為

9m,即

systick

定時器以

9m的頻率遞減。

systick 

主要包含

ctrl

、load

、val

、calib 等4 

個暫存器,

systick->ctrl

位段名稱

型別復位值

描述countflag

r如果在上次讀本暫存器後systick已為0

,則該位為1,若

讀該位自動清零

clksource

rw0:外部時鐘源 

1:內部時鐘

tickint

rw0:減到

0無動作;

1:減到0產生

systick

異常請求

enable

rwsystick定時器使能位

systick-> load

位段名稱

型別復位值

描述23:0

reload

rw減到0

時被重新裝載的值

systick-> val

位段名稱

型別復位值

描述23:0

current

rw讀取時返回當前倒計數的值,寫則清零,同時還會清除在systick

控制及狀態暫存器中的

countflag 標誌

systick-> calib 不常用,在這裡我們也用不到,故不介紹了。

/*定時器初始化函式*/

void delay_init(u8t sysclk) //sysclk為系統時鐘頻率除以1000000後的值,例:如果系統時鐘頻率為72mhz,則呼叫該函式時此處的實參為72

/*1微秒延時函式*/

void delay_us(u32t nus)

while(temp&0x01&&!(temp&0x10000));

systick->ctrl=0x00;

systick->val=0x00;

}/*1毫秒延時函式*/

void delay_ms(u16t nms)

while(temp&0x01&&!(temp&0x10000));

systick->ctrl=0x00;

systick->val=0x00;

}

stm32利用SysTick實現精確定時

stm32定時器資源雖然豐富,但是在一些專案中,我們任然希望不借助傳統定時器實現精確延時,這樣在面對一些對定時器資源需求多的專案我們剩下資源用來做該做事情。stm32用的是arm cortex mx系列的核心,該核心具有乙個滴答時鐘,這個滴答時鐘大意就是在配置完時鐘源和使能以後能進入到中斷處理函式中...

stm32的Systick定時器

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

Stm32學習(三)Systick的學習

1.systick定時器 systick定時器,是乙個簡單的定時器,對於cm3,cm4核心晶元,都有systick定時器。systick定時器常用來做延時,或者實時系統的心跳時鐘。這樣可以節省mcu資源,不用浪費乙個定時器。比如ucos中,分時復用,需要乙個最小的時間戳,一般在stm32 ucos系...