1. 程式人生 > >SysTick滴答定時器

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);
}
}