📄 lpc2131串口(tx+rx)+time0+adc采样的代码.txt
字号:
//LPC2131串口(TX+RX)+TIME0+ADC采样的代码!
#include "config.h"
#define TX0BUFF_LEN 4
#define RX0BUFF_LEN 8
//0x55 if first send
uint8 gTx0Buff[TX0BUFF_LEN]={0xaa,0x00,0x00,0x00};
uint8 gTx0Point=TX0BUFF_LEN;
uint8 gRx0Buff[RX0BUFF_LEN];
uint8 gRx0Point=0;
typedef union dbdw
{
uint8 db[2];
uint16 dw;
}DBDW;
void Config_Uart0( void )
{
int Fdiv;
//P0.0,P0.1 connect to Tx0 Rx0
PINSEL0 = (PINSEL0&(~0x0f))|0x05;
//enable baud rate set
U0LCR = 0x80;
//Set baud rate
Fdiv = ( Fpclk/16 ) / 19200;
U0DLM = Fdiv/256;
U0DLL = Fdiv%256;
//Set DataBit,Parity,StopBit...
U0LCR = 0x03; //8,n,1
U0IER = 0x01; //Rx,Interrupt enable, Tx Interrupt disable;
U0FCR = 0x07; //FIFO 1 byte
}
void Config_ADC0( void )
{
PINSEL1 = (PINSEL1&(~(0x03<<28)))|(0x01<<28);
ADCR = (1<<3) |
((Fpclk/100000-1)<<8) |
(0<<16) |
(0<<17) |
(1<<21) |
(0<<22) |
(1<<24) |
(0<<27) ;
}
uint8 Uart0_GetByte( void )
{
uint8 byte;
while((U0LSR&0x01)==0);
byte = U0RBR;
return byte;
}
void __irq IRQ_Timer0(void)
{
IRQDisable();
AD0CR = (AD0CR&0xf8ffffff)|(0x1<<24);
T0IR = 0x01;
VICVectAddr = 0x00;
IRQEnable();
}
void __irq IRQ_ADC0(void)
{
uint32 ADdata;
IRQDisable();
ADdata = AD0DR;
gTx0Buff[3]=gTx0Buff[1]=(uint8)(ADdata>>6);
gTx0Buff[2]=(uint8)(ADdata>>14);
gTx0Buff[3] += gTx0Buff[2];
U0THR = 0x55;
gTx0Point=0;
U0IER = 0x03;
VICVectAddr = 0x00;
IRQEnable();
}
void __irq IRQ_UART0(void)
{
uint8 byte;
IRQDisable();
while( ((byte=U0IIR)&0x01)==0 )
{
switch( byte&0x0e)
{
case 0x02: //Tx Interrupt
if( gTx0Point<TX0BUFF_LEN )
{
U0THR = gTx0Buff[gTx0Point];
gTx0Point ++;
}
else
{
U0IER = 0x01;
}
break;
case 0x04: //Rx Interrupt
gRx0Buff[gRx0Point] = U0RBR;
gRx0Point = (gRx0Point+1)%RX0BUFF_LEN;
break;
case 0x0c: //Rx timeout
byte = U0RBR;
break;
case 0x06:
byte = U0LSR;
break;
default:goto EXIT_UART_INT;
}
}
EXIT_UART_INT:
VICVectAddr = 0x00; //clear interrupt
IRQEnable();
}
int main (void)
{// add user source code
Config_Uart0();
Config_ADC0();
IRQEnable();
T0TC = 0;
T0PR = 0;
T0MCR =0x03;
T0MR0 =Fpclk/200;
T0TCR =0x01;
VICIntSelect = 0x00000000;
VICVectCntl0 = 0x20|4; //Timer0
VICVectCntl1 = 0x20|18; //ADC0
VICVectCntl2 = 0x20|6; //Uart0
VICVectAddr0 = (uint32)IRQ_Timer0;
VICVectAddr1 = (uint32)IRQ_ADC0;
VICVectAddr2 = (uint32)IRQ_UART0;
VICIntEnable = (1<<4)|(1<<18)|(1<<6);
while(1);
return 0;
}
200Hz的采样速度把AD0.3的电压数据通过串口发送出去。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -