📄 initmcu.c
字号:
// INT1 interrupt
//------------------------------------------------------------------------------
void Int1Int(void)
{
// OS_EXIT_CRITICAL();
Disable_Int1();
InitTa3(24);
StartTa3();
Step_Recv = 0;
}
//------------------------------------------------------------------------------
// init int0
//------------------------------------------------------------------------------
void InitInt0(void)
{
ifsr0 = 0; //select one edge
int0ic = 0x2; //select interupt level 2,down edge
}
//------------------------------------------------------------------------------
// enable int0int
//------------------------------------------------------------------------------
void Enable_Int0(void)
{
ifsr0 = 0; //select one edge
int0ic = 0x2; //select interupt level 2,down edge
}
//------------------------------------------------------------------------------
// disable int0int
//------------------------------------------------------------------------------
void Disable_Int0(void)
{
int0ic = 0x0; //disable the int0 interupt
}
//------------------------------------------------------------------------------
// INT0 interrupt
//------------------------------------------------------------------------------
void Int0Int(void)
{
Start_Timer(Accept_Ring_Timer,1,HMSEL);
}
//------------------------------------------------------------------------------
// initialize watchdog
//------------------------------------------------------------------------------
void Init_Watchdog(void)
{
wdc |= 0x80;
wdts = 0x01;
}
//------------------------------------------------------------------------------
// clear watchdog
//------------------------------------------------------------------------------
void clr_watchdog(void)
{
static uchar status = 0;
static uchar watchdog_count=0;
CLR_DOG = status;
if(status ==0) status = 1;else status = 0;
//status = !status;
wdts = 0x01;
if (watchdog_count>0x00) Uart1hex(watchdog_count);
watchdog_count=0x00;
}
//------------------------------------------------------------------------------
// watchdog interrupt
//------------------------------------------------------------------------------
void WatchdogInt(void)
{
// OS_EXIT_CRITICAL();
watchdog_count +=1;
if (watchdog_count>=0x30)
{
prc1 = 1;
pm03 = 1;
prc1 = 0;
}
}
//------------------------------------------------------------------------------
// reset program
//------------------------------------------------------------------------------
void Reset_Program(void)
{
prc1 = 1;
pm03 = 1;
prc1 = 0;
}
//------------------------------------------------------------------------------
// initialize ad
//------------------------------------------------------------------------------
void InitADC(uchar channel,uchar wei)
{
Adc_Channel = channel;
adcon2 = 0x00;
adcon0 = 0x07&channel;
if(wei==10)
adcon1 = 0x28; // 10 bit ad
else
adcon1 = 0x20;
}
//------------------------------------------------------------------------------
// start ad
//------------------------------------------------------------------------------
void StartADC(void)
{
adcon0 |=0x40;
adic = 0x02;
Adc_Flag = AD_START;
}
//------------------------------------------------------------------------------
// adc interrupt
//------------------------------------------------------------------------------
void ADCint(void)
{
// OS_EXIT_CRITICAL();
if(Adc_Channel==0x01) //备用电源电压//
{
//Adc_Value = (uint)ad1l;
Adc_Value = ad1&0x3ff;
}
if(Adc_Channel==0x03) //低压//
{
Adc_Value = ad3&0x3ff;
}
adcon0 &=~0x40;
Adc_Flag = AD_COMPELETE;
}
//------------------------------------------------------------------------------
// initialize uart 0 for gps
//------------------------------------------------------------------------------
void InitUart0(void)
{
u0mr = 0x05; // XXXX XXXX
// |||| |||+- uart mode
// |||| ||+-- uart mode
// |||| |+--- uart mode
// |||| | 100: 7 bit data
// |||| | 101: 8 bit data
// |||| | 110: 9 bit data
// |||| +---- Internal/external clock select bit
// |||| 0: Internal clock
// |||| 1: External clock
// |||+------ Stop bit length select bit
// ||| 0: One stop bit
// ||| 1: Two stop bit
// ||+------- Odd/even parity select bit
// || Valid when bit 6 = 1
// || 0: Odd parity
// || 1: Even parity
// |+-------- Parity enable bit
// | 0: Parity disabled
// | 1: Parity enabled
// +--------- Sleep select bit
// 0: Sleep mode deselected
// 1: Sleep mode selected
// Setting UART0 transmit/receive control register 0 (UART mode)
u0c0 = 0x38; // 00XX XXXX
// |||| |||+- BRG count source select bit
// |||| ||+-- BRG count source select bit
// |||| || 00: f1 is selected
// |||| || 01: f8 is selected
// |||| || 10: f32 is selected
// |||| || 11: inhibited
// |||| |+--- /CTS//RTS function select bit
// |||| | (Valid when bit 4 ='0')
// |||| | 0: /CTS function is selected
// |||| | 1: /RTS function is selected
// |||| +---- Transmit register empty flag
// |||| 0: Data present in transmit register
// |||| (during transmission)
// |||| 1: No Data present in transmit register
// |||| (transmission completed)
// |||+------ /CTS//RTS disable bit
// ||| 0: /CTS//RTS function enabled
// ||| 1: /CTS//RTS function disabled
// ||+------- Data output select bit
// || 0: TxD0 pin is CMOS output
// || 1: TxD0 pin is N-channel open-drain
// || output
// |+-------- Must be fixed to '0'
// +--------- Must be fixed to '0'
// Setting UART0 transmit/receive control register 1 (UART mode)
u0c1 = 0X0E ;//0x0f; // ---- XXXX
// |||+- Transmit enable bit
// ||| 0: Transmission disabled
// ||| 1: Transmission enabled
// ||+-- Transmit buffer empty flag
// || 0: Data present in transmit buffer register
// || 1: No data present in transmit buffer register
// |+--- Receive enable bit
// | 0: Reception disabled
// | 1: Reception enabled
// +---- Receive complete flag
// 0: No data present in receive buffer
// 1: Data present in receive buffer
// Setting UART0 transmit/receive control register 2 (UART mode)
ucon |= 0x00; // -X0- ---X
// || +- UART0 transmit interrupt cause select bit
// || 0: Transmit buffer empty (TI=1)
// || 1: Transmission completed (TXEPT=1)
// |+------- Must be fixed to '0'
// +-------- Separate /CTS//RTS bit
// 0: /CTS//RTS shared pin
// 1: /CTS//RTS separate pin
// Setting UART0 bit rate generator for 9600 baud (UART mode)
u0brg = 0x40; // REMARKS: U0BRG=(Xin/(16*clock_select*Baud))-1
// For example:
// Xin = 10MHz
// clock_select = 1 (source=f1)
// Baud = 9600 Baud rate
//u0brg = 0x81; // Baud = 4800 Baud rate
// => u0brg = 64d = 0x40 (actual baud = 9615)
s0ric = 0x03; // ---- XXXX
// ||||
// |||+-- Interupt priority level select bit
// ||+--- Interupt priority level select bit
// |+---- Interupt priority level select bit
// | 000: Level 0 (interrupt disabled)
// | 001: Level 1
// | 010: Level 2
// | 011: Level 3
// | 100: Level 4
// | 101: Level 5
// | 110: Level 6
// | 111: Level 7
// +----- Interupt request bit
// 0: Interrupt not requested
// 1: Interrupt requested
s0tic = 0x00;
}
//------------------------------------------------------------------------------
// uart 0 reciever interrupt
//------------------------------------------------------------------------------
void Uart0RxInt(void)
{
WORD wsdata;
uchar u0rbbyte;
//Send_Taskmsg(AlarmTaskid,STATUSCHANGE,NULL);
// OS_EXIT_CRITICAL();
if((u0c1&0x08)==0x08)
{
u0c1 &= ~0x08;
wsdata = u0rb;
if(wsdata & 0x8000)
{
u0c1&=~0x04;
u0c1|=0x04;
return;
}
u0rbbyte = (uchar)(wsdata&0x00ff);
if(gpsuart.bufnum>=MAX_GPS_RECV) //避免溢出//
{
gpsuart.bufnum = 0;
}
//u1tb = u0rbbyte;
switch(gpsuart.recvstep)
{
case 0:
gpsuart.recvlen = 0;
if(u0rbbyte=='$')
{
gpsuart.recvstep ++;
}
break;
case 1:
gpsuart.recvlen = 0;
gpsuart.recvstep ++;
if(u0rbbyte!='G')
gpsuart.recvstep = 0;
break;
case 2:
gpsuart.recvlen = 0;
gpsuart.recvstep++;
if(u0rbbyte!='P')
gpsuart.recvstep = 0;
break;
case 3:
if(u0rbbyte!='R'&&u0rbbyte!='T'&&u0rbbyte!='G')
{
gpsuart.recvlen = 0;
gpsuart.recvstep = 0;
}
else
{
gpsuart.recvstep++;
}
break;
case 4:
if(u0rbbyte!='M'&&u0rbbyte!='X'&&u0rbbyte!='S')
{
gpsuart.recvlen = 0;
gpsuart.recvstep = 0;
}
else
{
gpsuart.recvstep++;
}
break;
case 5:
if(u0rbbyte!='C'&&u0rbbyte!='T'&&u0rbbyte!='A')
{
gpsuart.recvlen = 0;
gpsuart.recvstep = 0;
}
else
{
gpsuart.recvstep++;
}
break;
case 6:
if(/*gpsuart.recvbuf[gpsuart.bufnum][gpsuart.recvlen-1]==0x0d&&*/u0rbbyte=='*')
{
//gpsuart.recvbuf[gpsuart.bufnum][gpsuart.recvlen++] = '*';//0x0a;
gpsuart.recvbuf[gpsuart.bufnum][0] = gpsuart.recvlen;
Send_Taskmsg(AlarmTaskid,GPSUARTRECV,gpsuart.recvbuf[gpsuart.bufnum]);
gpsuart.bufnum++;
gpsuart.recvstep = 0;
if(gpsuart.bufnum>=MAX_GPS_RECV)
gpsuart.bufnum = 0;
}
else
{
if(gpsuart.recvlen>140)
gpsuart.recvstep = 0;
}
break;
default:
gpsuart.recvstep = 0;
break;
}
gpsuart.recvbuf[gpsuart.bufnum][gpsuart.recvlen] = u0rbbyte;
gpsuart.recvlen++;
}
}
//------------------------------------------------------------------------------
// uart 0 transimit interrupt
//------------------------------------------------------------------------------
void Uart0TxInt(void)
{
// OS_EXIT_CRITICAL();
if((u0c1 & 0x02)==0x02)
{
u0c1 &= ~0x02;
if(gpsuart.sendstatus==_BUSY&&gpsuart.sendlen!=0)
{
u0tb = gpsuart.sendbuf[gpsuart.sendlen-1];
//u0c1 |= 0x01;
gpsuart.sendlen--;
if(gpsuart.sendlen==0)
{
gpsuart.sendstatus==_IDLE;
}
}
}
}
//------------------------------------------------------------------------------
// initial uart 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -