今天练习了32中的SysTick定时器,通常叫做滴答定时器。定时器的作用,用过51的想必都知道。定时器主要用来处理一些周期性的,时间间隔固定的事件。同时定时器也可以用来得到一个事件所耗费的时间。下面来看一下滴答定时器的配置过程:
- 初始化定时器,配置定时进入中断的时间间隔
- 如果配置失败,则死循环等待
- 配置成功后,先关闭定时器
- 在延时函数中使用全局变量记录进入了中断几次,并使能定时器
- 书写中断所要执行的代码
下面来看看代码(systick.c):
#include"systick.h"
u32 TimeTemp;
void SysTick_Init(void)
{
if(SysTick_Config(SystemCoreClock/1000))
{
while(1);
}
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
void Delay_ms(u32 nTime)
{
TimeTemp = nTime;
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
while(TimeTemp != 0);
}
void TimeTemp_Decrement()
{
if(TimeTemp != 0)
{
TimeTemp--;
}
}
SysTick_Config(SystemCoreClock/1000)
初始化定时器进入中断的时间间隔。SystemCoreClock/1000表示1ms进入中断;SystemCoreClock/100000表示1us进入中断。如果配置成功,跳过if判断,执行SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;来关闭定时器。
void Delay_ms(u32 nTime)
{
TimeTemp = nTime;
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
while(TimeTemp != 0);
}
该函数提供被使用者所调用的延时函数,传入的参数为延时的时长,单位是毫秒。然后执行SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;用来使能定时器,使定时器开始工作。最后等待设置的时间,已达到延时的目的。
void TimeTemp_Decrement()
{
if(TimeTemp != 0)
{
TimeTemp--;
}
}
该函数为在中断中要执行的函数,主要来计数进入中断几次,直到设置的时间结束。
下面来看一下主函数(main.c):
#include"led.h"
#include"usart.h"
#include"systick.h"
int main(void)
{
GPIO_LED_Config();
USART1_Config();
SysTick_Init();
while(1)
{
printf("Turn on the Light!\r\n");
LED(ON);
Delay_us(5000);
printf("Turn off the Light!\r\n");
LED(OFF);
Delay_us(5000);
}
}
void SysTick_Handler(void)
{
TimeTemp_Decrement();
}
这个定时器的相对来说是比较简单的,并且它不是外设,它在32的内核之中。比较容易实现简单的定时任务。