設計要求: 設計一個基於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!!!
看下面的截圖就知道上面各個模塊的當前頻率值了: