现在的位置: 首页 > 综合 > 正文

stm32的Systick定时器

2017年03月25日 ⁄ 综合 ⁄ 共 1913字 ⁄ 字号 评论关闭
Systick定时器简介:
Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。
Systick有四个相关的寄存器:


CTRL             SysTick 控制和状态寄存器 

LOAD            SysTick 自动重装载除值寄存器 

VAL               SysTick 当前值寄存器 

CALIB           SysTick 校准值寄存器


固件库V3.5中Systick的相关函数如下:

   SysTick_CLKSourceConfig()   //Systick时钟源选择

   SysTick_Config(uint32_t ticks) //初始化systick,时钟为HCLK,并开启中断

Systick中断服务函数:

  void SysTick_Handler(void);


使用systick查询延时nus的设计思路:

 1.计算出产生1us 需要多少个时钟周期 fac_us;     

 2.计算出RELOAD寄存器的值

 (也就是产生相应延时所需要的时钟周期数);

   RELOAD=fac_us * nus

 3.开启计数;

 4.循环检测计数到0的标志位;

 5.  清空计数器,关闭定时器;



delay_us()函数:

void delay_us(u32nus)


      u32 temp;         

      SysTick->LOAD=nus*fac_us; //时间加载       

      SysTick->VAL=0x00;        //清空计数器

      SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;          //开始倒数 

       do

        {

  temp=SysTick->CTRL;

        }

       while(temp&0x01&&!(temp&(1<<16)));//等待时间到达  

        SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭计数器 

       SysTick->VAL =0X00;       //清空计数器 

}

delay_ms()函数:

//延时nms

//注意nms的范围

//SysTick->LOAD为24位寄存器,所以,最大延时为:

//nms<=0xffffff*8*1000/SYSCLK

//SYSCLK单位为Hz,nms单位为ms

//对72M条件下,nms<=1864

void delay_ms(u16 nms)

{          

     u32 temp;    

     SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)

     SysTick->VAL =0x00;           //清空计数器

     SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;          //开始倒数 

    do

      {

              temp=SysTick->CTRL;

       }

     while(temp&0x01&&!(temp&(1<<16)));//等待时间到达  

      SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭计数器

      SysTick->VAL =0X00;       //清空计数器          

}

用中断的方式实现delay:

static__IO uint32_t TimingDelay;

voidDelay(__IO uint32_t nTime)

{

   TimingDelay = nTime;

   while(TimingDelay != 0);

}

void SysTick_Handler(void)

{

    if (TimingDelay != 0x00)

     {

       TimingDelay--;

     }

}

 int main(void)

 {  …

    if (SysTick_Config(SystemCoreClock /1000)) //systick时钟为HCLK,中断时间间隔1ms

     {

     while (1);

     }

    while(1)

     {

      …

     Delay(200);//2ms

     …

     }

}


抱歉!评论已关闭.