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



(三)SYSTick定时器配置步骤
SysTick定时器的操作可以分为4步:

1、设置SysTick定时器的时钟源,系统时钟(72M)还是外部时钟(9M=系统时钟8分频),配置CTRL寄存器的CLKSOURCE数值
2、设置SysTick定时器的重装初始值(如果要使用中断的话,就将中断使能打开),LODA寄存器和CTRL寄存器的TICKINT数值
3、清零SysTick定时器当前计数器的值,VAL寄存器
4、打开SysTick定时器,CTRL寄存器的ENABLE数值
二、延时函数
为了实现定时器的功能,自己需要编写几个函数
首先定义两个全局变量
(一)定时器系统初始化函数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寄存器限制,一次最多延时u 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位,最大值不能超过(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;//清空计数器 }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/58870.html