【STM32】利用SysTick定时器定时1s

1.SysTick简单介绍

SysTick定时器是一个24位的倒计数定时器,当计数到0时,将从RELOAD寄存器中自动重装载定时初值,开始新一轮计数。

SysTick定时器用于在每隔一定的时间产生一个中断,即使在系统睡眠模式下也能工作。

关于SysTick详细说明,请查看该文章:

STM32---delay和操作系统共用SysTick定时器_systick 与 delay 同时-CSDN博客

2.实现SysTick定时器延时1s

利用SysTick定时器延时1s只需要利用到以下两个函数:

cpp 复制代码
SysTick_Config(SystemCoreClock / 1000);    //预装载值
void SysTick_Handler(void);               //SysTick中断函数

(1)函数SysTick_Config(SystemCoreClock / 1000);

这个函数是为SysTick定时器设置预装载值,其中

SystemCoreClock 表示系统时钟频率,

SystemCoreClock / 1000结果为预装载值,

定时时间=预装载值 / 系统时钟频率。

举个例子:

系统时钟频率 SystemCoreClock = 72MHz,那么其

预装载值 = SystemCoreClock / 1000 = 72 000 000Hz / 1000 = 72 000,

定时时间 = 预装载值 / 系统时钟频率 = 72 000 / 72 000 000 = 1ms。

注:表达式SystemCoreClock / 1000中的这个1000可以跟换为其他的数值。常用的有如下几种:

cpp 复制代码
SysTick_Config(SystemCoreClock / 1000);        //定时1ms
SysTick_Config(SystemCoreClock / 100);         //定时10ms
SysTick_Config(SystemCoreClock / 10);          //定时100ms
SysTick_Config(SystemCoreClock / 1000 000);    //定时1us

(2)函数void SysTick_Handler(void);

这个函数是SysTick中断函数,当SysTick定时时间到,进入到该中断函数,所以要实现定时1s,设置一个计数值即可。

在此以预装载值为SysTick_Config(SystemCoreClock / 1000)为例实现定时1s。

cpp 复制代码
int SysTick_count = 0;        //SysTick定时器计数变量
void SysTick_Handler(void)
{
    SysTick_count++;           //每执行一次中断,该计数值加1
    if(SysTick_count > 1000)   //每进来一次中断时间为1ms,所以当计数到1000*1ms=1s,即为1s
    {
        SysTick_count = 0;     //将计数变量清0,使其执行下一次的1s定时
    }
}

3.完整代码

cpp 复制代码
#include "stm32f10x.h"

#define SystemCoreClock    72 000 000    //72MHz

int SysTick_count = 0;        //SysTick定时器计数变量

void main()
{
    SysTick_Config(SystemCoreClock / 1000);    //预装载值
    while(1)
    {
        //此处可添加定时1s需要实现的功能
    }
}

//SysTick中断服务函数
void SysTick_Handler(void)
{
    SysTick_count++;           //每执行一次中断,该计数值加1
    if(SysTick_count > 1000)   //每进来一次中断时间为1ms,所以当计数到1000*1ms=1s,即为1s
    {
        SysTick_count = 0;     //将计数变量清0,使其执行下一次的1s定时
    }
}
相关推荐
写代码的熊萌新几秒前
JAVA2-类与对象编程(1)
java·开发语言
写代码的熊萌新5 分钟前
蓝桥杯---纯职业小组(c语言)
c语言·蓝桥杯·哈希算法
F-2H1 小时前
C语言:构造类型(共用体/联合体,枚举)
java·linux·c语言·开发语言·数据结构·c++·算法
Xiao5xiao1221 小时前
java后端对接飞书登陆
java·开发语言·飞书
时时三省1 小时前
【时时三省】(C语言基础)常见的动态内存错误3
c语言
疯狂小小小码农2 小时前
C++语言的文件操作
开发语言·后端·golang
莲动渔舟2 小时前
Python自学 - 类进阶(可调用对象)
开发语言·python
梵谷的忧伤2 小时前
两个栈实现队列(D)
java·开发语言·前端·算法
Reese_Cool2 小时前
【Python】Python与C的区别
java·c语言·python
XiaoH2332 小时前
培训机构Day27
java·开发语言·javascript