用ARM嵌入式LPC2000系列写出定时器时钟为 2 分频,实现定时 1 秒时长的定时器初始化程序
时间: 2024-02-16 20:04:08 浏览: 51
好的,根据你的要求,我给出以下程序示例:
```c
#include <lpc214x.h>
#define Fpclk 12000000 // 假设系统时钟频率为12MHz
void delay(uint count)
{
uint i,j;
for(i=0;i<count;i++)
{
for(j=0;j<5000;j++); // 每个循环大约延时1ms,共循环5000次,即延时5000ms
}
}
void init_timer()
{
T0CTCR = 0x00; // 定时器0工作在定时器模式
T0PR = 1; // 定时器0时钟为系统时钟的2分频,也就是6MHz
T0MR0 = 6000000; // 定时器0计数值为6000000,即1秒
T0MCR = 0x03; // 定时器0计数模式为MR0匹配时产生中断和复位计数器
VICVectAddr = (unsigned long)timer0_isr; // 将timer0_isr()函数的地址存入中断向量表
VICVectCntl0 = (1<<5) | 4; // 选择定时器0中断,并分配给IRQ中断向量0,即VICVectAddr0
VICIntEnable = 1<<4; // 开启定时器0中断
T0TCR = 0x01; // 启动定时器0
}
void main()
{
PINSEL0 &= ~(1<<0); // 将P0.0设置为GPIO,用来控制LED灯
IO0DIR |= 1<<0; // 将P0.0设置为输出
init_timer(); // 定时器初始化
while(1)
{
IO0PIN ^= 1<<0; // 每秒钟LED状态反转
delay(1000); // 延时1秒
}
}
__irq void timer0_isr()
{
T0IR = 1<<0; // 清除定时器0中断标志
}
```
该程序利用LPC2148单片机的定时器0,将时钟分频为2,从而实现1秒定时器。在 `init_timer()` 函数中,我们将定时器工作在定时器模式,时钟频率为系统时钟的2分频,计数值为6000000,即1秒。在计数模式为MR0匹配时产生中断和复位计数器的情况下,我们通过 `timer0_isr()` 函数中断服务程序来清除定时器0中断标志。在 `main()` 函数中,我们通过控制LED灯的状态反转来验证定时器是否工作正常。