-->

Systick(滴答定时器)

SysTick(滴答定时器)

在使用按键时候,按下按键会产生抖动,如下图,这样就会导致程序不太可靠。

image

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

image

接下来,说的是软件消抖。软件消抖一般是,使用一个10ms左右的延时,把这段抖动的电平给滤过,这样就没有干扰,但是我们需要很准确的计数,否则可能不够,或者太久。

  • 在单片机中想要实现精确的定时,就需要使用定时器,那么定时器又是怎么知道时间的呢,那就是计数,根据时钟频率来计数,结构是非常准确地。

所以接下来需要了解时钟。可以去看看时钟

下面的图片可以去参考Cortex-M3权威指南英文版直接在目录搜索SysTick。

image

image

image

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

image

  • 上面的翻译已经说得很详细,这里就不在说明,说明一下第一个寄存器(控制状态寄存器)

控制状态第0位是否使能这个寄存器1使能,0失能。

第1位是产生异常,可以申请异常中断。

第16位是在重装载值减到0是,这个位会置1。可以用于检测计数器是否记完。

这里注重讲解第2位时钟源。

image

可以看到上图一共两个时钟源,对应着寄存器上面的两个时钟源,可以去时钟章节看,这个168MHz是怎么来的。

由于暂时这个芯片不搭载操作系统,所以这个这个SysTick定时器一般用作延时,频率不需要这么高,直接使用21MHz即可。

如何使用

image

  • 如何计算延时的时间和次数的关系

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--;
	}
}
posted @ 2024-07-07 13:08  wuju  阅读(139)  评论(0)    收藏  举报