STM32定时器篇——Systick定时器的使用(实现delay延时函数)

一、Systick定时器的简介:

*Systick定时器就是系统滴答定时器,*一个24 位的倒计数定时器对于CM3,CM4内核芯片,都有Systick定时器。当Systick计到0时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。l常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。比如UCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做UCOS心跳时钟。

二、Systick寄存器介绍:

1. SysTick控制和状态寄存器-CTRL

这个图片是截取的STM32F10xxx Cortex-M3编程手册,其中:

第0位是SysTick定时器的使能位,为1则使能定时器;

第1位位中断使能位,为1则产生中断,否则不动作;

第2位为时钟源选择,为0则选择为外部时钟源(AHB总线时钟的1/8),为1则选择内核时钟;

第16位相当于标志位,也就是SysTick数到0则该为1,读取该位后自动清零。

2. SysTick重装载数值寄存器

为32位的寄存器(但也相当于24位的寄存器,因为第24到31位不用),主要作用就是当倒数到0时,将被重装载的值,也就相当于重装载寄存器。

3.SysTick当前值寄存器

其主要作用就是记录当前倒计数器的值,写他时会清0,同时会清除COUNTFLAG标志位。

4.SysTick校准值寄存器

三、用SysTick定时器实现延时delay函数

如果使用外部时钟源,其频率为72/8 = 9MHz,也就是记一次为1/9us,如果要定时1us则需要计数9次。总结起来就下面几步:

  1. 将定时值写入自动重装载寄存器LOAD

  2. 清空计数器:将VAl寄存器写入0

  3. SysTick定时器的使能:CTRL寄存器的第0位写1,当然此时还可以配置为外部时钟源;

4.等待时间到达,也就是判断第16位是否为1;

5.关闭计数器,也就是将CTRL第0位写0

6.清空计数器:VAL寄存器清0

cpp 复制代码
void delay_us(u32 xus)
{
    u32 temp;
    SysTick ->LOAD = 9*xus;//写入自动重装时间
    SysTick->VAL=0X00;//清空计数器
    SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
    do{ temp = SysTick->CTRL;/***** 读取当前倒计数值 *****/ }
    while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
    SysTick->CTRL=0x00; //关闭计数器
    SysTick->VAL =0X00; //清空计数器
}

如果要写ms级的定时,可以直接调用delay_us函数1000次就是ims了,或者将9改为9000,如下:

cpp 复制代码
void delay_ms(u16 nms)
{
 u32 temp;
 SysTick->LOAD = 9000*nms;
 SysTick->VAL=0X00;//清空计数器
 SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
 do
 {
  temp=SysTick->CTRL;//读取当前倒计数值
 }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
    SysTick->CTRL=0x00; //关闭计数器
    SysTick->VAL =0X00; //清空计数器
}
相关推荐
崇山峻岭之间33 分钟前
433遥控器解码
单片机
GeekArch1 小时前
第5讲:嵌入式场景二范式决策树:什么情况快写、什么情况严写
人工智能·stm32·单片机·mcu·物联网·决策树·机器学习
炸膛坦客14 小时前
单片机开发工具篇:(九)MCU 芯片包的安装
单片机·嵌入式硬件
智者知已应修善业19 小时前
【51单片机实现初始化数码管不显示按启动从0秒计时到60按暂停一次显示当前秒按2次恢复原始状态】2024-6-11
c语言·c++·经验分享·笔记·嵌入式硬件·算法·51单片机
电气_空空21 小时前
基于LabVIEW的数据采集系统设计与实现
单片机·嵌入式硬件·labview
caimouse21 小时前
ReactOS BootCD 光盘布局完整深度分析
单片机·reactos
zlinear数据采集卡1 天前
从万用表的6步调零到硅片级微秒自校准:硬核拆解LHAMP188的宽压轨到轨与零漂移实战
arm开发·stm32·单片机·嵌入式硬件·fpga开发
三品吉他手会点灯1 天前
嵌入式机器学习 - 学习笔记1.2.3 - 机器学习软件框架
人工智能·笔记·嵌入式硬件·学习·机器学习
国科安芯1 天前
ASC8T245S 8通道电平转换设计实战:从系统架构到QFN24 Layout再到量产测试
网络·单片机·物联网·安全·fpga开发·系统架构
云栖梦泽1 天前
将RAW打包成MIPI CSI2
linux·人工智能·嵌入式硬件