SysTick滴答定时器使用库函数实现1us和1ms精确定时(超短代码)(内含源码.c/.h)

一、SysTick介绍

SysTick—系统定时器是属于CM4内核中的一个外设,内嵌在NVIC中。一般我们叫他系统定时器或者滴答定时器。是一个24bit的向下递减的计数器,计数器每计数一次的时间为1/SYSCLK,当重装载数值寄存器的值递减到 0的时候,系统定时器就产生一次中断,以此循环往复。嵌入式操作系统常有一个类似“心跳”的定时器,来分配时间片,实现宏观上的多任务。其实,操作系统的多任务,在微观上,CPU对多任务的管理是分时的。每个任务都给一定的时间片,就是把时间分成N个等份,优先级高或是重要的任务多占几个时间片,优先级低的或是不重要的任务就少占几个时间片。大部分嵌入式操作系统是基于时间片的。如ucos。systick结论总结如下:

1、systick是一个24位的定时器,故重装值最大值为2的24次方 = 16 777 215,要注意不要超出这个值。

2、systick是cortex_m3的标配,不是外设,不需要在RCC寄存器组打开它的时钟。

3、每次systick溢出后会置位计数标志位和中断标志位,计数标志位在计数器重装载后被清除,而中断标志位也会随着中断服务程序的响应被清除,所以这两个标志位都不需要手动清除。

4、采用使用库函数的方法,只能采用中断的方法响应定时器计时时间到,如要采用查询的方法,那只能采用设置systick的寄存器的方法。

定时原理:SysTick定时器的计数器是向下递减计数的,计数一次的时间当寄存器中的值LOAD减到0时,产生中断,可得中断一次的时间为:其中

比如在STM32F103x中SystemCoreClock是固件中定义的系统内核时钟,一般为78MHZ

即:=78MHZ,假如LOAD为78则,定时时间为

库函数SysTick_Config()函数的形参表示内核时钟有多少个周期触发一次systick定时中断

SystemCoreClock / 1000  表示定时频率为 1000Hz, 也就是定时周期为  1ms
SystemCoreClock / 500   表示定时频率为 500Hz,  也就是定时周期为  2ms
SystemCoreClock / 2000  表示定时频率为 2000Hz, 也就是定时周期为  500us

在delay.c中第18行中SystemCoreClock/1000000)就是定时1us,当然也可以直接传递72,但是若是换个单片机时钟不是72MHZ则会定时错误,所以使用SystemCoreClock/1000000)更方便移植程序。

二、精确定时源码

delay.c

//使用时记得将stm3210x_it.c中
//void SysTick_Handler(void)
//{
//}
//注销掉

#include "delay.h"
/*******************************************************************************
*函数的原型:void Sys_Delay_Init(void)
*函数的功能:系统滴答定时器初始化
*函数的参数:None
*函数返回值:None
*函数的说明:
    SysTick_Config():系统滴答定时器初始化 返回1,说明初始化不成功
********************************************************************************/
void Sys_Delay_Init(void)
{
    if(SysTick_Config(SystemCoreClock/1000000) == 1)//1微秒
    {
        while(1);
    }
}

u32 sys_time = 0;
void SysTick_Handler(void)
{
    sys_time++;
}

/*******************************************************************************
*函数的原型:void delay_us(u32 us)
*函数的功能:微秒延时函数
*函数的参数:
    @ u32 us:微秒 [1,4294967296]
*函数返回值:None
*函数的说明:
    系统滴答定时器
********************************************************************************/
void delay_us(u32 us)
{
    sys_time = 0;
    while(sys_time != us);
}

/*******************************************************************************
*函数的原型:void delay_ms(u32 ms)
*函数的功能:微秒延时函数
*函数的参数:
    @ u32 ms:毫秒 [1,4294967]
*函数返回值:None
*函数的说明:
    系统滴答定时器
********************************************************************************/
void delay_ms(u32 ms)
{
    delay_us(ms*1000);
}


delay.h

#ifndef _DELAY_H
#define _DELAY_H

#include "stm32f10x.h"


void Sys_Delay_Init(void);
void delay_us(u32 us);
void delay_ms(u32 ms);

#endif

若要在函数中使用则应先在主函数(main.c)中进行初始化

#include "sys.h"//我把所以的.h都放sys.h中了所以是#include "sys.h"

int main(void)
{
    Sys_Delay_Init(); //初始化定时器
    //下面就可以直接调用delay_ms();delay_us();来进行定时了,比如若定时50ms则
    delay_ms(50);
    //若定时30us则
    delay_us(30);


}

你可能感兴趣的:(单片机)