设计要求: 设计一个基于Timer0,要求1ms定时中断?
答: 代码如下(开发环境:路虎NPC1768开发板)
/* Include files */
/* <<add include files here>> */
#include "lpc17xx_libcfg.h"
#include "lpc17xx.h"
/* Add Private Types */
/* <<add private type here >> */
#define CCLK 100000000
#define PCLK0 CCLK/4
/* Add Private Variables */
/* <<add private variables here >> */
/* Add Private Functions */
/* <<add private functions here >> */
void Init_Timer0(void)
{
LPC_TIM0->CTCR=0; //定时器模式
LPC_TIM0->PR=0;
LPC_TIM0->PC=0;
LPC_TIM0->TC=0; //计数寄存器清零
LPC_TIM0->MR0=PCLK0/1000-1;
LPC_TIM0->MCR=0x03; //匹配后产生中断和复位TC
LPC_TIM0->TCR=1; //启动定时器0
NVIC_EnableIRQ(TIMER0_IRQn);
}
/**
* @brief Main program body
*/
int c_entry(void)
{
/* <<add code here >> */
LPC_GPIO2->FIODIR = 0xff; /* LEDs PORT2 are Output */
LPC_GPIO2->FIOPIN = 0x00;
Init_Timer0();
while(1);
return 1;
}
void TIMER0_IRQHandler(void)
{
LPC_TIM0->IR |= 1; //清除MR0
LPC_GPIO2->FIOPIN ^= (1<<0);
__NOP();
}
/* Support required entry point for other toolchain */
int main (void)
{
return c_entry();
}
程序点拨: 第一次玩NPC单片机的,或者说之前玩的是STM32, 可能对定时器里的PR和PC这两个寄存器有点蒙,它们的默认值是0,
说简单点,PR是对PCLK进一步分配,PC值计数,计数到跟PR值相等的时候TC值才加1,可以将PR理解成Timerx的预分频寄存器;
初始化时候PC保持默认值0就可以了。
还有一点需要注意下:
CPU主频默认是100MHz,外设主频默认是四分之一CCLK!!!
看下面的截图就知道上面各个模块的当前频率值了: