SysTick 定时器是一个24位定时器,向下计数到零就会产生一个中断。这样为的是可以提供一个固定的10 毫秒间隔的中断。SysTick 定时器的时钟来自CPU 时钟(系统时钟) ,或来自被固定到CPU时钟频率的一半的参考时钟。为了连续产生特定时间间隔的中断,SYST_RVR寄存器必须用正确的值进行初始化,以保证获得所需的时间间隔。在SYST_CALIB 寄存器中有一个默认值,可以通过软件修改。如果设置为默认设置,则会每10 毫秒产生一次中断。
通过以下寄存器对系统滴答定时器进行配置:
1.引脚:系统滴答定时器不使用外部引脚。
2.电源:系统滴答定时器是通过SysTick 控制寄存器配置允许。系统滴答定时器时钟源是固定的系统时钟频率的一半,即参考时钟。
3. SYST_CSR寄存器使能SysTick 定时器时钟源。
SysTick 定时器是Cortex-M0 内部集成的一部分。SysTick 定时器的作用是产生一个固定的10 毫秒中断,供操作系统或其它系统管理软件使用。
名称 访问方式 地址偏移 描述 复位值
SYST_CSR R/W 0x010 系统定时器控制和状态寄存器 0x000 0000
SYST_RVR R/W 0x014 系统定时器重载寄存器 0
SYST_CVR R/W 0x018 系统定时器当前计数值寄存器 0
SYST_CALIB R/W 0x01C 系统定时器校准值寄存器 0x4
寄存器描述详见“LPC111x_11Cxx_UM_Simp_Chinese”手册P291
以下是systick代码部分,使用滴答定时器实现简单的定时功能
#include "LPC11xx.h" /* LPC11xx definitions */
#include "gpio.h"
#define SYSTICK_DELAY
5000
volatile uint32_t TimeTick = 0;
/* SysTick interrupt happens every 10 ms */
void SysTick_Handler(void)
{
TimeTick++;
}
void delaySysTick(uint32_t tick)
{
uint32_t timetick;
/* Clear SysTick Counter */
SysTick->VAL = 0;
/* Enable the SysTick Counter */
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
timetick = TimeTick;
while ((TimeTick - timetick) < tick);
/* Disable SysTick Counter */
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
/* Clear SysTick Counter */
SysTick->VAL = 0;
return;
}
/* Main Program */
int main (void)
{
SystemInit();
/* Called for system library in core_cmx.h(x=0 or 3). */
SysTick_Config( SYSTICK_DELAY );
/* Enable AHB clock to the GPIO domain. */
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6);
/* Set port 3_0 to output */
GPIOSetDir( 1, 6, 1 );
while (1) /* Loop forever */
{
delaySysTick(SYSTICK_DELAY);
GPIOSetValue( 1, 6, 0 );
delaySysTick(SYSTICK_DELAY);
GPIOSetValue( 1, 6, 1 );
}
}