当前位置:   article > 正文

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

systick 库函数

 配套开发板请移步博主小店: 
​​​​​​​https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.50111debhMzSwz&ft=t&id=660179379335

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

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

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. SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */
  5. NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */
  6. SysTick->VAL = 0; /* Load the SysTick Counter Value */
  7. SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
  8. SysTick_CTRL_TICKINT_Msk |
  9. SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
  10. return (0); /* Function successful */
  11. }

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. SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* 设置预定的计数值,以便从该数值开始倒数至0 */
  5. NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* 配置中断优先级 */
  6. SysTick->VAL = 0; /* 初始值设置为零 */
  7. SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
  8. SysTick_CTRL_TICKINT_Msk |
  9. SysTick_CTRL_ENABLE_Msk; /* 使能中断请求(IRQ)和定时器timer */
  10. return (0); /* 函数调用成功 */
  11. }

函数体中的预定义部分

  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. #define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */
  4. #define SysTick_CTRL_CLKSOURCE_Msk (1ul << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */
  5. #define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */
  6. #define SysTick_CTRL_TICKINT_Msk (1ul << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */
  7. #define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */
  8. #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时钟数
  6. }

函数功能

① 配置外部时钟源;

② 按照系统时钟源的大小配置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/盐析白兔/article/detail/755727
推荐阅读
相关标签
  

闽ICP备14008679号