STM32-定时器快速学习(本文仅对SysTick定时器进行介绍)

除了定时中断功能,SysTick定时器还可以用于提供延时功能(就是和延时函数一样的功能)。通过将SysTick定时器的计数器减去一个已知的值,并检查计数器是否为零,可以实现精确的延时功能。
1.不多bb直接用(我这里用的是查询方式)
void SysTick_Delay_ms(uint32_t ms)
{    uint32_t i;
        SysTick_Config(72000);
     for(i=0;i    {    while( !((SysTick->CTRL)&(1<<16)) );//判断第十六位
   }
     SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;//关闭开关 
}    

如果想定时1秒那么 void SysTick_Delay_ms(1000);这种形式
如果想定时0.5秒那么 void SysTick_Delay_ms(500);这种形式,剩下直接看需求进行改写。
因为大部分此时应该快速解决问题,因此原理后面进行。
下面用中断来实现
volatile uint32_t isr_ms;//这个变量很在中断服务函数里面也要用所以先这样用再说
void SysTick_Delay_ms_NVIC(uint32_t nms)
{        isr_ms= nms;
        SysTick_Config(72000);
     while(isr_ms);
     SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;//关闭开关 
}      
中断服务函数,下面中断写在"stm32f10x_it.c"文件中,问就是先用上再说
extern volatile uint32_t isr_ms;
void SysTick_Handler(void)
{  isr_ms--;
}
2.systick介绍
在stm32中存在很多定时器,可以分为三大类,一类是内核中的systick(也就是本文中)第二类是常规的定时器,包括高级定时器TIM1和TIM8,通用定时器TIM2.和TIM3.TIM4.TIM5,基本定时器TIM6和TIM7.SysTick定时器的工作原理是,当启用定时器后,它会以指定的时钟源作为时基, SysTick 定时器的计数器是向下递减计数的。当计数到0时,会触发一个中断,并重新加载重装载值寄存器的值,继续计数。这样就可以实现定时中断、延时等功能除了定时中断功能,SysTick定时器还可以用于提供延时功能。通过将SysTick定时器的计数器减去一个已知的值,并检查计数器是否为零,可以实现精确的延时功能。
3.基本结构
CTRL:控制和状态寄存器,就是开关
LOAD:重装载值寄存器,也就是初始值。每次计数递减到0时,会自动重新加载该值。
VAL:当前值寄存器(字面意思)
CALIB:校准值寄存器,用于提供定时器的校准信息,包括时钟频率和是否支持外部时钟源等。

static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{    
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            //最大不超过2^24,这里if判断是否    
                  
         SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;   //初始化寄存器,也就是赋初值          
            
    NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);//配置中断优先级(毕竟systick嵌套在NVIC上面)
    
    SysTick->VAL   = 0;                               //计数器清零         
  
    SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | 
                                       SysTick_CTRL_TICKINT_Msk   | 
                                        SysTick_CTRL_ENABLE_Msk;                   
  return (0);                                                
}

上面这部分一般不需要我们配置,所以看个人需求去相应头文件里面改

4.注意事项
不要定时贺中断同时使用
SysTick定时器是一个24位的递减计数器,最大计数值为224−1,所以要根据时钟源的频率选择合适的重装载值,避免溢出或不精确。
SysTick定时器的时钟源可以是系统时钟或系统时钟的8分频,一般选择8分频可以节省功耗,也可以提高定时的精度。
SysTick定时器可以选择是否产生中断,如果产生中断,需要设置中断优先级,以免影响其他更重要的中断。
SysTick定时器的校准值寄存器是只读的,不同的芯片可能有不同的校准值,如果要使用校准功能,需要先检查该寄存器的有效性和准确性。
 

你可能感兴趣的:(stm32,学习,单片机,嵌入式硬件)