日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

stm32滴答计时器_stm32笔记:Systick系统滴答定时器

發布時間:2024/7/23 windows 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 stm32滴答计时器_stm32笔记:Systick系统滴答定时器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Systick :系統心跳定時器,提供系統節拍

裸機程序中可作為獨立的延時定時器

用途:

1.產生操作系統的時鐘節拍

2.便于不同處理器之間程序移植

SysTick定時器被捆綁在NVIC中,異常號15

3.作為一個鬧鈴測量時間用于測量時間,

但當處理器在調試期間被喊停(halt)時,則SysTick定時器亦將暫停運作

它有四個寄存器

STK_CSR, 0xE000E010 -- 控制寄存器

STK_LOAD, 0xE000E014 -- 重載寄存器

STK_VAL, 0xE000E018 -- 當前值寄存器

STK_CALRB, 0xE000E01C -- 校準值寄存器

stm32的時鐘源

選擇外部時鐘源時,則Systick時鐘為HCLK /8

選擇內核時鐘源時,則Systick時鐘為HCLK

延時編程原理

systick定時器是24位的遞減計數器,設定初值并使能它后,它會每個系統時鐘周期計數器減1,

計數到0 時,將從RELOAD 寄存器中自動重裝載定時初值。只要不把它在SysTick控制及狀態寄存器中的使能位清除,就永不停息.

延時編程步驟

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

2.計算出RELOAD寄存器的值

也就是產生相應延時所需要的時鐘周期數

RELOAD=fac_us * nus

3.開啟計數

4.循環檢測計數到0的標志位;

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

=======================================

SysTick異常配置步驟

1對CTRL//LOAD/VAL三個寄存器進行了配置,

2初始化SysTick使用的時鐘,

3清除系統當前值,裝入重裝值,

4使能SysTick,使SysTick能響應中斷

=======================

當SysTick定時器計到0時,將把COUNTFLAG位置位;而下述方法可以對其清零:

1.讀取SysTick 控制及狀態寄存器(STCSR)

2.往SysTick 當前值寄存器(STCVR)中寫任何數據

只有當VAL 值為0 時,計數器自動重載RELOAD

======================

庫函數

使用ST的函數庫使用systick的方法,嚴格按照以下順序:

1、調用SysTick_CounterCmd() -- 失能SysTick計數器

2、調用SysTick_ITConfig () -- 失能SysTick中斷

3、調用SysTick_CLKSourceConfig() -- 設置SysTick時鐘源。

4、調用SysTick_SetReload() -- 設置SysTick重裝載值。

5、調用SysTick_ITConfig () -- 使能SysTick中斷

6、調用SysTick_CounterCmd() -- 開啟SysTick計數器

Systick中斷服務函數

void SysTick_Handler(void);

==========================

寄存器版代碼注解

使用外部8M時鐘,鎖相環里出來的頻率是72M,AHB預分頻后是72M,

systick固定HCLK時鐘的1/8,即9M,那么延時1us是9個時鐘

void delay_init(u8 SYSCLK) //系統時鐘是72MHz,SYSCLK=72

{

SysTick->CTRL &= 0xfffffffb ; //bit2清0,也就是配置選擇外部時鐘

fac_us=SYSCLK/8; //硬件8分頻,fac_us得出的值是要給下面的時鐘函數用的

fac_ms =(u16)fac_us*1000;

}

void delay_us(u32 nus) //nus假如為10us

{

u32 temp;

SysTick->LOAD = nus*fac_us; //延時10us的話就是 10*9=90,裝到load寄存器中

SysTick->VAL=0x00;//計數器清0,因為currrent字段被手動清零時,load將自動重裝到VAL中

SysTick->CTRL = 0x01;//配置使異常生效,也就是計數器倒數到0時將發出異常通知

do

{

temp = SysTick->CTRL; //時間到了之后,該位將被硬件置1,但被查詢后自動清0

}

while(temp & 0x01 && !(tmep &(1<<16))); //查詢

SysTick->CTRL = 0x00; //關閉計數器

SysTick->VAL = 0x00; //清空val

}

//這個while循環,判斷如果Systick還在Enable的狀態,并且計數器還沒數到0,

就不停的循環把當前的SysTick->CTRL寄存器值寫入變量temp,繼續下一次判斷。

當Systick被Disable或者計數器數到0了,就停止循環

還有一個注意點:

LOAD寄存器是24位的 最大值0xffffff

那么延時最大值計算公式為

nms<=0xffffff*8*1000/SYSCLK (SYSCLK單位Hz)

則nms的最大值為1864.135ms ,即1864毫秒

總結

以上是生活随笔為你收集整理的stm32滴答计时器_stm32笔记:Systick系统滴答定时器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。