lpc1114系統(tǒng)定時(shí)器systick
掃描二維碼
隨時(shí)隨地手機(jī)看文章
SysTick是Cortex-M0內(nèi)核的一部分。它主要被用來(lái)作為嵌入式操作系統(tǒng)的10ms中斷定時(shí)器。在單片機(jī)不上操作系統(tǒng)的時(shí)候,它就可以作為一個(gè)普通的定時(shí)器使用。
SysTick是一個(gè)24位的倒計(jì)時(shí)定時(shí)器。也就是說(shuō)它在工作的時(shí)候,是倒著數(shù)數(shù)的。例如給這個(gè)定時(shí)器的初值為488,它將會(huì)從488倒著數(shù)到0,然后產(chǎn)生中斷。
寄存器定義
1. 系統(tǒng)定時(shí)器控制和狀態(tài)寄存器CTRL
位符號(hào)描述復(fù)位值0ENABLE系統(tǒng)定時(shí)器允許位。1,允許;0,不允許。01TICKINT系統(tǒng)定時(shí)器中斷允許位。1,允許;0,不允許。02CLKSOURCE系統(tǒng)定時(shí)器時(shí)鐘源選擇位。1,時(shí)鐘=主時(shí)鐘;0,時(shí)鐘=主時(shí)鐘/2.15:3–保留。不能給這些位寫(xiě)1.不定16COUNTFLAG系統(tǒng)定時(shí)器倒計(jì)到0,此位置1.
31:17–保留。不能給這些位寫(xiě)1.不定
2. 系統(tǒng)定時(shí)器重載值寄存器LOAD
位符號(hào)描述復(fù)位值23:0RELOAD系統(tǒng)定時(shí)器計(jì)數(shù)器倒數(shù)到0后,將此數(shù)再次賦予定時(shí)器初值031:24–保留。不能給這些位寫(xiě)1.不定3. 系統(tǒng)定時(shí)器當(dāng)前值寄存器VAL
位符號(hào)描述復(fù)位值23:0CURRENT讀此寄存器返回系統(tǒng)定時(shí)器的當(dāng)前值。給這個(gè)寄存器賦值,將使定時(shí)器歸0,且清CTRL中的COUNTFLAG位。031:24–保留。不能給這些位寫(xiě)1.不定應(yīng)用例程
新建一個(gè)工程,結(jié)構(gòu)如下圖所示:
在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時(shí)鐘
LPC_IOCON->R_PIO1_0 &= ~0x07;
LPC_IOCON->R_PIO1_0 |= 0x01; //把P1.0腳設(shè)置為GPIO
LPC_IOCON->R_PIO1_1 &= ~0x07;
LPC_IOCON->R_PIO1_1 |= 0x01; //把P1.1腳設(shè)置為GPIO
LPC_SYSCON->SYSAHBCLKCTRL &= ~(1<<16); // 禁能IOCON時(shí)鐘
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); //設(shè)置每毫秒進(jìn)一次中斷
while(1)
{
while(msTicks<100);
msTicks = 0;
LED1_ON;
LED2_OFF;
while(msTicks<100);
LED1_OFF;
LED2_ON;
msTicks = 0;
}
}
此例程實(shí)現(xiàn)了一個(gè)流水燈的效果。目的不是怎么做流水燈,而是怎么使用用Systick。
第27行,SysTick_Config()函數(shù)是KEIL自帶的函數(shù),位于core_cm0.h文件中。用來(lái)配置系統(tǒng)定時(shí)器的中斷間隔時(shí)間。這個(gè)函數(shù)的參數(shù)不能大于24位值,參數(shù)是要賦給LOAD寄存器的。在SysTick_Config()函數(shù)中,把CTRL寄存器的bit2設(shè)置為1,即選擇主時(shí)鐘作為系統(tǒng)定時(shí)器的時(shí)鐘源。那么,定時(shí)器兩值遞減的時(shí)間間隔就是1/ SystemCoreClock秒,SystemCoreClock是當(dāng)前的主頻,當(dāng)配置好主頻后,這個(gè)寄存器的值就被賦予了主頻值,所以,我們以后如果要用當(dāng)前主頻,直接用SystemCoreClock即可。比如,要產(chǎn)生10毫秒的時(shí)間間隔,參數(shù)就應(yīng)該是SystemCoreClock/100。