SysTick系统定时器

发布于 2022-08-17  436 次阅读


准备

在理解它的工作原理之前,先了解一些关于频率和周期的基本知识吧

周期 = 1/频率 1Mhz = 1000Khz = 1000000Hz

1秒(s)=1000毫秒(ms) 1秒(s)=1000000 微秒(μs)。

即72Mhz频率的周期则为1/72000000秒

SysTick特性介绍

SysTick是Cortex-M内核中的一个外设,内嵌在NVIC中

计数宽度为24bit,那么最大储存为2^24 = 16777216

计数器工作周期为 1/CLKSourec,CLKSourec可配置为72Mhz

工作模式为向下递减,即最大可从2^24 = 16777216递减到0并调用中断,递减的速度为一周期的速度即 1/CLKSourec,那么 递减次数 * 周期速度 = 定时时间

代码及详解

SysTick配置

void SysTick_Init(void)
{
	/* SystemFrequency / 1000    1ms中断一次
	 * SystemFrequency / 100000	 10us中断一次
	 * SystemFrequency / 1000000 1us中断一次
	 */
	if (HAL_SYSTICK_Config(SystemCoreClock / 100000))
	{ 
		/* Capture error */ 
		while (1);
	}
}

/*
HAL_SYSTICK_Config() 这个函数的值最终会传递给 LOAD重装数值寄存器中
SystemCoreClock 为时钟频率,当前配置为72Mhz/100000 = 720,即将720传到LOAD中
那么从720递减到0则需要1/720Mhz*720 = 0.00001秒 = 10us
*/

那么怎么将这个延时应用起来呢,可以通过以下方法

/*
大概思路,利用递减到0就会调用中断的特性,那么可以定义一个数作为目标延时时间,然后每中断一次定义的数就减一,即TimingDelay * 10us * 720 = 需要的延时时间
*/
uint32_t TimingDelay;//定义一个无符号数作为延时时间

void Delay_us(uint32_t nTime)
{ 
	TimingDelay = nTime; //给延时时间赋值

	while(TimingDelay != 0);//TimingDelay到0的时候退出循环即达到了延时作用
}

/*这个函数在中断函数SysTick_Handler()中调用,即每次从720递减到0一次每次10us,就让定义的TimingDelay减去1,TimingDelay到0的时候Delay_us()函数中的循环即可退出
*/
void TimingDelay_Decrement(void)
{
	if (TimingDelay != 0x00)
	{ 
		TimingDelay--;
	}
}

中断函数部分

void SysTick_Handler(void)
{
  HAL_IncTick();
  TimingDelay_Decrement();//调用函数让上面定义的TimingDelay 减一
}
  • alipay_img
  • wechat_img
想法不去做终究就只是想法
最后更新于 2022-08-17