📄 target.cpp
字号:
#define IN_TARGET
#include "config.h"
extern U8 Data373_2;
extern U8 g_ucBaudRate;
extern U8 g_ucProtocol;
extern U16 U16_o2updata[20];
extern U16 U16_o2downdata[20];
volatile unsigned int SysTime;
REG32 Timer_count;
unsigned int StartTime;
volatile unsigned int UART0RxdCount;
volatile unsigned int UART1RxdCount;
volatile unsigned int UART2RxdCount;
volatile unsigned int UART3RxdCount;
//volatile unsigned char UART0_RxdBuf[UART0_MAX_LENGTH];
//volatile unsigned char UART1_RxdBuf[UART1_MAX_LENGTH];
//volatile unsigned char UART2_RxdBuf[UART2_MAX_LENGTH];
U8 TimeBuf[8];
U32 bPumpCtrl;
// variable for key
REG32 key_Current;
REG32 key_Last;
REG8 key_Stat;
REG8 key_Continue;
REG8 key_Value;
REG8 key_Reserved;
U32 Timer1_count=0;
U8 O2_Blage;
//U8 O2_Timer[64];
U16 O2_count;
//extern unsigned char g_ucMachineAddr;
#define CPU_Idle();
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];
}
/*********************************************************************************************************
** 函数名称: IRQ_UART0_RecServ(void) 与上位机通讯
** 功能描述: UART0中断处理程序,将收到数据放到全局缓冲区,缓冲区指针加1,
** 先清零g_ucRecFlag,前台程序空闲就查询g_ucRecFlag。为 1 时,延时100ms,
** 再清零g_ucRecFlag 和缓冲区指针,就可以进行 PCCmd 处理。
********************************************************************************************************/
REG32 US0r_r, US0r_w, US0t_r, US0t_w;
REG8 US0_rbuf[US0RBUF_LEN], US0_tbuf[US0TBUF_LEN];
__irq void US0_interrupt(void) // UART0中断处理程序
{
U8 stat,i;
U32 tmp;
while(!((stat=U0IIR)&0x01)){ // 有中断需要处理(最低位为0)
switch(stat&0x0e){
case 0x02: // TX FIFO空
for(i=0; i<8; i++){ // 每次最多发送8个字节
tmp=(US0t_r+1)&(US0TBUF_LEN-1); // 处理缓冲区回绕
if(tmp!=US0t_w){
US0t_r=tmp;
U0THR=US0_tbuf[tmp];
}else
break;
}
break;
case 0x04: // 输入数据有效
case 0x0c: // 输入超时
do{
tmp=U0RBR;
if(US0r_r!=US0r_w){ // 缓冲区未满
US0_rbuf[US0r_w++]=tmp;
US0r_w&=(US0RBUF_LEN-1);// 缓冲区回绕
UART0RxdCount++;
}
}while(U0LSR&0x01);
break;
case 0x06: // 接收线状态错误
tmp=U0LSR; // 不处理线错误状态
break;
}
}
VICVectAddr = 0; // 中断处理结束
}
int US0_getchar(void) // 从UART0输入缓冲区读数据,空则返回-1
{
U32 tmp;
tmp=(US0r_r+1)&(US0RBUF_LEN-1);
if(tmp!=US0r_w){
US0r_r=tmp;
return US0_rbuf[tmp];
}else
return -1;
}
void US0_putchar(U8 ch) // 向UART0输出缓冲区写数据,若满则等待
{
while(US0t_r==US0t_w); // 发送缓冲区满则等待
VICIntEnClr=VIC_SELECT_UART0; // 禁止UART0中断
US0_tbuf[US0t_w++]=ch;
US0t_w&=(US0TBUF_LEN-1); // 缓冲区回绕
if(U0LSR&0x40){ // 发送FIFO空
US0t_r=(US0t_r+1)&(US0TBUF_LEN-1); // 处理缓冲区回绕
U0THR=US0_tbuf[US0t_r]; // 直接发送
}
VICIntEnable|=VIC_SELECT_UART0; // 允许UART0中断
}
/*********************************************************************************************************
** 函数名称: IRQ_UART1_RecServ(void) 与仪器通讯
** 功能描述: UART1中断处理程序,将收到数据放到全局缓冲区,缓冲区指针加1,
** 总是主动的。知道大约什么时候有数据到达。 所以只在这段时间开中断,流程如下:
** 1. 发送命令给仪器,
** 2. 开 UART1 中断,根据不同的命令做不同的延时,
** 2. 关 UART1 中断,就可以进行 处理。
********************************************************************************************************/
REG32 US1r_r, US1r_w, US1t_r, US1t_w;
REG8 US1_rbuf[US1RBUF_LEN], US1_tbuf[US1TBUF_LEN];
__irq void US1_interrupt(void) // UART1中断处理程序
{
U8 stat,i;
U32 tmp;
while(!((stat=U1IIR)&0x01)){ // 有中断需要处理(最低位为0)
switch(stat&0x0e){
case 0x02: // TX FIFO空
for(i=0; i<8; i++){ // 每次最多发送8个字节
tmp=(US1t_r+1)&(US1TBUF_LEN-1); // 处理缓冲区回绕
if(tmp!=US1t_w){
US1t_r=tmp;
U1THR=US1_tbuf[tmp];
}else
break;
}
break;
case 0x04: // 输入数据有效
case 0x0c: // 输入超时
do{
tmp=U1RBR;
if(US1r_r!=US1r_w){ // 缓冲区未满
US1_rbuf[US1r_w++]=tmp;
US1r_w&=(US1RBUF_LEN-1);// 缓冲区回绕
UART1RxdCount++;
}
}while(U1LSR&0x01);
break;
case 0x06: // 接收线状态错误
tmp=U1LSR; // 不处理线错误状态
break;
}
}
VICVectAddr = 0; // 中断处理结束
}
int US1_getchar(void) // 从UART1输入缓冲区读数据,空则返回-1
{
U32 tmp;
tmp=(US1r_r+1)&(US1RBUF_LEN-1);
if(tmp!=US1r_w){
US1r_r=tmp;
return US1_rbuf[tmp];
}else
return -1;
}
void US1_putchar(U8 ch) // 向UART1输出缓冲区写数据,若满则等待
{
while(US1t_r==US1t_w); // 发送缓冲区满则等待
VICIntEnClr=VIC_SELECT_UART1; // 禁止UART1中断
US1_tbuf[US1t_w++]=ch;
US1t_w&=(US1TBUF_LEN-1); // 缓冲区回绕
if(U1LSR&0x40){ // 发送FIFO空
US1t_r=(US1t_r+1)&(US1TBUF_LEN-1); // 处理缓冲区回绕
U1THR=US1_tbuf[US1t_r]; // 直接发送
}
VICIntEnable|=VIC_SELECT_UART1; // 允许UART1中断
}
void HappyLED(void)
{
Data373_2 ^= 0x10;
Write373_2
(Data373_2);
}
extern U8 TimeBuf[8];
void Timer0_Handler(void)
{
if(++Timer_count==29)// 1ms(57.6)
{
Timer_count=0;
SysTime++;
if(SysTime%1000 == 0)
{
TimeBuf[0]++;
if(TimeBuf[0]>=60)
{//秒
TimeBuf[0]=0;
TimeBuf[1]++;
if(TimeBuf[1]>=60)
{//分
TimeBuf[1]=0;
TimeBuf[2]++;
if(TimeBuf[2]>23) TimeBuf[2]=0;
}
}
}
if(SysTime%10 == 0){
if(bPumpCtrl){
;//bPumpCtrl = 0;
// IOSET0 = PUMP_DRIVE_PIN;
}else{
;//bPumpCtrl = 1;
// IOCLR0 = PUMP_DRIVE_PIN;
}
}
}
T0IR = 0x01; // 清除中断标志// 不需要通知VIC中断处理结束
// VICVectAddr = 0; // 通知VIC中断处理结束
}
__irq void timer1_interrupt(void)
{
U8 i,j,k,l;
static U8 m;
static U8 n;
IODIR0|=1<<12;
if(O2_Blage==0)//
{
if(Timer1_count++>=60000)// 延时15秒
{
IOCLR0|=(1<<14);
IOCLR0|=(1<<15);
IOSET0|=(1<<17);
IOCLR0|=(1<<18);
O2_Blage=3;//预热结束标志
Timer1_count=0;
//Timer1_count=0;
//O2_count=0;
}
}
else
{
if(O2_Blage==3)
{
// if(Timer1_count++>=120)
//{
Timer1_count++;
if((IOPIN0&(1<<16))==0)
{
//US3_putchar(Timer1_count);
/*i=(U8)((Timer1_count%10)+'0');
j=(U8)((Timer1_count/10)%10+'0');
k=(U8)((Timer1_count/100)+'0');
l=' ';
US0_putchar(k);
US0_putchar(j);
US0_putchar(i);
US0_putchar(l);
US0_putchar(l);*/
if(m>19){m=0;}
U16_o2updata[m]=(U16)Timer1_count;
m++;
IOSET0|=(1<<14);
IOSET0|=(1<<15);
IOCLR0|=(1<<17);
IOSET0|=(1<<18);
O2_Blage=5;
Timer1_count=0;
}
//O2_Timer[O2_count]=Timer1_count;
//O2_count++;
//Timer1_count=0;
//}
}
//if(O2_Blage==5)
//if(Timer1_count++>=80)
//{
else if (O2_Blage==5)
{
Timer1_count++;
if((IOPIN0&(1<<16))!=0)
{
//if(O2_count<=63)
//{
/*i=(U8)((Timer1_count%10)+'0');
j=(U8)((Timer1_count/10)%10+'0');
k=(U8)((Timer1_count/100)+'0');
l=' ';
US0_putchar(k);
US0_putchar(j);
US0_putchar(i);
US0_putchar(l);
US0_putchar(l);*/
if(n>19){n=0;}
U16_o2downdata[n]=(U16)Timer1_count;
n++;
IOCLR0|=(1<<14);
IOCLR0|=(1<<15);
IOSET0|=(1<<17);
IOCLR0|=(1<<18);
O2_Blage=3;
Timer1_count=0;
}
}
//O2_Timer[O2_count]=Timer1_count;
//O2_count++;
// Timer1_count=0;
// }
// else
// {
// O2_Blage=0;
// O2_Blage|=1|(1<<3);
// }
//}
}
T1IR = 0x01;//中断返回//清除中断标志位
VICVectAddr = 0;
}
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;
nStartTime = SysTime;
for(;;)
{
if((SysTime-nStartTime) >= nDelayTime) break;
for(i=0;i<100;i++);
CPU_Idle();
}
}
/*=====================================**
**
**
**=====================================*/
REG8 US2_rbuf[US2RBUF_LEN], US2_tbuf[US2TBUF_LEN];
REG32 US2r_r, US2r_w, US2t_r, US2t_w;
REG32 US2r_stat, US2r_byte, US2r_count, US2t_stat, US2t_byte, US2t_count, US2_div, US2_tmp, US2_enable;
/*
extern void Set_US2_TX(void);
extern void Clr_US2_TX(void);
extern U32 Tst_US2_RX(void);*/
#define Set_US2_TX() (IOSET = TXD2)
#define Clr_US2_TX() (IOCLR = TXD2)
#define Tst_US2_RX() (IOPIN0&RXD2)
void US2_interrupt(void) // UART2软件串口中断处理程序(17.361us)
{
U32 tmp;
if(US2_enable&&(--US2_tmp==0)){
US2_tmp=US2_div;
if(US2r_stat==0){ // US2输入处理,空闲状态
if(Tst_US2_RX()==0){ // 输入低电平
US2r_count=4; // 第一次延时1.3T
US2r_stat=1;
US2r_byte=0;
}
}else if(US2r_stat<9){ // 8位数据位
if(--US2r_count==0){
US2r_byte>>=1;
if(Tst_US2_RX())
US2r_byte|=0x100;
US2r_count=3; // 以后每次延时1T
US2r_stat++;
}
}else if(US2r_stat==9){ // 1位停止位
if(--US2r_count==0){
if(Tst_US2_RX()){ // 停止位有效
US2r_stat=0; // 重新允许接收
if(US2r_r!=US2r_w){ // 缓冲区未满
US2_rbuf[US2r_w]=(US2r_byte>>1);
UART2RxdCount++;
//if(UART2RxdCount<UART2_MAX_LENGTH) UART2_RxdBuf[UART2RxdCount++]=US2_rbuf[US2r_w];
US2r_w++;
if(US2r_w>=US2RBUF_LEN) // 缓冲区回绕
US2r_w=0;
}
}else
US2r_stat=10;
}
}else
// if(TST_US2_RX) // 若停止位无效则必须等待高电平才能开始下一个字节的接收
if(Tst_US2_RX()) // 若停止位无效则必须等待高电平才能开始下一个字节的接收
US2r_stat=0;
if(US2t_stat==0){ // US2输出处理,空闲状态
tmp=US2t_r+1;
if(tmp>=US2TBUF_LEN)
tmp=0;
if(tmp!=US2t_w){
US2t_r=tmp;
US2t_byte=(US2_tbuf[tmp]|0x100); // 停止位为1
US2t_stat=1;
US2t_count=3;
Clr_US2_TX();
// CLR_US2_TX; // 开始位为0
}
}else if(US2t_stat<10){ // 加上停止位共9位数据
if(--US2t_count==0){
if(US2t_byte&1)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -