//LPC2214.利用cap0.0的捕获中断方式获取PWM的正脉冲长度,通过串口发送<br />#include "config.h"<br /><br />uint32 DUTY=0x12345678;<br />uint8 flag=0;<br /><br />void DelayNS(uint32 dly)<br />{ uint32 i;<br /> for(; dly>0; dly--) <br /> for(i=0; i<5000; i++);<br />}<br /><br />//串口初始化<br /># define UART0_BR 115200<br />void UART0_Init(void)<br />{ uint16 Div;<br /> U0LCR = 0X83;<br /> Div = (Fpclk >> 4) / UART0_BR;<br /> U0DLL = Div; //Fdiv % 256;<br /> U0DLM = Div>>8; //Fdiv / 256;<br /> U0LCR = 0x03;<br />}<br /><br />//定时器0初始化<br />void Timer0_Init(void)<br />{<br /> T0PR = 0; //定时器0的时钟不分频<br /> T0CCR = 0x005; //设置CAP1~4上升沿捕获并产生中断<br /> T0TC = 0; //定时器0设置为0<br /> T0TCR = 1;<br />}<br /><br />//中断函数,测量DUTY<br />void __irq Timer0_IRQ(void)<br />{<br /> uint32 time_0,time_1;<br /> if(flag==0)<br /> {<br /> time_0=T0CR0; //记录CAP0.0上升沿捕获的时间<br /> flag=1; //置标志位<br /> T0CCR=0x006; //设置CAP0.0下降沿捕获并产生中断 <br /> }<br /> <br /> else<br /> { <br /> time_1=T0CR0; //记录CAP0.0下降沿捕获的时间<br /> flag=0; //置标志位<br /> //获取DUTY值<br /> if((time_1-time_0)<30000)<br /> { DUTY = (time_1-time_0);<br /> }<br /> T0CCR=0x005; //设置CAP0.0上升沿捕获并产生中断 <br /> }<br /> T0IR = 0x10; //一定要清除中断标志位!<br /> VICVectAddr = 0; //一定要有中断函数返回语句 <br /> }<br /><br />//串口发送函数<br />void SendBuf(uint8 *pdata)<br />{ uint8 i;<br /> for (i=0; i<4; i++)<br /> { U0THR = *(pdata++);<br /> while((U0LSR & 0x20) == 0); //判断THRE位是否为1?<br /> }<br />}<br /><br />//向量中断初始化<br />void VICVECT_Init(void)<br />{ VICIntSelect = 0x00000000;<br /> VICVectCntl0 = 0X20 | 4; //使能cap0中断<br /> VICVectAddr0 = (uint32) Timer0_IRQ;<br /> VICIntEnable = 1<<4;<br />}<br /><br />int main()<br />{ uint8 data[4];<br /> PINSEL0 = 0X00000025; //设置p0.0,p0.1连接到UART0,p0.2连接到cap0.0<br /> <br /> UART0_Init();<br /> Timer0_Init();<br /> VICVECT_Init();<br /> <br /> while(1)<br /> { DelayNS(10);<br /> data[0] = DUTY >> 24;<br /> data[1] = DUTY >> 16;<br /> data[2] = DUTY >> 8;<br /> data[3] = DUTY;<br /> SendBuf( data );<br /> }<br /> return(0);<br />}<br /> |
|