📄 target.cpp
字号:
Set_US2_TX();
// SET_US2_TX;
else
Clr_US2_TX();
// CLR_US2_TX;
US2t_byte>>=1;
US2t_count=3;
US2t_stat++;
}
}else // 停止位有效时间
if(--US2t_count==0)
US2t_stat=0;
}
}
void US2_init(U32 baudrate) // baudrate<=9600
{
US2_tmp=US2_div=9600/baudrate;
US2r_w=US2t_w=1;
US2r_r=US2t_r=US2r_stat=US2t_stat=0;
US2_enable=1;
}
void US2_control(U32 stat)
{
US2_enable=stat;
}
int US2_getchar(void) // 从UART输入缓冲区读数据,空则返回-1
{
U32 tmp;
tmp=US2r_r+1;
if(tmp>=US2RBUF_LEN)
tmp=0;
if(tmp!=US2r_w){
US2r_r=tmp;
return (US2_rbuf[tmp]&0xFF);
}else
return -1;
}
void US2_putchar(const U8 ch) // 向UART输出缓冲区写数据,若满则等待
{
while(US2t_r==US2t_w); // 发送缓冲区满则等待
US2_tbuf[US2t_w++]=ch;
if(US2t_w>=US2TBUF_LEN) // 缓冲区回绕
US2t_w=0;
}
/*=====================================**
**
**
**=====================================*/
REG8 US3_rbuf[US3RBUF_LEN], US3_tbuf[US3TBUF_LEN];
REG32 US3r_r, US3r_w, US3t_r, US3t_w;
REG32 US3r_stat, US3r_byte, US3r_count, US3t_stat, US3t_byte, US3t_count, US3_div, US3_tmp, US3_enable;
/*
extern void Set_US2_TX(void);
extern void Clr_US2_TX(void);
extern U32 Tst_US2_RX(void);*/
#define Set_US3_TX() (IOSET = TXD3)
#define Clr_US3_TX() (IOCLR = TXD3)
#define Tst_US3_RX() (IOPIN0&RXD3)
void US3_interrupt(void) // UART2软件串口中断处理程序(17.361us)
{
U32 tmp;
if(US3_enable&&(--US3_tmp==0)){
US3_tmp=US3_div;
if(US3r_stat==0){ // US2输入处理,空闲状态
if(Tst_US3_RX()==0){ // 输入低电平
US3r_count=4; // 第一次延时1.3T
US3r_stat=1;
US3r_byte=0;
}
}else if(US3r_stat<9){ // 8位数据位
if(--US3r_count==0){
US3r_byte>>=1;
if(Tst_US3_RX())
US3r_byte|=0x100;
US3r_count=3; // 以后每次延时1T
US3r_stat++;
}
}else if(US3r_stat==9){ // 1位停止位
if(--US3r_count==0){
if(Tst_US3_RX()){ // 停止位有效
US3r_stat=0; // 重新允许接收
if(US3r_r!=US3r_w){ // 缓冲区未满
US3_rbuf[US3r_w]=(US3r_byte>>1);
//if(UART2RxdCount<UART2_MAX_LENGTH) UART2_RxdBuf[UART2RxdCount++]=US2_rbuf[US2r_w];
UART3RxdCount++;
US3r_w++;
if(US3r_w>=US3RBUF_LEN) // 缓冲区回绕
US3r_w=0;
}
}else
US3r_stat=10;
}
}else
// if(TST_US2_RX) // 若停止位无效则必须等待高电平才能开始下一个字节的接收
if(Tst_US3_RX()) // 若停止位无效则必须等待高电平才能开始下一个字节的接收
US3r_stat=0;
if(US3t_stat==0){ // US2输出处理,空闲状态
tmp=US3t_r+1;
if(tmp>=US3TBUF_LEN)
tmp=0;
if(tmp!=US3t_w){
US3t_r=tmp;
US3t_byte=(US3_tbuf[tmp]|0x100); // 停止位为1
US3t_stat=1;
US3t_count=3;
Clr_US3_TX();
// CLR_US2_TX; // 开始位为0
}
}else if(US3t_stat<10){ // 加上停止位共9位数据
if(--US3t_count==0){
if(US3t_byte&1)
Set_US3_TX();
// SET_US2_TX;
else
Clr_US3_TX();
// CLR_US2_TX;
US3t_byte>>=1;
US3t_count=3;
US3t_stat++;
}
}else // 停止位有效时间
if(--US3t_count==0)
US3t_stat=0;
}
}
void US3_init(U32 baudrate) // baudrate<=9600
{
US3_tmp=US3_div=9600/baudrate;
US3r_w=US3t_w=1;
US3r_r=US3t_r=US3r_stat=US3t_stat=0;
US3_enable=1;
}
void US3_control(U32 stat)
{
US3_enable=stat;
}
int US3_getchar(void) // 从UART输入缓冲区读数据,空则返回-1
{
U32 tmp;
tmp=US3r_r+1;
if(tmp>=US3RBUF_LEN)
tmp=0;
if(tmp!=US3r_w){
US3r_r=tmp;
return (US3_rbuf[tmp]&0xFF);
}else
return -1;
}
void US3_putchar(const U8 ch) // 向UART输出缓冲区写数据,若满则等待
{
while(US3t_r==US3t_w); // 发送缓冲区满则等待
US3_tbuf[US3t_w++]=ch;
if(US3t_w>=US3TBUF_LEN) // 缓冲区回绕
US3t_w=0;
}
unsigned int FFPortGetRxBufDataLen(U8 ucWitchUart)
{
if(ucWitchUart ==1)
return UART0RxdCount;
else if(ucWitchUart == 2)
return UART1RxdCount;
else if(ucWitchUart == 3)
return UART2RxdCount;
if(ucWitchUart == 4)
return UART3RxdCount;
else
return 0;
}
void FFPortReadData(U8 ucWitchUART,U8* pByte,int nLen)
{
int i;
i = 0;
if(ucWitchUART == 1){
for(i=0;i<nLen;i++) pByte[i]=(U8)US0_getchar();
//pByte[i]=UART0_RxdBuf[i];
}else if(ucWitchUART == 2){
for(i=0;i<nLen;i++) pByte[i]=(U8)US1_getchar();
//pByte[i]=UART1_RxdBuf[i];
}else if(ucWitchUART == 3){
//while(nLen--){ *(pByte+i)=(U8)UART2_RxdBuf[i]; i++;}
for(i=0;i<nLen;i++) pByte[i]=(U8)US2_getchar();
}else if(ucWitchUART == 4){
//while(nLen--){ *(pByte+i)=(U8)UART2_RxdBuf[i]; i++;}
for(i=0;i<nLen;i++) pByte[i]=(U8)US3_getchar();
}
}
void FFPortClearRxBuf(U8 ucWitchUART)
{
unsigned int nTemp,i;
if(ucWitchUART == 1)
{
for(nTemp=0;nTemp<16;nTemp++) i = U0RBR;
//for(nTemp=0;nTemp<UART0_MAX_LENGTH;nTemp++) UART0_RxdBuf[nTemp]=0;
while(US0_getchar() != -1);
UART0RxdCount = 0;
}else if(ucWitchUART == 2){
for(nTemp=0;nTemp<16;nTemp++) i = U1RBR;
//for(nTemp=0;nTemp<UART1_MAX_LENGTH;nTemp++) UART1_RxdBuf[nTemp]=0;
while(US1_getchar() != -1);
UART1RxdCount = 0;
}else if(ucWitchUART == 3) {
while(US2_getchar() != -1);
UART2RxdCount = 0;
}else if(ucWitchUART == 4) {
while(US3_getchar() != -1);
UART3RxdCount = 0;
}
}
void SendBlock(unsigned char ucWitchUART, unsigned char const *pByte,unsigned char nLen)
{
U8 i;
switch(ucWitchUART )
{
case 1: //LPC21F_UART_SendBlock(LPC21_UART0_BASE,pByte,nLen);
for(i=0;i<nLen;i++)
US0_putchar(pByte[i]);
break;
case 2: //LPC21F_UART_SendBlock(LPC21_UART0_BASE,pByte,nLen);
for(i=0;i<nLen;i++)
US1_putchar(pByte[i]);
break;
case 3: //LPC21F_UART_SendBlock(LPC21_UART1_BASE,pByte,nLen);
for(i=0;i<nLen;i++)
US2_putchar(pByte[i]);
break;
case 4:
for(i=0;i<nLen;i++)
US3_putchar(pByte[i]);
default:break;
}
}
void TargetResetInit(void)
{
MEMMAP = 1; // User RAM mode, Interrupt in SRAM, 1 = FLASH mode
#if PLL_TIMES == 1
PLLCON = 0;
VPBDIV = 1; // pclk = 1/4 cclk
// 设置存储器加速模块
MAMCR = 0;
MAMTIM = 1; // 主频 < 20M
MAMCR = 0;
#endif
#if PLL_TIMES == 4
PLLCON = 1;
VPBDIV = 0; // pclk = 1/4 cclk
PLLCFG = 3 | (3<<5); // 11.0592 * 4
PLLFEED = 0xaa;
PLLFEED = 0x55;
while((PLLSTAT & (1 << 10)) == 0);
PLLCON = 3;
PLLFEED = 0xaa;
PLLFEED = 0x55;
// 设置存储器加速模块
MAMCR = 0;
MAMTIM = 3; // 主频超过40M
MAMCR = 2;
#endif
// 初始化VIC
VICIntEnClr = 0xffffffff;
VICVectAddr = 0;
VICIntSelect = 0;
}
void CfgUART0(U32 nBaudrate)
{
U32 mode;
mode = UART_CHRL_8_BIT;
LPC21F_VIC_DisableIt(VIC_SELECT_UART0);
if(g_ucProtocol == PROTOCOL_FOFEN_MULTI){
mode |= UART_STOP_2_BIT;
}
LPC21F_UART_SetBaudRate(LPC21_UART0_BASE,nBaudrate,mode);
U0FCR = 0x07; //允许FIFO,一个字节触发
U0IER = 0x03; //使能接收中断
VICVectCntl1 = 0x26; // 串口UART0中断通道分配最高优先级(向量控制器0)
VICVectAddr1 = (U32)US0_interrupt; // 设置中断服务程序地址向量
LPC21F_VIC_EnableIt(VIC_SELECT_UART0);
}
void InitVariable(void)
{
SysTime = 0;
StartTime = 0;
UART0RxdCount = 0;
UART1RxdCount = 0;
UART2RxdCount = 0;
Timer_count = 0;
bPumpCtrl = 0;
US1r_w=US1t_w=1;
US1r_r=US1t_r=0;
US0r_w=US0t_w=1;
US0r_r=US0t_r=0;
key_Stat = 0;
key_Continue= 0;
key_Current = 0;
key_Last = 0;
key_Value = 0;
}
void TargetInit(void)
{
// unsigned int nBaudRate=9600;
//--- 0.初始化 IO 口。
TargetResetInit();
PINSEL0 = 0;
PINSEL1 = 0;
PINSEL1 = ((1<<22)|(1<<24)|(1<<26)|(1<<28)|(1<<18));
//IODIR0 = LEDCON; // 设置LED4控制口为输出
// ReadBaudAndAddress(&nBaudRate,&g_ucMachineAddr);//从拨码开关读取相关内容
//g_ucMachineAddr = 1; //不要拨码开关
//--- 1.配置定时器0,并设置定时器 0 为 FIQ中断 ---//
/* VICIntSelect = 0; // 设置定时器0中断FIQ,其它中断通道设置为IRQ中断
VICVectCntl0 = 0x24; // TIMER0中断通道分配第二高优先级(向量控制器1)
VICVectAddr0 = (uint32)Timer0_Handler; // 设置中断服务程序地址向量
*/
T0CTCR = 0;
T0PR = 0;
T0MR0 = 192*2;
T0MCR = 3;
T0TCR = 3;
T0TCR = 1;
VICIntEnable = VIC_SELECT_T0; // 允许TIMER0中断
VICIntSelect = 0x10; // 设置定时器0中断FIQ,其它中断通道设置为IRQ中断
T1CTCR = 0;
T1PR = 0;
T1MR0 = 192*58;
T1MCR = 3;
T1TCR = 3;
T1TCR = 1;
VICVectCntl0=0x25;
VICVectAddr0=(U32)timer1_interrupt;
/* LPC21F_TIMER_CfgMatch(LPC21_T0_BASE,0,
TIMER_RESET_WHEN_MATCH | TIMER_INT_WHEN_MATCH,
1,11059);
LPC21F_TIMER_ResetStart(LPC21_T0_BASE,TIMER_COUNT_START | TIMER_COUNT_RESET);
*/
//--- 2.初始化串口,UART0,UART1,UART2 ---//
//LPC21F_Cfg_PIOForUART(0);//IO口的第二功能设置为串口
//LPC21F_Cfg_PIOForUART(1);// // 设置P0.5连接到AIN0.7,P0.15连接到AIN1.5
PINSEL0 = PIN0_1_USED_UART0_OR|PIN8_9_USED_UART1_OR;
//PINSEL1 = 0;
//PINSEL2 = 0;
LPC21F_UART_SetBaudRate(LPC21_UART1_BASE, //操作对象是UART0,
19200, //波特率nBaudRate
UART_CHRL_8_BIT); //帧模式:1+8+1
//LPC21F_UART_SetBaudRate(LPC21_UART0_BASE,19200,UART_CHRL_8_BIT);//UART_STOP_2_BIT|UART_PARE_SPACE);
US2_init(2400);
US2_control(1);
US3_init(2400);
US3_control(1);
IODIR0=0;
IODIR0|=(1<<10);
IODIR0|=(1<<12);
IODIR0|=(1<<14);
IODIR0|=(1<<15);
IODIR0|=(1<<17);
IODIR0|=(1<<18);
IODIR0|=(1<<2);
//
//IODIR0|=(1<<4)|(1<<19)|(1<<20)|(1<<21)|(1<<22)|(1<<23)|(1<<26)|(1<<31);
//U1LCR |= 0x04;
//U1LCR &= 0xF7;
//--- 3.串口UART0中断设置,禁止FIFO ,设置中断通道---//
//U0FCR = 0x07; //允许FIFO,一个字节触发
//U0IER = 0x01; //使能接收中断
//VICVectCntl1 = 0x26; // 串口UART0中断通道分配最高优先级(向量控制器0)
//VICVectAddr1 = (U32)IRQ_UART0_RecServ; // 设置中断服务程序地址向量
//--- 4.串口UART1中断设置,禁止FIFO ,设置中断通道---//
U1FCR = 0x07; //允许FIFO,一个字节触发x07
U1IER = 0x03; //使能接收中断
VICVectCntl2 = 0x27; // 串口UART1中断通道分配第二高优先级(向量控制器1)
VICVectAddr2 = (U32)US1_interrupt; // 设置中断服务程序地址向量
//--- 5.清除缓冲区,复位缓冲区指针。 ---//
InitVariable();
CfgUART0(9600);
//ClearUART0Buf();
//ClearUART1Buf();
//--- 6.初始化AD寄存器---//
AD0CR = //(1 << 7) | // SEL = 0b1000 0000 ,选择通道7
((Fpclk / 1000000 - 1) << 8)| // CLKDIV = Fpclk / 1000000 - 1 ,即转换时钟为1MHz
(0 << 16) | // BURST = 0 ,软件控制转换操作
(0 << 17) | // CLKS = 0 ,使用11clock转换
(1 << 21) | // PDN = 1 , 正常工作模式(非掉电转换模式)
(0 << 22) | // TEST1:0 = 00 ,正常工作模式(非测试模式)
//(1 << 24) | // START = 1 ,直接启动ADC转换
(0 << 27); // EDGE = 0 (CAP/MAT引脚下降沿触发ADC转换)
/*AD1CR = (1 << 5) | // SEL = 0b1000 0000 ,选择通道7
((Fpclk / 1000000 - 1) << 8)| // CLKDIV = Fpclk / 1000000 - 1 ,即转换时钟为1MHz
(0 << 16) | // BURST = 0 ,软件控制转换操作
(0 << 17) | // CLKS = 0 ,使用11clock转换
(1 << 21) | // PDN = 1 , 正常工作模式(非掉电转换模式)
(0 << 22) | // TEST1:0 = 00 ,正常工作模式(非测试模式)
(1 << 24) | // START = 1 ,直接启动ADC转换
(0 << 27);*/ // EDGE = 0 (CAP/MAT引脚下降沿触发ADC转换)
//--- 7.使能三个中断 ---//
LPC21F_VIC_EnableIt(VIC_SELECT_UART1|VIC_SELECT_UART0|VIC_SELECT_T0|VIC_SELECT_T1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -