stm32中systick具體延時時間怎麼計算的

2021-12-25 08:52:52 字數 5187 閱讀 7143

1樓:硬體開發

哈哈哈你太有福氣了,剛研究出來的,感覺好就給個好評

* stm32微控制器systick系統滴答定時器實驗程式**

#ifndef _systick_h

#define _systick_h

#include "systick.h"

#define systick_csr (*((volatile unsigned long *) 0xe000e010))//控制暫存器

#define systick_load (*((volatile unsigned long *) 0xe000e014))//過載暫存器

#define systick_val (*((volatile unsigned long *) 0xe000e018))//當前值暫存器

#define systick_calrb (*((volatile unsigned long *) 0xe000e01c)) //校準值暫存器

unsigned long systick_delay;//全域性變數

//配置暫存器

void systick_initstructreadcmd(void)

//中斷服務程式

void systick_hangler(void)

} //延時函式

void delay_10us(unsigned long countlinef)

int main(void)

/* 好了我們開始講解程式1us是怎麼實現的,我們使用時鐘源為apb時鐘,apb系統頻率陪配置為72mhz

systick_load = systemcoreclock / 1000000; systick過載初值重要的地方就在這裡

1:systemcoreclock 這個是什麼意思,跟蹤庫函式找到如下:

#ifdef sysclk_freq_hse

uint32_t systemcoreclock = sysclk_freq_hse;

#elif defined sysclk_freq_24mhz

uint32_t systemcoreclock = sysclk_freq_24mhz;

#elif defined sysclk_freq_36mhz

uint32_t systemcoreclock = sysclk_freq_36mhz;

#elif defined sysclk_freq_48mhz

uint32_t systemcoreclock = sysclk_freq_48mhz;

#elif defined sysclk_freq_56mhz

uint32_t systemcoreclock = sysclk_freq_56mhz;

#elif defined sysclk_freq_72mhz

uint32_t systemcoreclock = sysclk_freq_72mhz;

#else /*!< hsi selected as system clock source */

// uint32_t systemcoreclock = hsi_value;

/*這裡不難看出,我們初始化systeminit(); 是系統已經把systemcoreclock配置成72m下面就不難理解了,

先看一下計算公式:t = ticks * (1/f);

t : 為要計時的總時間。

ticks :為systick_load 的輸入引數。

(1/f)為使用時鐘源的時鐘週期,f為時鐘源的時脈頻率

使用時鐘源為ahb時鐘, 頻率被配置72m;

把systick_load過載暫存器賦值為 systemcoreclock / 1000000;呵呵呵大家

發現了什麼,就是72000000 / 1000000 = 72;大家都應該知道了72個時鐘週期

中斷一次,大家接著看(1/f)是時鐘週期的時間。1/72m = 0.13888888888888888888888888888889;

1us誕生了,0.13888888888888888888888888888889*72 = 1;1us哈哈哈大家明白了吧。

//野火資料出問題的地方 ticks=systemfrequency / 10 000 =720,相當於:72000000 / 10000 ;這裡少了一個0 結果等於 = 7200 不等於720看資料看的糾結哈哈哈。

這個程式折磨我1個星期,沒有吃好睡好,搞明白後我就馬上做上筆記那給大家分享。*/

2樓:迪迪de部落格

systick定時器有兩個可選的時鐘源,一個是外部時鐘源(stclk,等於hclk/8),另一個是核心時鐘(fclk,等於hclk)。假若你選擇核心時鐘,並將hclk頻率設定為72mhz的話,系統時鐘週期為1/(72m);systick有一個24位的遞減計數器,每個系統時鐘週期計數器值減一,那麼當計數器減到零時,時間經過了:系統時鐘週期*計數器初值。

當你將計數器初值設為72000時(有些例程裡面設為71999,其實沒什麼影響,誤差極小),當計數器值減到0時經過了1/(72m)*72000=0.001s,即1ms。你可以看一下芯達stm32的入門教程和《arm cortex-m3權威指南》的相關章節,裡面關於systick程式設計的一章說的比較詳細,但是也有個別地方說的比較模糊,總之多看些例程就明白了,剛開始總是很糾結的~

3樓:影魔

沒必要弄得上面那麼複雜吧。就三句話:

systick是個遞減計數器,每個時鐘週期會把暫存器的值(即過載值)減1,減到0就觸發systick中斷。

systick的時脈頻率=每秒systick遞減操作的次數。

公式:systick延時時間=過載值/systick時脈頻率,單位秒。

stm32中delay()函式延時的時間是怎麼計算的

4樓:來自火星的世界

微控制器程式設計過程中經常用到延時函式,最常用的莫過於微秒級延時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--;

5樓:匿名使用者

以systick的初值是720為例,系統時鐘為72m。systick記720個數產生一次中斷。這樣算也就是1秒產生100000次中斷(1次10us)。

當delay(x)中x大於0時會將x傳給一個全域性的變數使他在每發生一次中斷之後自減1.系統卡在等待這個變數變為零的死迴圈上直到這個全域性來量變為零。

6樓:匿名使用者

首先取決於你的時脈頻率選定為多少。

以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)就可以實現計時了。

回答感覺夠詳細的話就採納吧~

stm32執行一句語句需要多少,STM32執行一句語句需要多少ns

那要看你設定stm32的主頻是多少hz了,另外,有的指令是單週期的,還有是多週期完成的,看你用什麼指令了,單週期指令比如nop就可以用 stm32語句的執行時間是多少 stm32有多個系列,主頻也不一樣 可配置 misp也不一樣,可以通過測試來得到。如果需要延時的話,stm32定時器比較多,可以使用...

stm32系列的字尾是什麼意思

舉例 stm32 f 103 c 8 t 6 f 那一位指的是產品型別,現在似乎只有通用型即 f 103 那位指的是產品子系列,101 基本型,102 usb基本型 usb 2.0全速裝置,103 增強型,105或107 互聯型 c 那位指的是引腳數目,t 36腳,c 48腳,r 64腳,v 100...

STM32的IO輸出脈衝速度有多快

我也是剛看stm32沒幾天 說說我的看法 關於led點陣屏 這兩天剛好了解了一下 咱就按常見的說吧 就拿 32x2048點的屏來說 也就是有32x2048 65536個led組成這麼多個畫素 現在常用的一般是 1 4掃描或是1 16掃描 先說1 4掃描 把它看做是數碼管更好理解 也就是4個位選 65...