Systick(滴答定时器)
SysTick(滴答定时器)
在使用按键时候,按下按键会产生抖动,如下图,这样就会导致程序不太可靠。

一般而言,消抖的方式有很多,如硬件消抖,一般而言,硬件消抖可以使用一个电容,与按键并联,这样可以把这些抖动的电压给导到地上。如下图(典型的复位电路)

接下来,说的是软件消抖。软件消抖一般是,使用一个10ms左右的延时,把这段抖动的电平给滤过,这样就没有干扰,但是我们需要很准确的计数,否则可能不够,或者太久。
- 在单片机中想要实现精确的定时,就需要使用定时器,那么定时器又是怎么知道时间的呢,那就是计数,根据时钟频率来计数,结构是非常准确地。
所以接下来需要了解时钟。可以去看看时钟
下面的图片可以去参考Cortex-M3权威指南英文版直接在目录搜索SysTick。



- 根据上面的描述,寄存器一共有四个,但是我们一般不使用校准寄存器。所以本章不讲

- 上面的翻译已经说得很详细,这里就不在说明,说明一下第一个寄存器(控制状态寄存器)
控制状态第0位是否使能这个寄存器
1使能,0失能。第1位是产生异常,可以申请异常中断。
第16位是在重装载值减到0是,这个位会置1。可以用于检测计数器是否记完。
这里注重讲解第2位时钟源。
可以看到上图一共两个时钟源,对应着寄存器上面的两个时钟源,可以去时钟章节看,这个168MHz是怎么来的。
由于暂时这个芯片不搭载操作系统,所以这个这个SysTick定时器一般用作延时,频率不需要这么高,直接使用21MHz即可。
如何使用

- 如何计算延时的时间和次数的关系
f是频率:21000000Hz
T是周期:T = 1/21000000s = 1/21000ms = 1/21us
cnt是计算次数 cnt (us) * (1/T (us))= cnt (次数)
因为重装载寄存器是24位,使用cnt的大小不能超过798915
/**
* @brief 微秒延时
* @note nus不能超过 798915us
* @param nus:延时多少微秒
* @retval None
*/
void delay_us(u32 nus)
{
SysTick->CTRL = 0; // 失能SysTick
SysTick->LOAD = (nus * 21) - 1; // 重装载值,减到0,必须把0算上
SysTick->VAL = 0; // 当前值,设置为任何数,都是0
SysTick->CTRL = 1; // 使能SysTick,并且选用21MHz时钟
while ((SysTick->CTRL & 0x00010000)==0); // 等待计数器,减完
SysTick->CTRL = 0; // 失能SysTick
}
/**
* @brief 毫秒延时
* @note nms不能超过 798ms
* @param nms:延时多少毫秒
* @retval None
*/
void delay_ms(u32 nms)
{
SysTick->CTRL = 0; // 失能SysTick
SysTick->LOAD = (nms * 21 * 1000) - 1; // 重装载值,减到0,必须把0算上
SysTick->VAL = 0; // 当前值,设置为任何数,都是0
SysTick->CTRL = 1; // 使能SysTick,并且选用21MHz时钟
while ((SysTick->CTRL & 0x00010000)==0); // 等待计数器,减完
SysTick->CTRL = 0; // 失能SysTick
}
/**
* @brief 秒延时
* @note None
* @param ns:延时多少秒
* @retval None
*/
void delay_s(u32 ns)
{
while(ns)
{
delay_ms(500);
delay_ms(500);
ns--;
}
}


浙公网安备 33010602011771号