SysTick是一个24位的系统节拍定时器,具有自动重载和溢出中断功能,所有基于Cortex M3或Cortex M4处理器的微控制器都有这个定时器。
Systick定时器常用来做延时,或者用来做实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。
SysTick有4个寄存器:CTRL(控制和状态寄存器)、LOAD(自动重装载除值寄存器)、VAL(当前值寄存器)、CALIB(校准值寄存器)
代码实现:
#include "delay.h"
#include "stm32f4xx.h"
//微秒和毫秒延时
uint16_t ndelay_ms = 0;
uint16_t ndelay_us = 0;
void SysTick_Init(void)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //systick频率是 168/8 = 21MHZ
ndelay_us = 168/8;
ndelay_ms = ndelay_us*1000;
}
void delay_us(uint32_t time)
{
uint32_t temp;
SysTick->LOAD = time * ndelay_us; //自动重装载值
SysTick->VAL = 0; //清空计数器
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //开始递减计数
do
{
temp = SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<16))); //等待计数到0
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //关闭计数器
SysTick->VAL = 0; //清空计数器
}
//SysTick定时器是一个24位的向下计数定时器,所以最多计数2^24-1(从零开始计数,所以要减一),所以可以算出最大延时时间:99.864ms
//2^24/21 = 798,915.04761904761904761904761905 us = 798.915 ms
//最大延时时间798ms
static void Delay_Xms(uint32_t time)
{
uint32_t temp;
SysTick->LOAD = time * ndelay_ms; //自动重装载值
SysTick->VAL = 0; //清空计数器
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //开始递减计数
do
{
temp = SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<16))); //等待计数到0
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //关闭计数器
SysTick->VAL = 0;
}
void delay_ms(uint32_t time)
{
uint8_t a = time/798;
uint8_t b = time%798;
while(a)
{
Delay_Xms(798);
a--;
}
if(b)
Delay_Xms(b);
}