Systick定时器

目录

一、基础知识

二、Systick寄存器

三、相关函数

四、相关代码


一、基础知识

1、Systick定时器是什么

Systick定时器,是一个简单的定时器,对于ST的CM3、CM4、CM7内核芯片,都有Systick定时器

2、Systick定时器用处

常用于做延时或者实时系统的心跳时钟。比如UCOS中时分复用,需要一个最小的时间戳,一般在STM32和UCOS系统中,都采用Systick做UCOS心跳时钟。可以节省MCU资源,不用浪费一个定时器。

3、Systic定时器就是系统滴答定时器,为一个24位的倒计数定时器,从初始值一直减到0,计到0以后,将从RELOAD寄存器中自动重装载定时器初值。只要不把它在Systick控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。

4、Systick定时器被捆绑在NVIC中,用于产生SYSTICK异常【可编写中断服务函数】,其中断的优先级也可以设置

二、Systick寄存器

CTRL 控制和状态寄存器

 注:1、对于STM32,外部时钟源是HCLK(AHB总线时钟)的1/8,内核时钟是HCLK时钟

        2、配置函数:HAL_SYSTICK_CLKSourceConfig();

LOAD  自动重装载除值寄存器

VAL   当前值寄存器

CALIB  校准值寄存器

三、相关函数

 

四、相关代码

void delay_init(u8 SYSCLK)
{
    HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);//SysTick频率为HCLK
	fac_us=SYSCLK;						//不论是否使用OS,fac_us都需要使用

}								    

void delay_us(u32 nus)
{		
	u32 ticks;
	u32 told,tnow,tcnt=0;
	u32 reload=SysTick->LOAD;				//LOAD的值	    	 
	ticks=nus*fac_us; 						//需要的节拍数 
	told=SysTick->VAL;        				//刚进入时的计数器值
	while(1)
	{
		tnow=SysTick->VAL;	
		if(tnow!=told)
		{	    
			if(tnow<told)tcnt+=told-tnow;	//这里注意一下SYSTICK是一个递减的计数器就可以了.
			else tcnt+=reload-tnow+told;	    
			told=tnow;
			if(tcnt>=ticks)break;			//时间超过/等于要延迟的时间,则退出.
		}  
	};
}

 注:代码思路:先知晓系统频率,用于周期为其的倒数,所以频率也就是1秒执行的减的次数,为fac_us,若延时Nus,就是共减N*fac_us次,再根据当前的值开始计数,将溢出考虑进去,计算次数达到预设值则退出程序。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值