系统滴答定时器SysTick - 简介及代码实现

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

  • 18
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值