七、滴答定时器
滴答定时器介绍
SysTick 定时器可用作标准的下行计数器,是一个 24 位向下计数器,有自动重新装载能力,可屏蔽系统中断发生器。Cortex-M4 处理器内部包含了一个简单的定时器,所有基于 M4 内核的控制器都带有 SysTick 定时器,这样就方便了程序在不同的器件之间的移植。SysTick 定时器可用于操作系统,提供系统必要的时钟节拍,为操作系统的任务调度提供一个有节奏的“心跳”。正因为所有的 M4 内核的芯片都有 Systick 定时器,这在移植的时候不像普通定时器那样难以移植。
RCU 通过 AHB 时钟(HCLK)8 分频后作为 Cortex 系统定时器(SysTick)的外部时钟。通过对 SysTick 控制和状态寄存器的设置,可选择上述时钟或 AHB(HCLK)时钟作为 SysTick 时钟。
SysTick 定时器设定初值并使能之后,每经过 1 个系统时钟周期,计数值就减 1,减到 0 时,SysTick 计数器自动重新装载初值并继续计数,同时内部的 COUNTFLAG 标志位被置位,触发中断(前提开启中断)。
滴答定时器寄存器
相关定时器:
- SysTick Control and Status Register (SysTick_CTRL): 用于控制 SysTick 定时器的启动、停止,选择时钟源,以及读取当前定时器的状态。
- SysTick Reload Value Register (SysTick_LOAD): 设置定时器的重载值,即定时器从加载值递减到 0 所需的时钟周期数。
- SysTick Current Value Register (SysTick_VAL): 读取或清除定时器的当前值。
- SysTick Calibration Value Register (SysTick_CALIB): 提供一个校准值,用于实现与实际时钟频率无关的固定周期中断。
在 core_cm4.h 中可查看其定义,如图 2-1-2 所示。
关于寄存器的配置在下的 SysTick_Config 函数中已经写好了,如图所示,感兴趣的可以去研究一下。
滴答定时器函数
SysTick 定时器的使用主要有:
SysTick_Config()函数
- SysTick_Config()函数主要用来设置定时时间
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)函数
- systick_clksource_set()函数用来选择 SysTick 时钟源
滴答定时器配置
在 board.c 中找到 board_init()这个函数,如图所示。
这个函数是为大家配置好的,直接用寄存器配置的。
滴答定时器使用
我们写好了延时 ms 的函数,在 board.c 文件中,void delay_ms(uint32_t _ms),有一个参数_ms,这个就是我们要延时的时间的 ms 数,延时 1ms 就是 delay_ms(1),延时 1s 就是 delay_ms(1000)。还有延时 us 的函数 void delay_us(uint32_t _us),也是一样的用法。
TIP
需要注意的是这个延时是阻塞延时,在延时的时间里一直在等待,比较浪费系统资源,慎用。
LED 灯闪烁实验
前面我们学习了如何去使用滴答定时器,下面我们就用滴答定时器的延时去实现 LED 闪烁 1s 间隔。其实很简单就是先让 LED 引脚输出高电平,然后调用 delay_ms(1000),再让 LED 引脚输出低电平,再调用 delay_ms(1000),最后在 while(1)函数里调用即可。
这一章节的代码
在开发板介绍百度网盘链接中:立创·梁山派·天空星STM32F407VET6开发板资料/第03章软件资料/代码例程/003 滴答定时器灯闪烁。
烧写我们的代码之后,可以看到开发板 LED2 将会 1s 亮 1s 灭。