SysTick滴答定時器
概述:
系統滴答定時器是一個非常基本的倒計時定時器,用於在每隔一定的時間產生一箇中斷,即使是系統在睡眠模式下也能工作。它使得 OS 在各 CM3器件之間的移植中不必修改系統定時器的程式碼,移植工作一下子容易多了。 SysTick定時器也是作為 NVIC 的一部分實現的。
相關暫存器
SysTick控制及狀態暫存器(地址:0xE000_E010) —》這個暫存器當中的第 16 位
SysTick重灌載器(地址:0xE000_E014)
SysTick當前數值暫存器(地址:0xE000_E018)
SysTick校準數值暫存器(地址:0xE000_E01C)
標頭檔案:
#ifndef __SYSTICK_H
#define __SYSTICK_H
//標頭檔案
#include “stm32f4xx.h” //這個標頭檔案一定要留
void SysTick_Init(void);//時鐘源初始化
void Time_us(int nus);//微秒計數
void Time_ms(int nms);//毫秒計數
void Time_s(int ns);//秒計數
#endif
原始碼:
#include “sysTick.h”
int my_us = 0;
int my_ms = 0;
void SysTick_Init(void)
{
//初始化滴答定時器的時鐘源 8分頻 168/8=21MHz = 1/21us
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
my_us = 21;
my_ms = 21*1000;
}
//微秒延時,nus最大值:798915
void Time_us(int nus)
{
//設定重灌載數值
SysTick->LOAD = nus*my_us;
//設定當前數值為0
SysTick->VAL = 0x00;
//開始計時
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
int temp=0; do { temp = SysTick->CTRL; }while(!(temp & (1<<16))); //關閉計時 SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; SysTick->VAL = 0x00;
}
//毫秒延時,nus最大值:798.915
void Time_ms(int nms)
{
//設定重灌載數值
SysTick->LOAD = nms*my_ms;
//設定當前數值為0
SysTick->VAL = 0x00;
//開始計時
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
int temp=0;
do {
temp = SysTick->CTRL;
}while(!(temp & (1<<16)));
//關閉計時
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
SysTick->VAL = 0x00;
}
void Time_s(int ns)
{
for(;ns>0;ns–)
{
Time_ms(500);
Time_ms(500);
}
}