STM32-嵌入式-04-systick系统定时器

systick系统定时器

系统定时器存在内核中,是24位的定时器,只能向下递减,嵌套在NVIC中

 

counter 在时钟的驱动下 在reload的初值开始向下递减计时到0,产生中断置位标志然后又从reload值开始重新递减计数,循环

定时时间计算

t=reload*(1/clk)

clk=72M时,t=72*(1/72m)=1us

clk=72M时,t=72000*(1/72m)=1ms

clk=72M时,t=72000000*(1/72m)=1s

1s=1000MS =1000 000US=1000 000 000NS

sysTick属于内核中的外设,他的中断优先级和外设的中断优先级相比,哪个高?

sysTick中断优先级配置的是scb->shprx寄存器

而外设的中断配置的是NVIC->iprx,有优先级分组和抢占优先级和子优先级的说法。

中断优先级在内核外设同样适用。

systick的使能函数:

static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{ 
//判断tick的值是否大于2^24,如果大于,不符合规则
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);  
//初始化reload寄存器的值                                                                    
  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      
//配置中断优先级,配置为15,默认为最低优先级  
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  
//初始化counter的值为0
  SysTick->VAL   = 0;                                         
//配置systick的时钟为72M
//使能中断
//使能systick
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | 
                   SysTick_CTRL_TICKINT_Msk   | 
                   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
  return (0);                                                  /* Function successful */
}

编写微秒延时函数

void SysTick_Delay_us(uint32_t us)
{
	uint32_t i;
	SysTick_Config(72);
	
	for(i=0;i<us;i++)
	{
		//当计数器的值时间到了后,CTRL寄存器位16会置1
		while(!((SysTick->CTRL)&(1<<16)));
	}
	SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}

利用中断来进行延时

void SysTick_Init(void)
{
	if(SysTick_Config(SystemCoreClock/100000))
		while(1);
}
void Delay_ms(__IO u32 nTime)
{
	uint32_t TimingDelay;
	TimingDelay = nTime;
	while(TimingDelay!=0)
		TimingDelay--;
}

猜你喜欢

转载自blog.csdn.net/weixin_41445387/article/details/83089594