赞
踩
(一)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()
- //SYSCLK为系统时钟,默认为72
- void SysTick_Init(u8 SYSCLK)
- {
- //设置SYSTick定时器的时钟源为系统时钟的八分频即9MHz
- SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
-
- //每计数一次所需时间为1/SYSTICK
- //1us需要的次数为SYSCLK/8=9次
- fac_us=SYSCLK/8;
- //1us*1000=1ms
- fac_ms=(u16)fac_us*1000;
- }
若出现Error: L6218E: Undefined symbol SysTick_CLKSourceConfig (referred from systick.o).错误,查看2.error:Error: L6218E: Undefined symbol SysTick_CLKSourceConfig_并不傻的袍子-CSDN博客
(二)延时1us函数delay_us()
- //微秒定时器函数
- //由于LOAD寄存器限制,一次最多延时1864000u s
- void delay_us(u32 nus)
- {
- u32 temp;
- //LODA寄存器为24位,注意最大值
- SysTick->LOAD=nus*fac_us;//时间加载,重装载初值
- SysTick->VAL=0x00;//清空计数器
- SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;//定时器使能置1,开始倒数
- do
- {
- temp=SysTick->CTRL;
- }while((temp&0x01)&&!(temp&(1<<16)));//判断CTRL寄存器的ENABLE和COUNTFLAG的值
- //等待时间到达
- SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;//关闭计数器,置0
- SysTick->VAL=0X00;//清空计数器
- }
(三)延时1ms函数delay_ms()
- //毫秒定时器函数
- //由于LOAD寄存器限制,一次最多延时1864ms
- void delay_ms(u32 nms)
- {
- u32 temp;
- //LODA寄存器为24位,最大值不能超过16777215(10进制)
- SysTick->LOAD=(u32)nms*fac_ms;//时间加载,重装载初值
- SysTick->VAL=0x00;//清空计数器
- SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;//定时器使能置1,开始倒数
- do
- {
- temp=SysTick->CTRL;
- }while((temp&0x01)&&!(temp&(1<<16)));//判断CTRL寄存器的ENABLE和COUNTFLAG的值
- //等待时间到达
- SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;//关闭计数器,置0
- SysTick->VAL=0X00;//清空计数器
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。