lpc1114系统定时器systick

SysTick是Cortex-M0内核的一部分。它主要被用来作为嵌入式操作系统的10ms中断定时器。在单片机不上操作系统的时候,它就可以作为一个普通的定时器使用。

SysTick是一个24位的倒计时定时器。也就是说它在工作的时候,是倒着数数的。例如给这个定时器的初值为488,它将会从488倒着数到0,然后产生中断。

寄存器定义

1. 系统定时器控制和状态寄存器CTRL

符号 描述 复位值
0 ENABLE 系统定时器允许位。1,允许;0,不允许。 0
1 TICKINT 系统定时器中断允许位。1,允许;0,不允许。 0
2 CLKSOURCE 系统定时器时钟源选择位。1,时钟=主时钟;0,时钟=主时钟/2.
15:3 保留。不能给这些位写1. 不定
16 COUNTFLAG 系统定时器倒计到0,此位置1.
31:17 保留。不能给这些位写1. 不定

 

2. 系统定时器重载值寄存器LOAD

符号 描述 复位值
23:0 RELOAD 系统定时器计数器倒数到0后,将此数再次赋予定时器初值 0
31:24 保留。不能给这些位写1. 不定

 

3. 系统定时器当前值寄存器VAL

符号 描述 复位值
23:0 CURRENT 读此寄存器返回系统定时器的当前值。给这个寄存器赋值,将使定时器归0,且清CTRL中的COUNTFLAG位。 0
31:24 保留。不能给这些位写1. 不定

 

?应用例程

新建一个工程,结构如下图所示:

新建文件

在main.c文件中,加入以下代码:

#include “lpc11xx.h”

  1. #define LED1_ON? LPC_GPIO1->DATA &= ~(1<<0)
  2. #define LED1_OFF LPC_GPIO1->DATA |= (1<<0)
  3. #define LED2_ON? LPC_GPIO1->DATA &= ~(1<<1)
  4. #define LED2_OFF LPC_GPIO1->DATA |= (1<<1)
  1. uint32_t msTicks=0;
  1. void led_init()
  2. {
  3. ???LPC_SYSCON->SYSAHBCLKCTRL |= (1<<16); // 使能IOCON时钟
  4. ???LPC_IOCON->R_PIO1_0 &= ~0x07;
  5. ???LPC_IOCON->R_PIO1_0 |= 0x01; //把P1.0脚设置为GPIO
  6. ???LPC_IOCON->R_PIO1_1 &= ~0x07;
  7. ???LPC_IOCON->R_PIO1_1 |= 0x01; //把P1.1脚设置为GPIO
  8. ???LPC_SYSCON->SYSAHBCLKCTRL &= ~(1<<16); // 禁能IOCON时钟
  1. ???LPC_GPIO1->DIR |= (1<<0);
  2. ???LPC_GPIO1->DATA |= (1<<0);
  3. ???LPC_GPIO1->DIR |= (1<<1);
  4. ???LPC_GPIO1->DATA |= (1<<1);
  5. }
  1. void SysTick_Handler(void)
  2. {
  3. ???msTicks++;
  4. }
  1. int main()
  2. {
  3. ???led_init();
  4. ???SysTick_Config(SystemCoreClock/100); //设置每毫秒进一次中断
  1. ???while(1)
  2. ???{
  3. ??????while(msTicks<100);
  4. ??????msTicks = 0;
  5. ??????LED1_ON;
  6. ??????LED2_OFF;
  7. ??????while(msTicks<100);
  8. ??????LED1_OFF;
  9. ??????LED2_ON;
  10. ??????msTicks = 0;
  11. ???}
  12. }

此例程实现了一个流水灯的效果。目的不是怎么做流水灯,而是怎么使用用Systick。

第27行,SysTick_Config()函数是KEIL自带的函数,位于core_cm0.h文件中。用来配置系统定时器的中断间隔时间。这个函数的参数不能大于24位值,参数是要赋给LOAD寄存器的。在SysTick_Config()函数中,把CTRL寄存器的bit2设置为1,即选择主时钟作为系统定时器的时钟源。那么,定时器两值递减的时间间隔就是1/ SystemCoreClock秒,SystemCoreClock是当前的主频,当配置好主频后,这个寄存器的值就被赋予了主频值,所以,我们以后如果要用当前主频,直接用SystemCoreClock即可。比如,要产生10毫秒的时间间隔,参数就应该是SystemCoreClock/100。