用lpc2114的p0.10的捕获功能,检测输入信号的频率是否在正常的范围内,通过UART0输出结果(1为正确,0为错),可是通过串口助手接到的数据是乱码,大侠门看下程序,指点下,万分感谢!<br />extern long ztimeval; /* LPC21xx definitions */ <br />extern long timeval; // count up in 1mSec<br />extern long tSec ; // count up in 1 sec <br />void initCPU_IO(void); <br />int main (void)<br />{<br /> <br />////////////////// System Initialize <br /> initCPU_IO();//此函數內有"init_timer()"這個函數 <br />///////////////// The Main Loop <br />while (1){ /* Loop forever */ <br /><br /> }<br /><br />} <br />************************************************************<br /><br />#include <string.h><br />#include <LPC21XX.H> // LPC21XX Peripheral Registers<br />#include "Timer.h"<br />// Timer0 count<br />#define CNT_T0MR0_D 58622 // 1mSec = 58622 counts <br /><br />long tSec ; //sec <br />long ztSec;<br />long timeval; // count up in 1mSec<br />long ztimeval;<br />long ztxtimeval; <br />int A; <br />int E; <br /> <br />void tc0(void) __irq //_irq--> 例外管理程序<br />{ <br />/// 0. Processing Timer, generate tSec timer value <br />T0IR = 1; // Clear interrupt flag, Clear interrupt flag on MR0-->Match Channel 0;MR0可開始接受中斷(避免中斷失效);T0IR由0x00000001-->0x00000000<br />VICVectAddr = 0; // Acknowledge Interrupt<br />++timeval;<br /> if ( (timeval - ztimeval) >= 1000 ) <br /> { // reach 1 Sec<br /> ++tSec; <br /> ztimeval=timeval;<br /> E=20*A;<br /> if (E<1)<br /> {<br /> /<br /> U0THR=0;<br /> }<br /> else<br /> {<br /> if ((E<=3579620)&&(E>=3579460))<br /> {<br /> <br /> U0THR=1;<br /> }<br /> else<br /> {<br /> if ((E<=4433720)&&(E>=4433520))<br /> {<br /> <br /> U0THR=1;<br /> } <br /> else<br /> { <br /> //lcd_dec7(E);<br /> //lcd_goto(2,15); <br /> //lcd_puts("NG");<br /> U0THR=1;<br /> }<br /> }<br /> }<br /> } <br />}<br /> <br /><br />void t1cap0 (void) __irq <br />{<br /><br /> if(T1IR&0x10) <br /> {<br /> T1IR = 0x10;<br /> VICVectAddr=0;<br /> T1MR0=59029500; <br /> A++; <br /> } <br />}<br /><br />/* Setup the Timer Counter 0,1 Interrupt */<br />void init_timer (void) {<br /> T0MR0 = CNT_T0MR0_D; // 1ms , T0MR0 = 58621<br /> T0MCR = 3; // Interrupt and Reset on MR0(即T0TC=T0MR0時,T0TC會中斷並Reset為0)<br /> VICVectAddr0 = (unsigned long) tc0; // <br /> VICVectCntl0 = 0x20 |4 ; // use it for Timer 0 Interrupt ,"VICVectCntl0 = 0x20"-->將向量IRQ Slot0 Enable,決定向量中斷(IRQ Slot)優先權為Slot0<br /> T0TCR = 1; // Timer0 Enable<br /> VICIntEnable = 0x00000010; // Enable Timer0(MR0~3及CR0~3) Interrupt,VIC bit 4=1(VICIntEnable = 0x00000010=00000000000000000000000000010000),設定中斷源為Timer0<br /><br /> PINSEL0 |= (2<<20); //p0.10 as CAP1.0 <br /> T1CCR = 5; // Capture and Interrupt CAP1.0, rising and <br /> T1MCR = 3;<br /> //Interrupt on MR0(令T1TC=T1MR0時,產生中斷) but no reset TCR <br /> VICVectAddr1 = (unsigned long)t1cap0; // set interrupt vector in 1<br /> VICVectCntl1 = 0x20 | 5; <br /><br /> // use it for Timer 1 Interrupt,決定向量中斷(IRQ Slot)優先權為Slot1<br /> T1TCR = 1; <br /> T1IR=0x01; // Timer1 Enable<br /> VICIntEnable = 0x20; // Enable Timer1(MR0~3及CR0~3) Interrupt,此行 VICVectAddr1的內容正好複製到VICVectAddr(VICVectAddr1的內容=VICVectAddr的內容),表示開始執行向量IRQ中斷;剛開機時回先從這行執行中斷,因T1MR0=0=T1TC,而T0TC須等T0TC=58621時,T0TC才會中斷(此時才會令VICVectAddr0的內容=VICVectAddr的內容)<br /><br /> timeval=ztimeval=ztxtimeval=0; <br /> tSec=ztSec=0xf0; <br /><br /> tcapNew=0; <br />}<br /> <br />void initCPU_IO(void)<br />{<br /><br /> VPBDIV = 1; /* set IO clock, VPB clock=58.8924Mhz same as CCLK */ //VPBDIV=1,pclk=cclk,因PLLCFG=0x27,所以P=2,M=8,故cclk=M*石英振盪=8*7.3728=58.8924MHz=processor的clock頻率 <br /> PINSEL0 |= 0x00050005 ; /* Enable RxD0,1 & TxD0,1 */<br /> /* initialize the serial interface */<br /> U0LCR = 0x83; /* 8 bits, no Parity, 1 Stop bit */<br /> U0DLL = 32; /* 115200 Baud Rate */<br /> U0DLM = 0; <br /> U0LCR = 0x03; /* DLAB = 0 */<br /> U0FCR = 0x01; /* Enable FIFO */<br /> init_timer(); <br /><br />}<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /> |
|