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

猜你喜欢

转载自blog.csdn.net/weixin_42443025/article/details/84978976
今日推荐