当前位置:   article > 正文

九、SysTick系统定时器_systick_init()

systick_init()

一、操作步骤

(一)SYSTick定时器介绍

SysTick定时器也叫SysTick滴答定时器,它是Cortex-M3内核的一个外设,被嵌入在NVIC中。它是一个24位向下递减的定时器,每计数一次所需时间为1/SYSTICK,SYSTICK是系统定时器时钟,它可以直接取自系统时钟,还可以通过系统时钟8分频后获取。当定时器计数到0时,将从LOAD寄存器中自动重装定时器初值,重新向下递减计数,如此循环往复。如果开启SysTick中断的话,当定时器计数到0,将产生一个中断信号。因此只要知道计数的次数就可以准确得到它的延时时间。

(二)SYSTick定时器寄存器

1、CTRL寄存器
CTRL是SysTick定时器的控制及状态寄存器。其相应位功能如下:

2、LODA寄存器

LOAD是SYSTick定时器的重装载数值寄存器。其相应位功能如下:

3、VAL寄存器
VAL是SysTick定时器的当前数值寄存器。其相应位功能如下:

4、CALIB寄存器(用得少)
CALIB是SysTick定时器的校准数值寄存器。其相应位功能如下:

(三)SYSTick定时器配置步骤

SysTick定时器的操作可以分为4步:

1、设置SysTick定时器的时钟源,系统时钟(72M)还是外部时钟(9M=系统时钟8分频),配置CTRL寄存器的CLKSOURCE数值

2、设置SysTick定时器的重装初始值(如果要使用中断的话,就将中断使能打开),LODA寄存器和CTRL寄存器的TICKINT数值

3、清零SysTick定时器当前计数器的值,VAL寄存器

4、打开SysTick定时器,CTRL寄存器的ENABLE数值

 

二、延时函数

为了实现定时器的功能,自己需要编写几个函数

首先定义两个全局变量

static u8 fac_us=0;//一微秒需要的计时次数
static u16 fac_ms=0;//一毫秒需要的计时次数

(一)定时器系统初始化函数SYSTick_Init()

  1. //SYSCLK为系统时钟,默认为72
  2. void SysTick_Init(u8 SYSCLK)
  3. {
  4. //设置SYSTick定时器的时钟源为系统时钟的八分频即9MHz
  5. SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
  6. //每计数一次所需时间为1/SYSTICK
  7. //1us需要的次数为SYSCLK/8=9次
  8. fac_us=SYSCLK/8;
  9. //1us*1000=1ms
  10. fac_ms=(u16)fac_us*1000;
  11. }

若出现Error: L6218E: Undefined symbol SysTick_CLKSourceConfig (referred from systick.o).错误,查看2.error:Error: L6218E: Undefined symbol SysTick_CLKSourceConfig_并不傻的袍子-CSDN博客

(二)延时1us函数delay_us()

  1. //微秒定时器函数
  2. //由于LOAD寄存器限制,一次最多延时1864000u s
  3. void delay_us(u32 nus)
  4. {
  5. u32 temp;
  6. //LODA寄存器为24位,注意最大值
  7. SysTick->LOAD=nus*fac_us;//时间加载,重装载初值
  8. SysTick->VAL=0x00;//清空计数器
  9. SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;//定时器使能置1,开始倒数
  10. do
  11. {
  12. temp=SysTick->CTRL;
  13. }while((temp&0x01)&&!(temp&(1<<16)));//判断CTRL寄存器的ENABLE和COUNTFLAG的值
  14. //等待时间到达
  15. SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;//关闭计数器,置0
  16. SysTick->VAL=0X00;//清空计数器
  17. }

(三)延时1ms函数delay_ms()

  1. //毫秒定时器函数
  2. //由于LOAD寄存器限制,一次最多延时1864ms
  3. void delay_ms(u32 nms)
  4. {
  5. u32 temp;
  6. //LODA寄存器为24位,最大值不能超过16777215(10进制)
  7. SysTick->LOAD=(u32)nms*fac_ms;//时间加载,重装载初值
  8. SysTick->VAL=0x00;//清空计数器
  9. SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;//定时器使能置1,开始倒数
  10. do
  11. {
  12. temp=SysTick->CTRL;
  13. }while((temp&0x01)&&!(temp&(1<<16)));//判断CTRL寄存器的ENABLE和COUNTFLAG的值
  14. //等待时间到达
  15. SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;//关闭计数器,置0
  16. SysTick->VAL=0X00;//清空计数器
  17. }

 

 

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

闽ICP备14008679号