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”
- #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。