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

一、SysTick 简介

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

SysTick 寄存器汇总

【STM32-Sysyick】 详解及应用,深入寄存器附加代码_第1张图片
SysTick 控制及状态寄存器

【STM32-Sysyick】 详解及应用,深入寄存器附加代码_第2张图片
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);            /* Reload value impossible */
																   
	  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */
	  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */
	  SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
	  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | 
					   SysTick_CTRL_TICKINT_Msk   | 
					   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
	  return (0);                                                  /* Function successful */
	}

//  * 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--; 
}

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

你可能感兴趣的:(嵌入式,STM32嵌入式学习,STM32,嵌入式,stm32,内核,经验分享,单片机)