lpc1114系统定时器systick
扫描二维码
随时随地手机看文章
SysTick是Cortex-M0内核的一部分。它主要被用来作为嵌入式操作系统的10ms中断定时器。在单片机不上操作系统的时候,它就可以作为一个普通的定时器使用。
SysTick是一个24位的倒计时定时器。也就是说它在工作的时候,是倒着数数的。例如给这个定时器的初值为488,它将会从488倒着数到0,然后产生中断。
寄存器定义
1. 系统定时器控制和状态寄存器CTRL
位符号描述复位值0ENABLE系统定时器允许位。1,允许;0,不允许。01TICKINT系统定时器中断允许位。1,允许;0,不允许。02CLKSOURCE系统定时器时钟源选择位。1,时钟=主时钟;0,时钟=主时钟/2.15:3–保留。不能给这些位写1.不定16COUNTFLAG系统定时器倒计到0,此位置1.
31:17–保留。不能给这些位写1.不定
2. 系统定时器重载值寄存器LOAD
位符号描述复位值23:0RELOAD系统定时器计数器倒数到0后,将此数再次赋予定时器初值031:24–保留。不能给这些位写1.不定3. 系统定时器当前值寄存器VAL
位符号描述复位值23:0CURRENT读此寄存器返回系统定时器的当前值。给这个寄存器赋值,将使定时器归0,且清CTRL中的COUNTFLAG位。031:24–保留。不能给这些位写1.不定应用例程
新建一个工程,结构如下图所示:
在main.c文件中,加入以下代码:
#include “lpc11xx.h”
#define LED1_ON LPC_GPIO1->DATA &= ~(1<<0)
#define LED1_OFF LPC_GPIO1->DATA |= (1<<0)
#define LED2_ON LPC_GPIO1->DATA &= ~(1<<1)
#define LED2_OFF LPC_GPIO1->DATA |= (1<<1)
uint32_t msTicks=0;
void led_init()
{
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<16); // 使能IOCON时钟
LPC_IOCON->R_PIO1_0 &= ~0x07;
LPC_IOCON->R_PIO1_0 |= 0x01; //把P1.0脚设置为GPIO
LPC_IOCON->R_PIO1_1 &= ~0x07;
LPC_IOCON->R_PIO1_1 |= 0x01; //把P1.1脚设置为GPIO
LPC_SYSCON->SYSAHBCLKCTRL &= ~(1<<16); // 禁能IOCON时钟
LPC_GPIO1->DIR |= (1<<0);
LPC_GPIO1->DATA |= (1<<0);
LPC_GPIO1->DIR |= (1<<1);
LPC_GPIO1->DATA |= (1<<1);
}
void SysTick_Handler(void)
{
msTicks++;
}
int main()
{
led_init();
SysTick_Config(SystemCoreClock/100); //设置每毫秒进一次中断
while(1)
{
while(msTicks<100);
msTicks = 0;
LED1_ON;
LED2_OFF;
while(msTicks<100);
LED1_OFF;
LED2_ON;
msTicks = 0;
}
}
此例程实现了一个流水灯的效果。目的不是怎么做流水灯,而是怎么使用用Systick。
第27行,SysTick_Config()函数是KEIL自带的函数,位于core_cm0.h文件中。用来配置系统定时器的中断间隔时间。这个函数的参数不能大于24位值,参数是要赋给LOAD寄存器的。在SysTick_Config()函数中,把CTRL寄存器的bit2设置为1,即选择主时钟作为系统定时器的时钟源。那么,定时器两值递减的时间间隔就是1/ SystemCoreClock秒,SystemCoreClock是当前的主频,当配置好主频后,这个寄存器的值就被赋予了主频值,所以,我们以后如果要用当前主频,直接用SystemCoreClock即可。比如,要产生10毫秒的时间间隔,参数就应该是SystemCoreClock/100。