当前位置:   article > 正文

Systick定时器几个简单的函数简介_systick函数

systick函数

目录

Systick定时器

Systick定时器是什么?

SysTick的四个寄存器

寄存器对应的位

Systick时钟源选择函数SysTick_CLKSourceConfig()

函数体定义

函数体的查找以及函数参数的确定

时钟中断设置函数SysTick_Config(uint32_t ticks)

补充说明:ul后缀表示什么?

Systick滴答时钟的时钟源简介

SysTick_Config(uint32_t ticks)的函数体

SysTick_Config(uint32_t ticks)的工作原理

掩膜操作是什么?

延迟函数的使用

Delay_Init()函数的使用

Delay_ms函数的使用

Delay_us函数的使用


Systick定时器

Systick定时器是什么?

Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作;

SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常中断请求(异常号:15);

Systick中断的优先级也可以设置。

SysTick的四个寄存器

CTRL

SysTick 控制和状态寄存器

LOAD

SysTick 自动重装载除值寄存器

VAL

SysTick 当前值寄存器

CALIB

SysTick 校准值寄存器

寄存器对应的位

 

Systick时钟源选择函数SysTick_CLKSourceConfig()

函数体定义

  1. void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)  
  2. {  
  3.   /* Check the parameters */  
  4.   assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));  
  5.   if (SysTick_CLKSource == SysTick_CLKSource_HCLK)  
  6.   {  
  7.     SysTick->CTRL |= SysTick_CLKSource_HCLK;  
  8.   }  
  9.   else  
  10.   {  
  11.     SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;  
  12.   }  
  13. }  

 

函数体的查找以及函数参数的确定

 

时钟中断设置函数SysTick_Config(uint32_t ticks)

补充说明:ul后缀表示什么?

UL表示无符号长整型。

Systick滴答时钟的时钟源简介

对于STM32,外部时钟源是 HCLK(AHB总线时钟)的1/8;内核时钟是 HCLK时钟。

 

SysTick_Config(uint32_t ticks)的函数体

  1. static __INLINE uint32_t SysTick_Config(uint32_t ticks)  
  2. {   
  3.   if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */  
  4.                                                                  
  5.   SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */  
  6.   NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */  
  7.   SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */  
  8.   SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |   
  9.                    SysTick_CTRL_TICKINT_Msk   |   
  10.                    SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */  
  11.   return (0);                                                  /* Function successful */  
  12. }  

 

SysTick_Config(uint32_t ticks)的工作原理

  1. static __INLINE uint32_t SysTick_Config(uint32_t ticks)  
  2. {   
  3.   if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* 判断计数值是否超过MAX */  
  4.                                                                  
  5.   SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* 设置预定的计数值,以便从该数值开始倒数至0 */  
  6.   NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* 配置中断优先级 */  
  7.   SysTick->VAL   = 0;                                          /* 初始值设置为零 */  
  8.   SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |   
  9.                    SysTick_CTRL_TICKINT_Msk   |   
  10.                    SysTick_CTRL_ENABLE_Msk;                    /* 使能中断请求(IRQ)和定时器timer */  
  11.   return (0);                                                  /* 函数调用成功 */  

 

函数体中的预定义部分

  1. #define SysTick_CTRL_COUNTFLAG_Pos         16                                             /*!< SysTick CTRL: COUNTFLAG Position */  
  2. #define SysTick_CTRL_COUNTFLAG_Msk         (1ul << SysTick_CTRL_COUNTFLAG_Pos)            /*!< SysTick CTRL: COUNTFLAG Mask */  
  3.   
  4. #define SysTick_CTRL_CLKSOURCE_Pos          2                                             /*!< SysTick CTRL: CLKSOURCE Position */  
  5. #define SysTick_CTRL_CLKSOURCE_Msk         (1ul << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */  
  6.   
  7. #define SysTick_CTRL_TICKINT_Pos            1                                             /*!< SysTick CTRL: TICKINT Position */  
  8. #define SysTick_CTRL_TICKINT_Msk           (1ul << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */  
  9.   
  10. #define SysTick_CTRL_ENABLE_Pos             0                                             /*!< SysTick CTRL: ENABLE Position */  
  11. #define SysTick_CTRL_ENABLE_Msk            (1ul << SysTick_CTRL_ENABLE_Pos)               /*!< SysTick CTRL: ENABLE Mask */  

 

掩膜操作是什么?

掩膜操作听起来很高大上,其实就是遮掩其他位只对我们要操作的位进行相应的操作,比如:0x01101&A意味着将A的第2,5位进行置零操作,其他位不变。

延迟函数的使用

Delay_Init()函数的使用

函数体

  1. void delay_init() // 去除了OS的相关内容  
  2. {  
  3.     SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);   //选择外部时钟  HCLK/8  
  4.     fac_us=SystemCoreClock/8000000;             //为系统时钟的1/8    
  5.     fac_ms=(u16)fac_us*1000;                    //非OS下,代表每个ms需要的systick时钟数     

​​​​​​​            

函数功能

① 配置外部时钟源;

② 按照系统时钟源的大小配置systick滴答定时器时钟源

  1. #ifdef SYSCLK_FREQ_HSE  
  2.   uint32_t SystemCoreClock         = SYSCLK_FREQ_HSE;        /*!< System Clock Frequency (Core Clock) */  
  3. #elif defined SYSCLK_FREQ_24MHz  
  4.   uint32_t SystemCoreClock         = SYSCLK_FREQ_24MHz;        /*!< System Clock Frequency (Core Clock) */  
  5. #elif defined SYSCLK_FREQ_36MHz  
  6.   uint32_t SystemCoreClock         = SYSCLK_FREQ_36MHz;        /*!< System Clock Frequency (Core Clock) */  
  7. #elif defined SYSCLK_FREQ_48MHz  
  8.   uint32_t SystemCoreClock         = SYSCLK_FREQ_48MHz;        /*!< System Clock Frequency (Core Clock) */  
  9. #elif defined SYSCLK_FREQ_56MHz  
  10.   uint32_t SystemCoreClock         = SYSCLK_FREQ_56MHz;        /*!< System Clock Frequency (Core Clock) */  
  11. #elif defined SYSCLK_FREQ_72MHz  
  12.   uint32_t SystemCoreClock         = SYSCLK_FREQ_72MHz;        /*!< System Clock Frequency (Core Clock) */  
  13. #else /*!< HSI Selected as System Clock source */  
  14.   uint32_t SystemCoreClock         = HSI_VALUE;        /*!< System Clock Frequency (Core Clock) */  
  15. #endif  

 

③ 计算毫秒/微秒的延迟因子。

Delay_ms函数的使用

  1. void delay_us(u32 nus) // 非OS的delay函数的调用  
  2. {         
  3.     u32 temp;              
  4.     SysTick->LOAD=nus*fac_us;                    //时间加载             
  5.     SysTick->VAL=0x00;                           //清空计数器  
  6.     SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //使能systcik滴答定时器        
  7.     do  
  8.     {  
  9.         temp=SysTick->CTRL;  
  10.     }while((temp&0x01)&&!(temp&(1<<16)));     //等待直达条件不成立     
  11.     SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器  
  12.     SysTick->VAL =0X00;                           //清空计数器       
  13. }  
  14. // systick滴答定时器退出循环的标志:systick滴答定时器被使能+计数器自减至0  

 

Delay_us函数的使用

使用原理如上“Delay_ms函数的使用”。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/755754
推荐阅读
  

闽ICP备14008679号