📄 target0919.cpp
字号:
#define IN_TARGET
#include "config.h"
#define PLL_TIMES 1
volatile unsigned int SysTime;
unsigned int StartTime;
U8 Data373_2;
volatile unsigned int UART0RxdCount;
volatile unsigned int UART1RxdCount;
volatile unsigned char UART0_RxdBuf[UART0_MAX_LENGTH];
volatile unsigned char UART1_RxdBuf[UART1_MAX_LENGTH];
volatile unsigned char g_ucRecFlag;
U8 TimeBuf[8];
//extern unsigned char g_ucMachineAddr;
#define CPU_Idle();
void InitVariable(void)
{
SysTime = 0;
StartTime = 0;
UART0RxdCount = 0;
UART1RxdCount = 0;
g_ucRecFlag = 0;
}
void MemSet(unsigned char* Buf,unsigned char ucData,unsigned int nLen)
{
unsigned int ni;
for(ni=0;ni<nLen;ni++)
Buf[ni]=ucData;
}
void memcpy(unsigned char* destBuf,unsigned char* srcBuf,unsigned int nLen)
{
unsigned int ni;
for(ni=0;ni<nLen;ni++)
destBuf[ni]=srcBuf[ni];
}
void SendBlock(unsigned char ucWitchUART, unsigned char const *pByte,unsigned char nLen)
{
if(ucWitchUART == 2)
LPC21F_UART_SendBlock(LPC21_UART1_BASE,pByte,nLen);
else if(ucWitchUART == 1)
LPC21F_UART_SendBlock(LPC21_UART0_BASE,pByte,nLen);
}
/*********************************************************************************************************
** 函数名称: IRQ_UART0_RecServ(void) 与上位机通讯
** 功能描述: UART0中断处理程序,将收到数据放到全局缓冲区,缓冲区指针加1,
** 先清零g_ucRecFlag,前台程序空闲就查询g_ucRecFlag。为 1 时,延时100ms,
** 再清零g_ucRecFlag 和缓冲区指针,就可以进行 PCCmd 处理。
********************************************************************************************************/
void __irq IRQ_UART0_RecServ(void)
{
unsigned int stat,tmp;
stat = (U0IIR & 0x0e)>>1;
if(0x02 == stat){
tmp = U0RBR;
g_ucRecFlag=1;
if(UART0RxdCount < UART0_MAX_LENGTH)
{
UART0_RxdBuf[UART0RxdCount++] = tmp;
}
}
VICVectAddr = 0; // 通知VIC中断处理结束
}
unsigned int IsUART0RecData(void)
{
return (unsigned int)g_ucRecFlag;
}
unsigned int GetUART0BufLen(void)
{
return UART0RxdCount;
}
void ClearUART0Buf(void)
{
unsigned int nTemp;
unsigned char i;
for(nTemp=0;nTemp<16;nTemp++)
i=U0RBR;
for(nTemp=0;nTemp<UART0_MAX_LENGTH;nTemp++)
UART0_RxdBuf[nTemp]=0;
UART0RxdCount = 0;
g_ucRecFlag=0;
}
void StoreHostData(unsigned char* pReadByte,unsigned int nBufLen)
{
unsigned int ni;
for(ni=0;ni<nBufLen;ni++)
pReadByte[ni]=UART0_RxdBuf[ni];
}
/*********************************************************************************************************
** 函数名称: IRQ_UART1_RecServ(void) 与仪器通讯
** 功能描述: UART1中断处理程序,将收到数据放到全局缓冲区,缓冲区指针加1,
** 总是主动的。知道大约什么时候有数据到达。 所以只在这段时间开中断,流程如下:
** 1. 发送命令给仪器,
** 2. 开 UART1 中断,根据不同的命令做不同的延时,
** 2. 关 UART1 中断,就可以进行 处理。
********************************************************************************************************/
void __irq IRQ_UART1_RecServ(void)
{
unsigned int stat,tmp;
stat = (U1IIR & 0x0e)>>1;
if(0x02 == stat){
tmp = U1RBR;
if(UART1RxdCount < UART1_MAX_LENGTH)
{
UART1_RxdBuf[UART1RxdCount++] = tmp;
}
}
VICVectAddr = 0; // 通知VIC中断处理结束
}
unsigned int GetUART1BufLen(void)
{
return UART1RxdCount;
}
void ClearUART1Buf(void)
{
unsigned int nTemp,i;
for(nTemp=0;nTemp<16;nTemp++)
i=U1RBR;
for(nTemp=0;nTemp<UART1_MAX_LENGTH;nTemp++)
UART1_RxdBuf[nTemp]=0;
UART1RxdCount = 0;
}
void StoreDevData(unsigned char* pReadData,unsigned char ReadBufLen)
{
unsigned char ucTemp;
for(ucTemp=0;ucTemp<ReadBufLen;ucTemp++)
pReadData[ucTemp]=UART1_RxdBuf[ucTemp];
}
void HappyLED(U8 stat)
{
if(stat)
Data373_2 &= ~0x10;
else
Data373_2 |= 0x10;
Write373_2(Data373_2);
}
U8 light;
void Timer0_Handler(void)
{
SysTime++;
if(SysTime%500 == 0){
if(light==0){
light = 1;
}else{
light = 0;
TimeBuf[0]++;
if(TimeBuf[0]>=60)
{//秒
TimeBuf[0]=0;
TimeBuf[1]++;
if(TimeBuf[1]>=60)
{//分
TimeBuf[1]=0;
TimeBuf[2]++;
}
}
}
}
HappyLED(light);
T0IR = 0x01; // 清除中断标志// 不需要通知VIC中断处理结束
VICVectAddr = 0; // 通知VIC中断处理结束
}
unsigned int GetSysTimeTick(void)//__inline
{
return SysTime;
}
void ResetClock(void)
{
StartTime = GetSysTimeTick();
}
unsigned int IsTimeOut(unsigned int nDelayTime)
{
if((SysTime - StartTime) >= nDelayTime) return 1;
else return 0;
}
void Sleep(unsigned int nDelayTime)
{//功能:以毫秒为单位,延时
unsigned int nStartTime,i;//,nElapsTime;
nStartTime = SysTime;// GetSysTimeTick();
// ResetClock();
for(;;)
{
if((SysTime-nStartTime) >= nDelayTime) break;
for(i=0;i<100;i++);
// if(IsTimeOut(nDelayTime)) break;
CPU_Idle();
}
}
unsigned int FFPortGetRxBufDataLen(U8 ucWitchUart)
{
if(ucWitchUart == 1)
return UART0RxdCount;
else if(ucWitchUart == 2)
return UART1RxdCount;
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]=UART0_RxdBuf[i];
}
else if(ucWitchUART == 2)
{
for(i=0;i<nLen;i++)
pByte[i]=UART1_RxdBuf[i];
}
}
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;
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;
UART1RxdCount = 0;
}
/*
if(ucWitchUART == 3)
{
while(US2_getchar() != -1);
UART2RxdCount = 0;
}
*/
}
void TargetResetInit(void)
{
MEMMAP = 1; // User RAM mode, Interrupt in SRAM, 1 = FLASH mode
#if PLL_TIMES == 1
PLLCON = 0;
VPBDIV = 1; // pclk = cclk
// 设置存储器加速模块
MAMCR = 0;
MAMTIM = 1; // 主频 < 20M
MAMCR = 2;
#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 TargetInit(void)
{
// unsigned int nBaudRate=9600;
//--- 0.初始化 IO 口。
TargetResetInit();
PINSEL0 = 0;
PINSEL1 = 0;
// ReadBaudAndAddress(&nBaudRate,&g_ucMachineAddr);//从拨码开关读取相关内容
//g_ucMachineAddr = 1; //不要拨码开关
//--- 1.配置定时器0,并设置定时器 0 为 FIQ中断 ---//
VICIntSelect = 0x10; // 设置定时器0中断FIQ,其它中断通道设置为IRQ中断
//VICVectCntl0 = 0x24; // TIMER0中断通道分配第二高优先级(向量控制器1)
//VICVectAddr0 = (uint32)Timer0_Handler; // 设置中断服务程序地址向量
T0IR = 0xFF;
T0CTCR = 0;
T0PC = T0PR = 0;
T0MR0 = 11059;
T0MCR = 3;
T0TCR = 3;
T0TCR = 1;
/* 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 ---//
//LPC21F_Cfg_PIOForUART(0);//IO口的第二功能设置为串口
//LPC21F_Cfg_PIOForUART(1);//
PINSEL0 = PIN0_1_USED_UART0_OR|PIN8_9_USED_UART1_OR;
PINSEL1 = 0;
PINSEL2 = 0;
LPC21F_UART_SetBaudRate(LPC21_UART0_BASE, //操作对象是UART0,
19200, //波特率nBaudRate
UART_CHRL_8_BIT); //帧模式:1+8+1
LPC21F_UART_SetBaudRate(LPC21_UART1_BASE,
19200, //FTY100为9600
UART_CHRL_8_BIT);//UART_STOP_2_BIT|UART_PARE_SPACE);
//U1LCR |= 0x04;
//U1LCR &= 0xF7;
//--- 3.串口UART0中断设置,禁止FIFO ,设置中断通道---//
U0FCR = 0x07; //允许FIFO,一个字节触发
U0IER = 0x01; //使能接收中断
VICVectCntl1 = 0x26; // 串口UART0中断通道分配最高优先级(向量控制器0)
VICVectAddr1 = (uint32)IRQ_UART0_RecServ; // 设置中断服务程序地址向量
//--- 4.串口UART1中断设置,禁止FIFO ,设置中断通道---//
U1FCR = 0x07; //允许FIFO,一个字节触发x07
U1IER = 0x01; //使能接收中断
VICVectCntl2 = 0x27; // 串口UART1中断通道分配第二高优先级(向量控制器1)
VICVectAddr2 = (uint32)IRQ_UART1_RecServ; // 设置中断服务程序地址向量
//--- 5.清除缓冲区,复位缓冲区指针。 ---//
InitVariable();
ClearUART0Buf();
ClearUART1Buf();
//--- 6.使能三个中断 ---// LPC21F_VIC_DisableIt
LPC21F_VIC_EnableIt(VIC_SELECT_UART1|VIC_SELECT_UART0|VIC_SELECT_T0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -