lpc1768这样配置定时器pclk是多少?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lpc1768这样配置定时器pclk是多少?相关的知识,希望对你有一定的参考价值。
从定时器例程中彻底把我搞模糊了,以我的理解Fcco = 2*M*FIN/N = 2*100*12/6 = 400MHz; Fcclk (CPU时钟)= Fcco/4 = 100 MHz; pclk = Fcclk /4 = 25MHz;这样对不对啊?定时器的预分频和匹配寄存器值怎样配置能定时1ms?
参考技术A 给你看一篇文档你就懂了。LPC1768 定时器初值计算
1) LPC_TIM0->MR0 = TimerInterval;这条语句指定了定时器装载的匹配值,timer0计数到这个值时就会产生中断,并且在中断函数里把timer0_counter加1.
2)LPC_TIM1->PR = 0x00; /* set prescaler to zero */ 这条语句表明timer0预分频值设为0,就是说timer0对外设时钟不分频,每个外设时钟信号到来,都会使timer0的计数值加1.
3)#define TIME_INTERVAL (9000000/100 - 1) 这条语句说明timer0的匹配值是89999.也就是经过90000个外设时钟信号后,timer0将产生一次中断。因此timer0中断一次,计时的时间是90000/PCLK。如果PCLK=25MHz的话,则计时时间为(9/2.5)毫秒。
4)路虎开发板的timer例程中,PLL0输出的频率是400MHz,经4分频后,CPU的工作频率CCLK是100MHz。外设的频率是CCLK的4 分频,也即25MHz。timer0计数的时钟PCLK就是25MHz。例程中50 * counter得到的延时是180ms。
5)Keil 'MCB1700' evaluation board的timer例程中,PLL0输出的频率是288MHz,4分频后CPU频率是72MHz,再经4分频后外设时钟是18MHz,若装载 TIME_INTERVAL (9000000/100 - 1),每个时钟中断得到的延时是9/1.8=5毫秒。但实际例程中没有装载此值,而是根据外设时钟分频值(4分频)设定了时钟计数的预分频值,set prescaler to get 1M counts/sec,即每计数1000000可得到1秒延时,然后装载了匹配值TIME_INTERVALmS * 10=10000,得到了10ms的延时。
LPC2138微控制器之定时器看门狗VIC实例
本实例使用LPC2138微控制器,Keil+Proteus模拟实现。
本实例使用定时器计数,当计数值到达时触发定时器中断,在定时器中断程序中喂狗,涉及模块包括晶振、PLL、定时器、看门狗和VIC。
每次喂狗的同时,将P0.1 GPIO输出电平取反,外接一个LED灯作为Active信号灯。
直接贴代码:
main.c
int main(void) { int ret = 0; unsigned char reason = 0; unsigned char byte = 0; /* Fosc & CCLK is 60MHz */ /* FPCLK is 30MHz */ VPBDIV = 0x02; watch_dog_init(); timer0_init(); while(1); return 0; }
watchdog.c
#include <lpc213x.h> #include "watchdog.h" #define WDOG_INTREVAL_TIME 0x01FFFFFF void watch_dog_init(void) { /* Configure WDOG Timeout Interval */ WDTC = WDOG_INTREVAL_TIME; /* Enable WDOG, reset the CPU while WDOG timeout */ WDMOD = 0x3; } void watch_dog_feed() { /* reload WDOG by WDTC */ WDFEED = 0xAA; WDFEED = 0x55; }
timer.c
#include <lpc213x.h> #include "timer.h" #include "watchdog.h" void timer0_isr(void) __irq { if ((VICIRQStatus & 0x10) && (T0IR & 0x01)) { /* Clear MR0 Interrupt */ T0IR = 0x01; /* ACT LED Blink */ if (IOSET0 & 0x01) { IOCLR0 = 0x01; } else { IOSET0 = 0x01; } /* feed the WDOG */ watch_dog_feed(); } } void timer0_init(void) { /* ACT LED Initialization */ IODIR0 |= 0x1; IOSET0 |= 0x1; /* Timer0 Timer Mode */ T0CTCR = 0x00; /* Clear Timer0 Counter & Prescale Counter */ T0TC = 0x00; T0PC = 0x00; /* Interrupt & Reset on MR0 */ T0MCR = 0x03; T0MR0 = 0x5FF; T0PR = 0x5FF; /* Enable Timer0 */ T0TCR = 0x01; /* Timer0 VIC */ VICIntSelect = 0x00; VICVectCntl0 = 0x20 | 4; VICVectAddr0 = (unsigned int)timer0_isr; /* Enable Timer0 VIC */ VICIntEnable |= 0x10; }
以上是关于lpc1768这样配置定时器pclk是多少?的主要内容,如果未能解决你的问题,请参考以下文章