177 lines
2.9 KiB
C
177 lines
2.9 KiB
C
#include "ax110xx.h"
|
|
#include "interrupt_ax110xx.h"
|
|
#include "cpu_ax110xx.h"
|
|
#include "types_ax110xx.h"
|
|
|
|
static unsigned char globeInt = 0;
|
|
static unsigned char cpuSysClk = 0;
|
|
static unsigned char memShadow = 0;
|
|
static unsigned char progWtst = 0;
|
|
static unsigned char dataStretch = 0;
|
|
|
|
void AX11000_Init(void)
|
|
{
|
|
EA = 0; // turn off globe interrupt
|
|
|
|
P0 = 0xFF;
|
|
P1 = 0xFF;
|
|
P2 = 0xFF;
|
|
P3 = 0xFF;
|
|
|
|
/* Check program wait-state and data memory wait-state */
|
|
if (CSREPR & PMS)
|
|
{
|
|
memShadow = 1;
|
|
|
|
/* for real chip */
|
|
switch (CSREPR & (BIT6|BIT7))
|
|
{
|
|
case SCS_100M :
|
|
cpuSysClk = SCS_100M;
|
|
WTST = 0x01;
|
|
CKCON = 0x01;
|
|
break;
|
|
case SCS_50M :
|
|
cpuSysClk = SCS_50M;
|
|
WTST = 0x00;
|
|
CKCON = 0x01;
|
|
break;
|
|
case SCS_25M :
|
|
cpuSysClk = SCS_25M;
|
|
WTST = 0x00;
|
|
CKCON = 0x01;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
memShadow = 0;
|
|
|
|
/* for real chip */
|
|
switch (CSREPR & (BIT6|BIT7))
|
|
{
|
|
case SCS_100M :
|
|
cpuSysClk = SCS_100M;
|
|
WTST = 0x07;
|
|
CKCON = 0x01;
|
|
break;
|
|
case SCS_50M :
|
|
cpuSysClk = SCS_50M;
|
|
WTST = 0x03;
|
|
CKCON = 0x01;
|
|
break;
|
|
case SCS_25M :
|
|
cpuSysClk = SCS_25M;
|
|
WTST = 0x01;
|
|
CKCON = 0x01;
|
|
break;
|
|
}
|
|
}
|
|
|
|
progWtst = WTST & 0x07;
|
|
dataStretch = CKCON & 0x07;
|
|
|
|
PCON &= ~SWB_; // Turn off switchback function.
|
|
|
|
EIF &= ~INT5F; // Clear the flag of interrupt 5.
|
|
EIF &= ~INT6F; // Clear the flag of interrupt 6.
|
|
if (WTRF)
|
|
{
|
|
CSREPR |= SW_RST;
|
|
WTRF = 0; // Clear Watch Dog Time Out Reset Flag.
|
|
}
|
|
|
|
PINT2 = 1; // INT2 priority is at high level for DMA request.
|
|
|
|
EXTINT0(OFF); // EINT0 interrupt.
|
|
EXTINT1(OFF); // EINT1 interrupt.
|
|
EXTINT2(OFF); // EINT2 interrupt for DMA request.
|
|
EXTINT3(OFF); // EINT3 interrupt for PCA.
|
|
EXTINT4(OFF); // EINT4 interrupt for peripheral device.
|
|
EXTINT5(OFF); // EINT5 interrupt for software timer.
|
|
EXTINT6(OFF); // EINT6 interrupt for wake-up of power management mode and stop mode.
|
|
|
|
if (globeInt & BIT7)
|
|
EA = globeInt & BIT0;
|
|
else
|
|
EA = 1; // Enable the globe interrupt.
|
|
}
|
|
|
|
unsigned char AX11000_GetSysClk(void)
|
|
{
|
|
return cpuSysClk;
|
|
}
|
|
|
|
unsigned char AX11000_GetMemSdw(void)
|
|
{
|
|
return memShadow;
|
|
}
|
|
|
|
unsigned char AX11000_GetProgWst(void)
|
|
{
|
|
return progWtst;
|
|
}
|
|
|
|
unsigned char AX11000_GetDataSth(void)
|
|
{
|
|
return dataStretch;
|
|
}
|
|
|
|
void AX11000_SoftReset(void)
|
|
{
|
|
if (EA)
|
|
globeInt = BIT0 | BIT7; // BIT0:EA bit record ; BIT7:Software reset record.
|
|
else
|
|
globeInt = BIT7;
|
|
|
|
EA = 0;
|
|
|
|
CSREPR |= SW_RST;
|
|
}
|
|
|
|
void AX11000_SoftReboot(void)
|
|
{
|
|
CSREPR |= SW_RBT;
|
|
}
|
|
|
|
void AX11000_WatchDogSetting(unsigned char wdIntrEnb, unsigned char wdRstEnb, unsigned char wdPrty, unsigned char wdTime)
|
|
{
|
|
CKCON |= wdTime;
|
|
|
|
if (wdIntrEnb & WD_INTR_ENABLE)
|
|
{
|
|
EWDI = 1;
|
|
}
|
|
else
|
|
{
|
|
EWDI = 0;
|
|
}
|
|
|
|
if (wdRstEnb & WD_RESET_ENABLE)
|
|
{
|
|
TA = 0xAA;
|
|
TA = 0x55;
|
|
EWT = 1;
|
|
}
|
|
else
|
|
{
|
|
TA = 0xAA;
|
|
TA = 0x55;
|
|
EWT = 0;
|
|
}
|
|
|
|
if (wdPrty & WD_HIGH_PRIORITY)
|
|
{
|
|
PWDI = 1;
|
|
}
|
|
else
|
|
{
|
|
PWDI = 0;
|
|
}
|
|
|
|
TA = 0xAA;
|
|
TA = 0x55;
|
|
RWT = 1;
|
|
WTRF = 0;
|
|
WDIF = 0;
|
|
}
|