lpc1114系統(tǒng)定時器systick
SysTick是Cortex-M0內核的一部分。它主要被用來作為嵌入式操作系統(tǒng)的10ms中斷定時器。在單片機不上操作系統(tǒng)的時候,它就可以作為一個普通的定時器使用。
SysTick是一個24位的倒計時定時器。也就是說它在工作的時候,是倒著數(shù)數(shù)的。例如給這個定時器的初值為488,它將會從488倒著數(shù)到0,然后產生中斷。
寄存器定義
1. 系統(tǒng)定時器控制和狀態(tài)寄存器CTRL
位符號描述復位值0ENABLE系統(tǒng)定時器允許位。1,允許;0,不允許。01TICKINT系統(tǒng)定時器中斷允許位。1,允許;0,不允許。02CLKSOURCE系統(tǒng)定時器時鐘源選擇位。1,時鐘=主時鐘;0,時鐘=主時鐘/2.15:3–保留。不能給這些位寫1.不定16COUNTFLAG系統(tǒng)定時器倒計到0,此位置1.
31:17–保留。不能給這些位寫1.不定
2. 系統(tǒng)定時器重載值寄存器LOAD
位符號描述復位值23:0RELOAD系統(tǒng)定時器計數(shù)器倒數(shù)到0后,將此數(shù)再次賦予定時器初值031:24–保留。不能給這些位寫1.不定3. 系統(tǒng)定時器當前值寄存器VAL
位符號描述復位值23:0CURRENT讀此寄存器返回系統(tǒng)定時器的當前值。給這個寄存器賦值,將使定時器歸0,且清CTRL中的COUNTFLAG位。031:24–保留。不能給這些位寫1.不定應用例程
新建一個工程,結構如下圖所示:
在main.c文件中,加入以下代碼:
#include “l(fā)pc11xx.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;
}
}
此例程實現(xiàn)了一個流水燈的效果。目的不是怎么做流水燈,而是怎么使用用Systick。
第27行,SysTick_Config()函數(shù)是KEIL自帶的函數(shù),位于core_cm0.h文件中。用來配置系統(tǒng)定時器的中斷間隔時間。這個函數(shù)的參數(shù)不能大于24位值,參數(shù)是要賦給LOAD寄存器的。在SysTick_Config()函數(shù)中,把CTRL寄存器的bit2設置為1,即選擇主時鐘作為系統(tǒng)定時器的時鐘源。那么,定時器兩值遞減的時間間隔就是1/ SystemCoreClock秒,SystemCoreClock是當前的主頻,當配置好主頻后,這個寄存器的值就被賦予了主頻值,所以,我們以后如果要用當前主頻,直接用SystemCoreClock即可。比如,要產生10毫秒的時間間隔,參數(shù)就應該是SystemCoreClock/100。