STM32處理器有一個24位的系統滴答定時器SysTick,它從重新加載值開始倒數到0,然后在下一個時鐘邊緣重新加載(包裝到)STK_LOAD寄存器中的值,然后在隨后的時鐘上倒數。
計數標志位COUNTFLAG在系統控制和狀態寄存器STK_CTRL的16位,當計時器減計數到0時,返回1。
時鐘源選擇位CLKSOURCE在系統控制和狀態寄存器STK_CTRL的2位,賦值為0時為8分頻,賦值為1時為1分頻。想要計數速度更快可以選擇1分頻的時鐘源。
SysTick異常請求允許位TICKINT在系統控制和狀態寄存器STK_CTRL的1位,賦值為0時禁止異常請求,賦值為1時允許異常請求。軟件可以使用COUNTFLAG來判斷SysTick是否曾經被計數為零。
計數使能位在系統控制和狀態寄存器STK_CTRL的0位,賦值0時禁止計數,賦值1時使能計數。
重裝載值RELOAD在SysTick重載值寄存器STK_LOAD的0~23位,加載寄存器指定在啟用計數器時和計數器達到0時加載到當前值寄存器STK_VAL的起始值。
當前的計數器值CURRENT在當前值寄存器STK_VAL的1~23位。前值寄存器STK_VALSysTick計數器的當前值。讀取返回SysTick計數器的當前值。任何值的寫入都會將字段清除為0,并將STK_CTRL寄存器中的COUNTFLAG位清除為0。
查詢us、ms延時函數
void Systick_Delayus(u32 us)
{
SysTick- >CTRL &=~ (1< 2); //選擇時鐘源,8分頻
SysTick- >LOAD = 21*us - 1; //賦值裝載值
SysTick- >VAL = 0; //清除當前值
SysTick- >CTRL |= 1< 0; //使能計數器
while((SysTick- >CTRL & (1< 16)) == 0); //判斷計數是否結束
SysTick- >CTRL &=~ (1< 0); //禁止計數器
}
void Systick_Delayms(u16 ms)
{
Systick_Delayus(ms * 1000);
}
從時鐘樹可以知道,系統時鐘168Mhz,8分頻后得到滴答定時器時鐘為21Mhz,裝載值(需要延時時間)可根據時鐘頻率計算求得,每秒可計數21000000次,每微秒可計數21次。裝載值和當前值都是24位,最大為16777215,最大微秒定時798915us,最大毫秒定時798ms。
結合LED燈和Systick定時讓LED燈500ms閃爍一次,主函數為
#include "stm32f4xx.h"
#include "led.h"
#include "delay.h"
int main()
{
LED_Init(); //初始化LED燈
while(1) //點亮或熄滅LED燈
{
GPIOH- >ODR &=~ (0x01< 10); //輸出為0,led燈亮
GPIOH- >ODR &=~ (0x01< 11); //輸出為0,led燈亮
Systick_Delayus(500000);
GPIOH- >ODR |= (0x01< 10); //輸出為1,led燈滅
GPIOH- >ODR |= (0x01< 11); //輸出為1,led燈滅
Systick_Delayms(500);
}
}
編譯成功后將程序燒入,LED每500ms閃爍一次,Systick查詢定時成功。
-
led燈
+關注
關注
22文章
1592瀏覽量
107999 -
計數器
+關注
關注
32文章
2256瀏覽量
94568 -
狀態寄存器
+關注
關注
0文章
39瀏覽量
7087 -
Systick
+關注
關注
0文章
62瀏覽量
13092 -
STM32處理器
+關注
關注
0文章
5瀏覽量
1123
發布評論請先 登錄
相關推薦
評論