【STM32-Sysyick】 详解及应用,深入寄存器附加代码

   日期:2021-02-19     浏览:104    评论:0    
核心提示:一、SysTick 简介SysTick—系统定时器是属于 CM3 内核中的一个外设,内嵌在 NVIC 中。系统定时器是一个 24bit 的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般设置系统时钟 SYSCLK 等于 72M。当重装载数值寄存器的值递减到 0 的时候,系统定时器就产生一次中断,以此循环往复。因为 SysTick 是属于 CM3 内核的外设,所以所有基于 CM3 内核的单片机都具有这个系统定时器,使得软件在 CM3 单片机中可以很容易的移植。系统定时器一般用于操作系统,用

一、SysTick 简介

SysTick—系统定时器是属于 CM3 内核中的一个外设,内嵌在 NVIC 中。系统定时器是一个 24bit 的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般设置系统时钟 SYSCLK 等于 72M。当重装载数值寄存器的值递减到 0 的时候,系统定时器就产生一次中断,以此循环往复。因为 SysTick 是属于 CM3 内核的外设,所以所有基于 CM3 内核的单片机都具有这个系统定时器,使得软件在 CM3 单片机中可以很容易的移植。系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳

SysTick 寄存器汇总


SysTick 控制及状态寄存器


SysTick 重装载数值寄存器

SysTick 当前数值寄存器

总结:

1、Systick 实现定时或者延时,可以采取“查询方式”或者“中断方式”,
2、使能Systick  由SysTick->CTRL 控制。
3、开启 Systick :SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;   
     关闭 Systick :SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;   

注意 无论是哪种  都需要提前配置SysTick_Config()
// core_cm3.c 
	static __INLINE uint32_t SysTick_Config(uint32_t ticks)
	{  
	  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            
																   
	  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      
	  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  
	  SysTick->VAL   = 0;                                          
	  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | 
					   SysTick_CTRL_TICKINT_Msk   | 
					   SysTick_CTRL_ENABLE_Msk;                    
	  return (0);                                                  
	}

// * SystemFrequency / 1000 1ms中断一次
// * SystemFrequency / 100000 10us中断一次
// * SystemFrequency / 1000000 1us中断一次

// 默认SystemFrequency = 72MHz,因此 ticks = 72,1us 一次
									 ticks = 720001ms 一次

二、简单应用

一、查询方式,实现延时

//查询方式

void Dealy_us(uint32_t us)
{ 
	uint32_t i;
	SysTick_Config(72);  //1us
	for(i=0; i<us; i++)
	{ 
		while( !((SysTick->CTRL)&(1<<16)) );
	}
	
	SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk; //关闭Systick
}

void Dealy_ms(uint32_t ms)
{ 
	uint32_t i;
	SysTick_Config(72000);  //1us
	for(i=0; i<ms; i++)
	{ 
		while( !((SysTick->CTRL)&(1<<16)) );
	}
	
	SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;//关闭Systick
}

二、中断方式实现延时

void Dealy_IT_us(uint32_t us)
{ 
	
	SysTick_Config(72);  //1us
	nTime = us;
	
	//SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk; //关闭
	SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;    //打开
	while(nTime);
	
}

void Dealy_IT_ms(uint32_t ms)
{ 
	
	SysTick_Config(72000);  //1us
	nTime = ms;
	
	//SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk; //关闭
	SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;    //打开
	
	while(nTime);
	
}

中断服务函数编写

void SysTick_Handler(void)
{ 
	TimeDecrease();
}

其中


static uint32_t nTime = 0;
void TimeDecrease(void)
{ 
	nTime--; 
}

欢迎交流,有问题可以留言

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服