您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 综合/其它 > 以LPC2136为例说定时器控制原理
以LPC2136为例说定时器控制原理上网时间:2010年08月24日每个mcu都有定时器功能,如果要实现在1秒,或者1毫秒,或1微妙等时间间隔的定时操作,则需要mcu提供的定时器功能。(在掌握了一种MCU的定时器原理,其他MCU的定时器操作就很好理解了),下面以philips的lpc2136(arm7)定时器0的匹配功能为例。1:首先要搞清楚几个寄存器的作用如果上面的关系搞清楚了,程序就很好写了!2:TCR,MCR两个寄存器的控制原理2.1关于TCRTCR[0]是使能位,为1时,同时使能“预分频计数器”和“定时器计数器”计数;为0时,同时禁止“预分频计数器”和“定时器计数器”计数;TCR[1]是控制“预分频计数器”和“定时器计数器”在PCLK的上升沿同步复位;2.2关于MCRLPC2114定时器0有四个匹配通道,我们这里只讲匹配通道0,即MR0.MCR[0]当该位为1,TC与MR0(匹配寄存器)匹配产生中断;当该位为0,TC与MR0(匹配寄存器)匹配中断禁止;MCR[1]当该位为1,TC与MR0(匹配寄存器)匹配将使TC复位;当该位为0,该特性被禁止;MCR[2]当该位为1,TC与MR0(匹配寄存器)匹配将使TC和PC停止计数;当该位为0,该特性被禁止。3接下来就可以等待中断了对于一个新手来说也许你还是不知如何着手写程序,所以这就是入门的难处,当你对某个MCU会控制了,或者说入门了,那么再去写程序控制其他的MCU就很容易的,因为原理在那里,可以举一反三。3.1中断状态寄存器其实,不管是那个MCU中的哪个控制器,如I2C,SPI,Ethernet,LCD等等,都有一个中断状态寄存器,有些控制器还有其他状态寄存器!Lpc2136中的定时器0就有T0IR(中断寄存器)来指示当前是哪个中断发生,用户就可以通过读这个寄存器来判断。如:我们这里设置了匹配通道0,即MR0。我们可以在主程序中不断的读T0IR[0]位,如果为1则说明中断发生。注意:在中断处理结束后必须通过对相应为写1才能复位中断,方便第二次中断发生。4如何写代码一般分查询方式(polling)和中断方式(interrupt):查询方式就是不停的去判断中断状态寄存器相关位是否置位,如果置位说明有中断发生。中断方式就是通过MCU的中断控制器irq实现。4.1查询方式相关代码:/*****************************************************************************文件名:main.c*功能:使用定时器实现秒定时,控制led灯闪烁。(查询方式)*****************************************************************************/#includeconfig.h#defineLED110//P0.0引脚控制LED1/*****************************************************************************名称:Time0Init()*功能:初始化定时器,定时时间为S。*入口参数:无*出口参数:无****************************************************************************/voidTime0Init(void){/*Fcclk=Fosc*4=11.0592MHz*4=44.2368MHzFpclk=Fcclk/4=44.2368MHz/4=11.0592MHz*/T0PR=99;//设置定时器分频为分频,得HzT0MCR=0x03;//匹配通道匹配中断并复位T0TCT0MR0=110592;//比较值(1S定时值)T0TCR=0x03;//启动并复位T0TCT0TCR=0x01;}/*****************************************************************************名称:main()*功能:初始化I/O及定时器,然后不断的查询定时器中断标志。当定时时间到达时,取反P0.22*控制口。****************************************************************************/intmain(void){PINSEL0=0x00000000;//设置管脚连接GPIOIO0DIR=LED1;//设置I/O为输出Time0Init();//初始化定时器while(1){while((T0IR&0x01)==0);//等待定时时间到T0IR=0x01;//清除中断标志if((IO0PIN&LED1)==0){IO0SET=LED1;}else{IO0CLR=LED1;}}return(0);}4.2中断方式上面的代码是通过查询方式来等待定时器中断的发生,本例是定时器实验性代码,实际产品开发或工作中不会采用这种方式。下面讲通过中断方式来等待定时器的发生。/*****************************************************************************文件名:main.c*功能:使用定时器实现秒定时,控制led灯闪烁。(查询方式)****************************************************************************/#includeconfig.h#defineLED110//P0.0引脚控制LED1/*****************************************************************************名称:IRQ_Time0()*功能:定时器中断服务程序,取反LED1控制口。*入口参数:无*出口参数:无****************************************************************************/void__irqIRQ_Time0(void){if((IO0PIN&LED1)==0){IO0SET=LED1;}else{IO0CLR=LED1;}T0IR=0x01;//清除中断标志VICVectAddr=0x00;//通知VIC中断处理结束}/*****************************************************************************名称:Time0Init()*功能:初始化定时器,定时时间为S,并使能中断。*入口参数:无*出口参数:无****************************************************************************/voidTime0Init(void){/*Fcclk=Fosc*4=11.0592MHz*4=44.2368MHzFpclk=Fcclk/4=44.2368MHz/4=11.0592MHz*/T0PR=99;//设置定时器分频为分频,得HzT0MCR=0x03;//匹配通道匹配中断并复位T0TCT0MR0=110592;//比较值(1S定时值)T0TCR=0x03;//启动并复位T0TCT0TCR=0x01;/*设置定时器中断IRQ*/VICIntSelect=0x00;//所有中断通道设置为IRQ中断VICVectCntl0=0x24;//定时器中断通道分配最高优先级(向量控制器)VICVectAddr0=(uint32)IRQ_Time0;//设置中断服务程序地址向量VICIntEnable=0x00000010;//使能定时器中断}/*****************************************************************************名称:main()*功能:初始化I/O及定时器,然后等待中断。*说明:在STARTUP.S文件中使能IRQ中断(清零CPSR中的I位)。****************************************************************************/intmain(void){PINSEL0=0x00000000;//设置管脚连接GPIOIO0DIR=LED1;//设置I/O为输出Time0Init();//初始化定时器及使能中断while(1);//等待定时器中断或定时器匹配输出return(0);}看了上面的代码就清楚了,中断方式就是把查询方式的这条语句while((T0IR&0x01)==0);用定时器中断来做。While语句下面的要做的事情在中断服务程序里面做。
本文标题:以LPC2136为例说定时器控制原理
链接地址:https://www.777doc.com/doc-7884593 .html