定时1s
/*
*函数功能:16B0 初始化
*计时1s
*/
void TMR16B0_Init(){//定时器初始化 定时1s
LPC_SYSCON->SYSAHBCLKCTRL |=(1<<7);//使能16B0
LPC_TMR16B0->MCR =3; //匹配MR0时复位TC且中断
LPC_TMR16B0->PR=799; //预分频值 3999
LPC_TMR16B0->MR0=SystemCoreClock/800; // 设置周期为1秒
LPC_TMR16B0->TCR=0X01; //启动定时
NVIC_EnableIRQ(TIMER_16_0_IRQn); //启动中断
}
/*
*16B0中断函数
*/
void TIMER16_0_IRQHandler(){......
......
LPC_TMR16B0->IR |=0X01; //清中断
}void TIMER16_0_IRQHandler(void) {
static int flag = 0; // 清除定时器0的匹配寄存器0的中断标志位
LPC_TMR16B0->IR |=0X01; // 反转GPIO1_9引脚电平
if (flag == 0) {
LPC_GPIO1->DATA |= (1<<9);
flag = 1;
}
else {
LPC_GPIO1->DATA &= ~(1<<9);
flag = 0; }
}
要将定时器的触发时间改为0.5秒,需要根据计时器的工作原理进行计算,然后将代码中的预分频值和匹配寄存器的值进行修改。
首先,计数器TC每计数1次所需要的时间为:
time_per_count = (1 / SystemCoreClock) * (PR + 1)
其中,SystemCoreClock是芯片的主频,PR是预分频值。当前代码中的预分频值为799,所以:
time_per_count = (1 / 100000000) * (799 + 1) = 8e-9 s
这意味着每个计数器TC的值代表的时间是8纳秒。
为了实现0.5秒的定时,我们需要让计数器TC在500毫秒后达到匹配寄存器的值。因此,我们需要将匹配寄存器的值设为:
MR0_value = 500ms / time_per_count = 500ms / (8e-9 s/count) = 62500 counts
MR0_value = 1000ms / time_per_count = 1000ms / (8e-9 s/count) = 125000 counts