Commit 16eb16b8 authored by 耨义强's avatar 耨义强

feat(12):

parent 1d428143
/Test_Bench/bin
/Test_Bench/General_HY64_Data
{
"files.encoding": "gbk",
"files.associations": {
"includes.h": "c",
"globals_var.h": "c"
}
}
\ No newline at end of file
# CS08___test_bench
小康CS08检测台
\ No newline at end of file
{
"files.associations": {
"includes.h": "c",
"var_type.h": "c"
},
"files.encoding": "gbk"
}
\ No newline at end of file
#define GLOBALS_API_ATD
#include "../App_Headers/includes.h"
/*-------------------------------------------------------------------------
* Function Name : ATD_INIT
* Description : AD转化初始化
* Input :
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
void API_ATD_init(void)
{
///*
ATDCTL0 = null;
ATDCTL1_ETRIGSEL = Disable;
ATDCTL1_SRES = True; //10位精度
ATDCTL1_SMP_DIS = Disable; //
ATDCTL1_ETRIGCH = 0; //转化通道初始化
ATDCTL2_AFFC = Disable; //分别清除每一个 CCFX标志位用写1的方式
ATDCTL2_ICLKSTP = Enable; //使能停止模式
ATDCTL2_ETRIGE = Disable; //外部触发禁止
ATDCTL2_ASCIE = Disable; //禁止转化中断
ATDCTL2_ACMPIE = Disable; //禁止比较中断
ATDCTL3_DJM = Enable; //右对齐
ATDCTL3_S1C = 1; //转化长度1
ATDCTL3_S2C = 0;
ATDCTL3_S4C = 0;
ATDCTL3_S8C = 0;
ATDCTL3_FIFO = Disable; //不是FIFO模式 并且各自的结果放在各自的寄存器 ATDDRx
ATDCTL3_FRZ = Disable; //禁止冻结模式
ATDCTL4_SMP = SMP_TIME; //采样时间 4 CYCLE
ATDCTL4_PRS = SMP_PRE; //
ATDCTL5_SC = Disable;
ATDCTL5_CA = 0;
ATDCTL5_CB = 0;
ATDCTL5_CC = 0;
ATDCTL5_CD = 0;
ATDDIEN=0xfe;
ATDCTL5_SCAN = Enable; //连续转化
ATDCTL5_MULT = 0; //只有一个通道
//*/
}
/*-------------------------------------------------------------------------
* Function Name : API_GetSensorAD
* Description : 提取AD值
* Input :
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
void API_GetSensorAD(void)
{
static INT16U ad_data[10];
static INT8U p = null;
INT8U AD_STATUS;
AD_STATUS = ATDSTAT0;
if((AD_STATUS & 0x80) == 0x80)
{
ad_data[p] = ATDDR0;
p++;
if(p >2)
{
p = null;
}
APP_SortNByte(ad_data,3);
if(ad_data[1] > 200) //2V = 7.7V
{
Curkeyinput = KeyON;
}
else
{
Curkeyinput = KeyOFF;
}
ATDSTAT0_SCF = ClearFlag;
}
}
\ No newline at end of file
#define GLOBALS_API_CAN
#include "../App_Headers/includes.h"
/*-------------------------------------------------------------------------
* Function Name : Api_CAN_Init
* Description : CAN初始化
* Input : None
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
void Api_CAN_Init(void)
{
INT16U b = null;
CANCTL0_INITRQ = Enable; //准备初始化
while(!CANCTL1_INITAK); //等待进入初始化模式
CANCTL1 = CANCTL1_CANE_MASK | CANCTL1_BORM_MASK;
CANCTL1_WUPM = Disable; //所有显性唤醒
/*
SYNC_SEG + (PROP_SEG + PHASE_SEG1) + (PHASE_SEG2)
1 Tq 4--16 Tq 2--8 Tq
*/
CANBTR1_TSEG_10 = Seg1_5Tq; //351page 75% 75<= sp<=83
CANBTR1_TSEG_20 = Seg2_2Tq;
CANBTR0_SJW = SJW_1Tq; //重新同步
CANBTR1_SAMP = SAMP_1;
CANBTR0_BRP = 0x00; //0 500K 1 250K
CANIDAC_IDAM = IDAM_2_32Bit;
CANIDAC_IDHIT = IDHIT0; //滤波器 0 有效
CANIDAR0 = null; //
CANIDAR1 = null;
CANIDAR2 = null;
CANIDAR3 = null;
CANIDAR4 = null;
CANIDAR5 = null;
CANIDAR6 = null;
CANIDAR7 = null;
CANIDMR0 = 0xFF;
CANIDMR1 = 0xFF;
CANIDMR2 = 0xFF;
CANIDMR3 = 0xFF;
CANIDMR4 = 0xFF;
CANIDMR5 = 0xFF;
CANIDMR6 = 0xFF;
CANIDMR7 = 0xFF;
//
CANTIER = null;
CANCTL0_INITRQ = Disable; //完成初始化
while(CANCTL1_INITAK); //等待确认
CANRFLG_RXF = ClearFlag;
CANRIER_RXFIE = Enable; //使能接收中断
CANTIER_TXEIE = Disable; //禁止发送中断
CANCTL0_TIME = Enable; //使能时间戳
CANCTL0_CSWAI = WaitRun; //等待模式下可以运行
CANCTL0_WUPE = Enable;
}
/*-------------------------------------------------------------------------
* Function Name : GET_STAND_ID
* Description : 提取标准ID
* Input : IDR0_Add -> 对应的IDR0的地址
* Output : None
* Return : dwPGN
* onther :
--------------------------------------------------------------------------*/
INT16U Api_GET_STAND_ID(INT8U *IDR0_Add)
{
INT16U dwPGN;
INT8U *bp;
bp = (INT8U*)&dwPGN;
*(bp ) = *(IDR0_Add );
*(bp + 1) = *(IDR0_Add + 1);
dwPGN = dwPGN>>5;
return(dwPGN);
}
INT32U bsp_GET_EXTEND_ID(INT8U *IDR0_Add)
{
INT32U dwPGN = 0;
INT8U *bp;
bp = (INT8U*)&dwPGN;
*(bp ) = *(IDR0_Add );
*(bp + 1) = *(IDR0_Add + 1);
*(bp + 2) = *(IDR0_Add + 2);
*(bp + 3) = *(IDR0_Add + 3);
dwPGN = ((dwPGN & 0x7FFFF) >> 1) | ((dwPGN & 0xFFE00000) >> 3);
return(dwPGN);
}
/*-------------------------------------------------------------------------
* Function Name : Api_CANSendFrame
* Description :
* Input :
* Output : None
* Return : dwPGN
* onther :
--------------------------------------------------------------------------*/
INT8U Api_CANSendFrame(CAN_message * CanMessage)
{
INT8U txbuffer,index;
INT16U cn = null;
INT8U priority = 0;
INT8U length = CanMessage->Length;
INT32U id = CanMessage->ID;
if (!CANTFLG) //Is Transmit Buffer full ? Full ( TXEx=0;)
{
return failt;
}
if(id == null)
{
return failt;
}
if(!CanMessage->ID_EN){
return failt;
}
CANTBSEL = CANTFLG; /* Select lowest empty buffer */
txbuffer = CANTBSEL; // Backup selected buffer
/* Load Id to IDR Register */
//*((unsigned long *) ((unsigned long)(&CANTXIDR0))) = id; // I appreciate this , easy and good.
if (id < 0x00000800)
{
CANTXIDR0 = (INT8U)(id>>3);
CANTXIDR1 = id<<5;
CANTXIDR2 = 0;
CANTXIDR3 = 0;
}
else
{
CANTXIDR0 = (INT8U)((id & 0x1fe00000)>>21);
CANTXIDR1 = (INT8U)((id & 0x001c0000)>>13);
CANTXIDR1 |= (INT8U)((id & 0x00038000)>>15);
CANTXIDR1 |= 0x18;
CANTXIDR2 = (INT8U)((id & 0x00007f80)>>7);
CANTXIDR3 = (INT8U)((id & 0x0000007f)<<1);
}
if(length>8)
length=8;
for ( index=0; index < length; index++) {
*(&CANTXDSR0 + index) = CanMessage->Msg[index]; //Load data to Tx buffer Data Segment Registers
}
CANTXDLR = length; /* Set Data Length Code */
CANTXTBPR = priority; /* Set Priority */
CANTFLG = txbuffer; /* Start transmission */
while ((CANTFLG & txbuffer) != txbuffer)
{
//; // Wait for Transmission completion
cn++;
if(cn>WaitOverTime)
break;
}
return success;
}
/*-------------------------------------------------------------------------
* Function Name : Api_CAN_Rev_isr
* Description : 提取标准ID
* Input : IDR0_Add -> 对应的IDR0的地址
* Output : None
* Return : dwPGN
* onther :
--------------------------------------------------------------------------*/
interrupt void Api_CAN_Rev_isr(void)
{
INT32U stand_id;
INT8U m_dlc;
stand_id = bsp_GET_EXTEND_ID((INT8U*)&CANRXIDR0);
m_dlc = CANRXDLR_DLC;
switch(stand_id)
{
case 0x18DAF917: //车速
if(m_dlc == 8)
{
UDS_Receive_Main(&CANRXDSR0);
}
break;
default:
;
}
CANRFLG_RXF = ClearFlag;
}
\ No newline at end of file
#define GLOBALS_API_DFLASH
#include "../App_Headers/includes.h"
/*-------------------------------------------------------------------------
* Function Name : Api_Flash_Init
* Description : FLASH初始化
* Input : None
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
void Api_Flash_Init(void)
{
FCNFG = Disable; //禁止完成中断
FERCNFG = Disable; //禁止错误中断
if(false != FERSTAT)
{
FERSTAT = 0x03;
}
if(false == FCLKDIV_FDIVLD)
{
if(True == FCLKDIV_FDIVLCK)
{
FCLKDIV_FDIVLCK = Disable; //开启改写时钟Flash时钟分频
}
FCLKDIV_FDIV = 32; //10
FCLKDIV_FDIVLCK = Enable; //禁止改写时钟Flash时钟分频
}
}
/*-------------------------------------------------------------------------
* Function Name : Api_Flash_byte_read
* Description : 读取字节
* Input : None
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
INT8U Api_Flash_byte_read(INT16U _addr)
{
return *(INT8U *)_addr;
}
/*-------------------------------------------------------------------------
* Function Name : Api_DFlashCommSequence
* Description : DFlash命令序列
* Input : bCommandCounter
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
INT8U Api_DFlashCommSequence(INT8U bCommandCounter)
{
INT8U bCounter;
INT32U dwDelay;
if(MaxDFlashCommandCounter <= bCommandCounter)
{
return RunParameterErr;
}
//检测命令完成
dwDelay = null;
while(!FSTAT_CCIF)
{
dwDelay++;
if(dwDelay > MaxDelayTime)
{
bReturn = RunOverTimeErr;
break;
}
}
//命令正常完成
if(dwDelay < MaxDelayTime)
{
//清零ACCERR和FPVIOL标志
if((True == FSTAT_FPVIOL) ||
(True == FSTAT_ACCERR))
{
FSTAT = (FSTAT_FPVIOL_MASK | FSTAT_ACCERR_MASK);
}
//装载命令
for(bCounter = 0; bCounter <= bCommandCounter; bCounter++)
{
FCCOBIX = bCounter;
FCCOB = FlashCommandArray[bCounter];
}
FSTAT_CCIF = True; //启动命令
//检测命令完成
dwDelay = 0;
while(!FSTAT_CCIF)
{
dwDelay++;
if(dwDelay > MaxDelayTime)
{
bReturn = RunOverTimeErr;
break;
}
}
if(dwDelay < MaxDelayTime)
{
if(false != FSTAT_ACCERR)
{
bReturn = RunErrACCERR;
}
else
{
if(false != FSTAT_FPVIOL)
{
bReturn = RunErrFPVIOL;
}
else
{
if(false != FSTAT_MGSTAT1)
{
bReturn = RunErrMGSTAT1;
}
else
{
if(false != FSTAT_MGSTAT0)
{
bReturn = RunErrMGSTAT0;
}
}
}
}
}
}
return(bReturn);
}
/*-------------------------------------------------------------------------
* Function Name : Api_DFlashEraseSector
* Description : DFlash扇区擦除
* Input : wDestination
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
INT8U Api_DFlashEraseSector(INT16U wDestination)
{
INT16U wCommand;
if((wDestination & (INT16U)(DFLASH_SECTOR_SIZE -1)) != 0)
{
bReturn = RunParameterErr;
}
else
{
bReturn = RunComplete;
if((wDestination < DFLASH_BLOCK_START_ADDR) || \
(wDestination >= DFLASH_BLOCK_END_ADDR) || \
((wDestination + DFLASH_SECTOR_SIZE) > DFLASH_BLOCK_END_ADDR))
{
bReturn = RunParameterErr;
}
else
{
wDestination = wDestination & (INT16U)~(DFLASH_SECTOR_SIZE -1);
//命令准备
wCommand = ((INT16U)(DFLASH_ERASE_SECTOR) << 8);
FlashCommandArray[0] = (wCommand|GLOBAL_ADDRESS_DFLASH);
FlashCommandArray[1] = wDestination;
bReturn = Api_DFlashCommSequence(DFLASH_ERASE_COM_LENGTH);
}
}
return(bReturn);
}
/*-------------------------------------------------------------------------
* Function Name : Api_DFlashEraseVerify
* Description : DFlash扇区擦除
* Input : wDestination
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
INT8U Api_DFlashEraseVerify(INT16U wDestination, INT16U wSize)
{
INT16U wWordCounter;
INT16U wCommand;
bReturn = RunComplete;
if((0 != (wSize % WordSize)) ||
(wSize > DFLASH_SECTOR_SIZE))
{
bReturn = RunParameterErr;
}
else
{
if(0 != wSize)
{
wWordCounter = (INT16U)(wSize / WordSize);
wCommand = (((INT16U)(DFLASH_ERASE_VERIFY)) << 8);
FlashCommandArray[0] = (wCommand | GLOBAL_ADDRESS_DFLASH);
FlashCommandArray[1] = wDestination;
FlashCommandArray[2] = wWordCounter;
bReturn = Api_DFlashCommSequence(DFLASH_ERASE_VERIFY_COM_LENGTH);
}
}
return(bReturn);
}
/*-------------------------------------------------------------------------
* Function Name : Api_DFlashEraseVerify
* Description : DFlash扇区擦除
* Input : wDestination
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
INT8U Api_DFalshProgram(INT16U wDest,INT16U wByteNub,INT16U *wSource)
{
INT8U bLoopIndex;
INT8U bCounter;
INT8U bIndex;
INT16U wEndAdd;
INT16U wCommand;
//else
{
bReturn = RunComplete;
wEndAdd = wDest + wByteNub;
//检测参数正确性
if((0 != (wByteNub % WordSize)) ||
(DFLASH_BLOCK_END_ADDR < wEndAdd))
{
bReturn = RunParameterErr;
}
else
{
wCommand = (((INT16U)(DFLASH_PROGRAM)) << 8);
while(wDest < wEndAdd)
{
FlashCommandArray[0] = (wCommand | GLOBAL_ADDRESS_DFLASH);
FlashCommandArray[1] = wDest;
if(MaxProgramByteNumber < wByteNub)
{
bLoopIndex = DFLASH_PROGRAM_COM_LENGTH;
}
else
{
bLoopIndex = (INT8U)(wByteNub / WordSize);
}
for(bCounter = 0;bCounter < bLoopIndex;bCounter++)
{
FlashCommandArray[bCounter + 2] = *wSource;
wDest += WordSize;
wSource++;
wByteNub -= WordSize;
}
bIndex = bLoopIndex + 1;
if(RunComplete != Api_DFlashCommSequence(bIndex))
{
break;
}
}
}
}
return(bReturn);
}
\ No newline at end of file
#define GLOBALS_API_DEV
#include "../App_Headers/includes.h"
/*-------------------------------------------------------------------------
* Function Name : Api_Sys_Init
* Description : 系统初始化
* Input : None
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
void Api_Sys_Init(void)
{
DisableInterrupts;
Api_Clock_Init();
Api_Flash_Init();
Api_IO_init();
Api_CAN_Init();
Api_Timer0_Init(TPM_DIV1);
Api_SCI_Init();
Api_LCD_Init();
Api_Motor_Init();
EnableInterrupts;
}
/*-------------------------------------------------------------------------
* Function Name : Api_Clock_Init
* Description : 系统时钟初始化
* Input : None
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
void Api_Clock_Init(void)
{
INT32U dwTime = null;
MODE = NormalChip;
DIRECT = InitDIRECT; //初始化直接页寄存器
IVBR = InitIVBR; //初始化中断向量基地址
CPMUOSC_OSCE = Enable; //使能外部振荡器
while(!CPMUFLG_UPOSC) //等待振荡稳定
{
dwTime++;
if(dwTime > 10000)
{
dwTime = null;
break;
}
}
ECLKCTL_NECLK = Enable; //禁止ECLK输出
CPMUPROT = InitCPMUPROT; //禁止时钟保护
CPMUREFDIV = InitCPMUREFDIV; //设置分频系数
CPMUSYNR = InitCPMUSYNR; //设置乘系数
CPMUPOSTDIV = InitCPMUPOSTDIV; //设置分频参数
CPMUPLL = InitCPMUPLL; //PLL频率调节
//CPMUCOP = InitCPMUCOP; //开启看门狗
CPMUCLKS = InitCPMUCLKS; //在停止模式下振荡运行 选择PLL时钟
CPMUCLKS_PLLSEL = Enable;
CPMUOSC_OSCE = Enable; //使能外部振荡器
while(!CPMUFLG_UPOSC) //等待振荡稳定
{
dwTime++;
_FEED_COP();
if(dwTime > 10000)
{
dwTime = null;
break;
}
}
CPMUCLKS_PSTP = Enable; //伪停止模式
CPMUCLKS_RTIOSCSEL = Enable; //RTI STOP MODE 继续运行
CPMUCLKS_PRE = Enable;
CPMUCLKS_COPOSCSEL = !Enable; //COP STOP MODE 运行
CPMUCLKS_PCE = !Enable;
CPMUPROT = Enable; //使能时钟保护
CPMUHTCTL = Disable; //温度保护禁止
//中断
CPMUINT_OSCIE = Disable; //Osc
CPMUINT_LOCKIE = Disable; //Lock
//RTI
CPMURTI_RTDEC = True; //十进制
CPMURTI_RTR = 0x03; //400*10^3
CPMUINT_RTIE = Enable; //RTI
CPMULVCTL_LVIE = Disable; //LV
IRQCR = Disable; //IRQ
}
/*-------------------------------------------------------------------------
* Function Name : Api_IO_init
* Description :
* Input : None
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
void Api_IO_init(void)
{
/*PUCR = 0x40; //上拉驱动使能 禁止下拉
DDR1AD = 0x00;
PER1AD = 0xD0;
DDRA = 0xff;
DDRB = 0xff;
DDRU = 0xf0;
PERU = 0x0F;
PPSU = 0x00;
DDRR = 0x70;
PERR = 0x00;
PPSR = 0x00;
DDRV = 0xff;
PERV = 0x00;
PPSV = 0x00;
DDRH = 0xff;
PERH = 0x00;
PPSH = 0x00;
DDRS = 0x00;
PERS = 0x00;
PPSS = 0x00; //选择上拉 还是下拉
RDRS = 0x00; //驱动能力选择
PTSRR = 0x10; //控制IIC OR SPI
WOMS = 0x00;
PIES = 0x00;
PIFS = 0x00;
SPICR1 = 0x00;
SPICR2 = 0x01;
PTPRR = 0x06;
DDRP = 0xf2;
PERP = 0x00;
PPSP = 0x00;
DDRT = 0xff;
PERT = 0x00;
PPST = 0x00;
PT1AD = 0x00;
PORTA = 0x00;
PORTB = 0x00;
PTT = 0x00;
PTH = 0x00;
PTU = 0x00;
PTP = 0x00;
PTR = 0x00;
PTS = 0x00;
PTV = 0x00;
ATDDIEN = 0xff;*/
PUCR = 0x40; //上拉驱动使能 禁止下拉
DDR1AD = 0x70;
PER1AD = 0x0e;
DDRA = 0xff;
DDRB = 0xff;
DDRU = 0xff;
PERU = 0x00;
PPSU = 0x00;
DDRR = 0x70;
PERR = 0x00;
PPSR = 0x00;
DDRV = 0xff;
PERV = 0x00;
PPSV = 0x00;
DDRH = 0xff;
PERH = 0x00;
PPSH = 0x00;
DDRS = 0x00;
PERS = 0x00;
PPSS = 0x00; //选择上拉 还是下拉
RDRS = 0x00; //驱动能力选择
PTSRR = 0x10; //控制IIC OR SPI
WOMS = 0x00;
PIES = 0x00;
PIFS = 0x00;
SPICR1 = 0x00;
SPICR2 = 0x01;
PTPRR = 0x06;
DDRP = 0xf2;
PERP = 0x00;
PPSP = 0x00;
DDRT = 0xff;
PERT = 0x00;
PPST = 0x00;
PT1AD = 0x00;
PORTA = 0x00;
PORTB = 0x00;
PTT = 0x00;
PTH = 0x00;
PTU = 0x00;
PTP = 0x00;
PTR = 0x00;
PTS = 0x00;
PTV = 0x00;
ATDDIEN = 0xff;
}
#define GLOBALS_API_LCD
#include "../App_Headers/includes.h"
/*-------------------------------------------------------------------------
* Function Name : Api_LCD_Init
* Description :
* Input :
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
void Api_LCD_Init(void)
{
INT8U b;
INT8U *bp;
LCDCR1_LCDSWAI = Disable; //在停止模式下运行
LCDCR0_DUTY = Duty4; // 1/4 Duty
LCDCR0_LCLK = IRCCLK_1M; // IRCCLK 1M
bp = &LCDRAM0;
for(b = 0; b < 20;b++)
{
*bp = 0; //清零LCDRAM
}
FPENR0 = 0xf0; //初始化各段
FPENR1 = 0xff; //初始化各段
FPENR2 = 0x7f; //初始化各段
FPENR3 = 0x00; //初始化各段
FPENR4 = 0x00; //初始化各段
LCDCR0_LCDEN = Enable; //使能LCD
}
/*-------------------------------------------------------------------------
* Function Name : Api_LCD_Display
* Description : LCD显示
* Input : None
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
void Api_LCD_Display(void)
{
LCDFP11BP = Matrix1[(Key.CAN_Step / 10) %10]>>4;
LCDFP12BP = Matrix1[(Key.CAN_Step / 10) %10];
LCDFP13BP = Matrix1[(Key.CAN_Step % 10)]>>4;
LCDFP14BP = Matrix1[(Key.CAN_Step % 10)];
if(RunStep > 23)
{
LCDFP19BP = Matrix1[((Key.CAN_Step -24) / 10) %10]>>4;
LCDFP20BP = Matrix1[((Key.CAN_Step -24) / 10) %10];
LCDFP21BP = Matrix1[((Key.CAN_Step -24) % 10)]>>4;
LCDFP22BP = Matrix1[((Key.CAN_Step -24) % 10)];
}
else
{
LCDFP19BP = Matrix1[0]>>4;
LCDFP20BP = Matrix1[0];
LCDFP21BP = Matrix1[0]>>4;
LCDFP22BP = Matrix1[0];
}
//L
LCDFP18BP |= 0x08;
LCDFP20BP |= 0x08;
LCDFP22BP |= 0x08;
//E
LCDFP5BP |= 0x0f;
LCDFP6BP |= 0x01;
//D
LCDFP7BP |= 0x0d;
LCDFP8BP |= 0x07;
//-
LCDFP9BP |= 0x02;
//Z
LCDFP15BP |= Matrix1[2]>>4;
LCDFP16BP |= Matrix1[2];
//H
LCDFP17BP |= 0x07;
LCDFP18BP |= 0x0e;
LCDRAM2_FP4BP = LCDFP4BP;
LCDRAM2_FP5BP = LCDFP5BP;
LCDRAM3_FP6BP = LCDFP6BP;
LCDRAM3_FP7BP = LCDFP7BP;
LCDRAM4_FP8BP = LCDFP8BP;
LCDRAM4_FP9BP = LCDFP9BP;
LCDRAM5_FP10BP = LCDFP10BP;
LCDRAM5_FP11BP = LCDFP11BP;
LCDRAM6_FP12BP = LCDFP12BP;
LCDRAM6_FP13BP = LCDFP13BP;
LCDRAM7_FP14BP = LCDFP14BP;
LCDRAM7_FP15BP = LCDFP15BP;
LCDRAM8_FP16BP = LCDFP16BP;
LCDRAM8_FP17BP = LCDFP17BP;
LCDRAM9_FP18BP = LCDFP18BP;
LCDRAM9_FP19BP = LCDFP19BP;
LCDRAM10_FP20BP = LCDFP20BP;
LCDRAM10_FP21BP = LCDFP21BP;
LCDRAM11_FP22BP = LCDFP22BP;
}
\ No newline at end of file
#define GLOBALS_API_RTC
#include "../App_Headers/includes.h"
#include "../Library/TimeCtrl.h"
INT16U RT_10ms = 0,
RT_20ms = 0,
RT_25ms = 0,
RT_50ms = 0,
RT_60ms = 0,
RT_100ms = 0,
RT_200ms = 0,
RT_500ms = 0,
RT_1s = 0,
RT_2s = 0;
/*-------------------------------------------------------------------------
* Function Name : Api_SetTimer1
* Description : 设置定时器
* Input :
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
void Api_SetTimer0(INT16U Second,ClockType *T)
{
T->TEnable0 = Enable;
T->OverTime0 = Second;
Clock.Time0 = null;
}
/*-------------------------------------------------------------------------
* Function Name : API_TimerOver
* Description : 设置定时器
* Input :
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
INT8U Api_TimerOver0(ClockType *T)
{
if((T->Time0 >= T->OverTime0)&&(T->TEnable0 == Enable))
{
T->TEnable0 = Disable;
T->Time0 = null;
return 1;
}
else
{
return 0;
}
}
/*-------------------------------------------------------------------------
* Function Name : Api_SetTimer1
* Description : 设置定时器
* Input :
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
void Api_SetTimer1(INT16U Second,ClockType *T)
{
T->OverTime1 = Second;
Clock.Time1 = null;
T->TEnable1 = Enable;
}
/*-------------------------------------------------------------------------
* Function Name : API_TimerOver
* Description : 设置定时器
* Input :
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
INT8U Api_TimerOver1(ClockType *T)
{
if((T->Time1 >= T->OverTime1)&&(T->TEnable1 == Enable))
{
T->TEnable1 = Disable;
T->Time1 = null;
return 1;
}
else
{
return 0;
}
}
/*-------------------------------------------------------------------------
* Function Name : Api_SetTimer1
* Description : 设置定时器
* Input :
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
void Api_SetTimer2(INT16U Second,ClockType *T)
{
T->TEnable2 = Enable;
T->OverTime2 = Second;
Clock.Time2 = null;
}
/*-------------------------------------------------------------------------
* Function Name : API_TimerOver
* Description : 设置定时器
* Input :
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
INT8U Api_TimerOver2(ClockType *T)
{
if((T->Time2 >= T->OverTime2)&&(T->TEnable2 == Enable))
{
T->TEnable2 = Disable;
T->Time2 = null;
return 1;
}
else
{
return 0;
}
}
/*-------------------------------------------------------------------------
* Function Name : Api_SetTimer3
* Description : 设置定时器
* Input :
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
void Api_SetTimer3(INT16U Second,ClockType *T)
{
T->TEnable3 = Enable;
T->OverTime3 = Second;
Clock.Time3 = null;
}
/*-------------------------------------------------------------------------
* Function Name : Api_TimerOver3
* Description : 设置定时器
* Input :
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
INT8U Api_TimerOver3(ClockType *T)
{
if((T->Time3 >= T->OverTime3)&&(T->TEnable3 == Enable))
{
T->TEnable3 = Disable;
T->Time3 = null;
return 1;
}
else
{
return 0;
}
}
/*-------------------------------------------------------------------------
* Function Name : Api_SetTimer4
* Description : 设置定时器
* Input :
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
void Api_SetTimer4(INT16U Second,ClockType *T)
{
T->TEnable4 = Enable;
T->OverTime4 = Second;
Clock.Time4 = null;
}
/*-------------------------------------------------------------------------
* Function Name : Api_TimerOver4
* Description : 设置定时器
* Input :
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
INT8U Api_TimerOver4(ClockType *T)
{
if((T->Time4 >= T->OverTime4)&&(T->TEnable4 == Enable))
{
T->TEnable4 = Disable;
T->Time4 = null;
return 1;
}
else
{
return 0;
}
}
/*-------------------------------------------------------------------------
* Function Name : Api_SetTimer5
* Description : 设置定时器
* Input :
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
void Api_SetTimer5(INT16U Second,ClockType *T)
{
T->TEnable5 = Enable;
T->OverTime5 = Second;
Clock.Time5 = null;
}
/*-------------------------------------------------------------------------
* Function Name : Api_TimerOver5
* Description : 设置定时器
* Input :
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
INT8U Api_TimerOver5(ClockType *T)
{
if((T->Time5 >= T->OverTime5)&&(T->TEnable5 == Enable))
{
T->TEnable5 = Disable;
T->Time5 = null;
return 1;
}
else
{
return 0;
}
}
/*-------------------------------------------------------------------------
* Function Name : Api_SetTimer6
* Description : 设置定时器
* Input :
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
void Api_SetTimer6(INT16U Second,ClockType *T)
{
T->TEnable6 = Enable;
T->OverTime6 = Second;
Clock.Time6 = null;
}
/*-------------------------------------------------------------------------
* Function Name : Api_TimerOver5
* Description : 设置定时器
* Input :
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
INT8U Api_TimerOver6(ClockType *T)
{
if((T->Time6 >= T->OverTime6)&&(T->TEnable6 == Enable))
{
T->TEnable6 = Disable;
T->Time6 = null;
return 1;
}
else
{
return 0;
}
}
/*-------------------------------------------------------------------------
* Function Name : Api_SetTimer7
* Description : 设置定时器
* Input :
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
void Api_SetTimer7(INT16U Second,ClockType *T)
{
T->TEnable7 = Enable;
T->OverTime7 = Second;
Clock.Time7 = null;
}
/*-------------------------------------------------------------------------
* Function Name : Api_TimerOver7
* Description : 设置定时器
* Input :
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
INT8U Api_TimerOver7(ClockType *T)
{
if((T->Time7 >= T->OverTime7)&&(T->TEnable7 == Enable))
{
T->TEnable7 = Disable;
T->Time7 = null;
return 1;
}
else
{
return 0;
}
}
/*-------------------------------------------------------------------------
* Function Name : Api_SetAutoTimer
* Description : 设置自动切换定时器
* Input :
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
void Api_SetAutoTimer(INT16U Second,ClockType *T)
{
T->AutoEnable = Enable;
T->OverAutoTime = Second;
Clock.AutoTime = null;
}
/*-------------------------------------------------------------------------
* Function Name : Api_AutoTimerOver
* Description : 设置自动切换定时器
* Input :
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
INT8U Api_AutoTimerOver(ClockType *T)
{
if((T->AutoTime >= T->OverAutoTime)&&(T->AutoEnable == Enable))
{
T->AutoEnable = Disable;
T->AutoTime = null;
return 1;
}
else
{
return 0;
}
}
/*-------------------------------------------------------------------------
* Function Name : Api_RTC_isr
* Description :
* Input :
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
interrupt void Api_RTC_isr(void)
{
/*if(pSBLInput == PushDown)
{
if(Key.PushTime1 < 5000)
{
Key.PushTime1 ++;
}
}
if(pSBRInput == PushDown)
{
if(Key.PushTime2 < 5000)
{
Key.PushTime2 ++;
}
}
if(P96_AD3_IPOW == PushDown)
{
if(Key.PushTime3 < 5000)
{
Key.PushTime3 ++;
}
} */
RT_10ms++;
RT_20ms++;
RT_25ms++;
RT_50ms++;
RT_60ms++;
RT_100ms++;
RT_200ms++;
RT_500ms++;
RT_1s++;
RT_2s++;
if(pSB1 == 0){
Key.PushTime_1++;
}
if(pSB2 == 0){
Key.PushTime_2++;
}
if(RT_10ms >= 10){
RT_10ms_En = 1;
RT_10ms = null;
}
if(RT_20ms >= 20){
RT_20ms_En = 1;
RT_20ms = null;
}
if(RT_25ms >= 25){
RT_25ms_En = 1;
RT_25ms = null;
}
if(RT_50ms >= 50){
RT_50ms_En = 1;
RT_50ms = null;
}
if(RT_60ms >= 60){
RT_60ms_En = 1;
RT_60ms = null;
}
if(RT_100ms >= T_100ms){
RT_100ms_En = 1;
RT_100ms = null;
}
if(RT_200ms >= T_200ms){
RT_200ms_En = 1;
RT_200ms = null;
}
if(RT_500ms >= T_500ms){
RT_500ms_En = 1;
RT_500ms = null;
}
if(RT_1s >= T_1s){
RT_1s_En = 1;
RT_1s = null;
}
if(Key.StepAuto == 1){
if(RT_2s >= T_2s){
RT_2s = null;
Key.CAN_Step++;
}
}
else
{
RT_2s = null;
}
Timer_1ms_Base();
if(Clock.TEnable0)
{
if(Clock.Time0 < Clock.OverTime0)
{
Clock.Time0++;
}
}
if(Clock.TEnable1)
{
if(Clock.Time1 < Clock.OverTime1)
{
Clock.Time1++;
}
}
if(Clock.TEnable2)
{
if(Clock.Time2 < Clock.OverTime2)
{
Clock.Time2++;
}
}
if(Clock.TEnable3)
{
if(Clock.Time3 < Clock.OverTime3)
{
Clock.Time3++;
}
}
if(Clock.TEnable4)
{
if(Clock.Time4 < Clock.OverTime4)
{
Clock.Time4++;
}
}
if(Clock.TEnable5)
{
if(Clock.Time5 < Clock.OverTime5)
{
Clock.Time5++;
}
}
if(Clock.TEnable6)
{
if(Clock.Time6 < Clock.OverTime6)
{
Clock.Time6++;
}
}
if(Clock.TEnable7)
{
if(Clock.Time7 < Clock.OverTime7)
{
Clock.Time7++;
}
}
CPMUFLG_RTIF = ClearFlag;
}
#define GLOBALS_API_SCI
#include "../App_Headers/includes.h"
/*-------------------------------------------------------------------------
* Function Name : Api_SCI_Init
* Description : SCI模块初始化
* Input :
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
void Api_SCI_Init(void)
{
SCICR1_LOOPS = Disable; //串口正常模式
SCICR1_SCISWAI = Enable; //禁止等待模式
SCICR1_M = Disable; //8 byte 模式
SCICR1_WAKE = Enable; //Adrress Wake
SCICR1_PE = Disable; //禁止校验
SCISR1_RDRF = Disable;
SCIACR1_RXEDGIE = Disable; //
SCIACR1_BERRIE = Disable;
SCIACR1_BKDIE = Disable;
SCIACR2 = Disable;
SCIBDH_TNP = div4;
/*
When IREN = 0 then,
SCI baud rate = SCI bus clock / (16 x SBR[12:0])
When IREN = 1 then,
SCI baud rate = SCI bus clock / (32 x SBR[12:1])
*/
SCIBDH_IREN = Disable; //禁止红外线
SCIBD_SBR = 20;//baud_38400;
SCICR2_TIE = Disable;
SCICR2_TCIE = Disable;
SCICR2_ILIE = Disable;
SCICR2_RE = Enable; //使能接收
SCICR2_TE = Enable; //使能发送
SCICR2_RWU = Disable;
SCICR2_SBK = Disable; //使能发送
SCICR2_RIE = Enable; //使能接收中断
}
/*-------------------------------------------------------------------------
* Function Name : Api_SCI_Trans_Bytes
* Description : 串口发送
* Input : INT8U *str,INT16U len
* Output : None
* Return : None
* onther : str:发送字符串 len:发送数据长度
--------------------------------------------------------------------------*/
void Api_SCI_Trans_Bytes(INT8U *str,INT8U len)
{
INT8U i;
for(i=0;i<len;i++)
{
Api_SCI_Trans_Byte((*str));
str++;
}
}
/*-------------------------------------------------------------------------
* Function Name : Api_SCI_Trans_Byte
* Description : 串口发送
* Input : INT8U data
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
void Api_SCI_Trans_Byte(INT8U data)
{
while(SCISR1_TDRE == null);
SCIDRL = data;
while(!SCISR1_TC);
}
/*-------------------------------------------------------------------------
* Function Name : Api_SCI_Rev_isr
* Description : 串口接收中断
* Input :
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
interrupt void Api_SCI_Rev_isr(void)
{
if(SCISR1_RDRF == one)
{
SCIRV[rvcnt] = SCIDRL;
rvcnt ++;
if((SCIRV[0]==0xEB)&&(SCIRV[1]==0x90))
{
if(SCIRV[rvcnt-1]==0xAA)
{
if((SCIRV[rvcnt-2]==0x55)&&(rvcnt >=126))
{
rvcnt = null;
CarFlag.FlagBits.RS232RV_Full = Enable;
}
}
}
}
if(SCIRV[0] !=0xEB)
{
rvcnt = null;
}
if(rvcnt >= SCI_LEN)
{
rvcnt = null;
}
SCISR1_RDRF = ClearFlag;
}
\ No newline at end of file
#define GLOBALS_API_TPM
#include "../App_Headers/includes.h"
/*-------------------------------------------------------------------------
* Function Name : Api_Timer0_Init
* Description : 定时器0初始化
* Input :
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
void Api_Timer0_Init(INT8U TPM_DIV)
{
TIM0_TSCR1_TSWAI = Enable; //timer 0 在MCU等待模式下不能运行
TIM0_TSCR1_TSWAI = WaitRun;
TIM0_TSCR1_TSFRZ = Enable; //timer 0 计数器在冻结模式下禁止运行
TIM0_TSCR1_TFFCA = Disable; //正常清除标志位
TIM0_TSCR1_PRNT = Disable; //
TIM0_TSCR2_PR = TPM_DIV; //Bus Clock / 4
TIM0_TSCR2_TCRE = Disable;
TIM0_TTOV = Disable;
TIM0_TCTL1 = Disable; //禁止输出比较功能
TIM0_TCTL2 = Disable;
TIM0_TCTL3 = Disable; //禁止输出比较功能
TIM0_TCTL4 = Disable;
TIM0_TFLG2_TOF = Enable;
TIM0_TSCR1_TEN = Enable; //使能timer 0 正常功能
TIM0_TSCR2_TOI = Enable; //溢出中断使能
}
/*-------------------------------------------------------------------------
* Function Name : Api_Timer1_Init
* Description : 定时器1初始化
* Input :
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
void Api_Timer1_Init(INT8U TPM_DIV)
{
TIM1_TSCR1_TSWAI = Enable; //timer 0 在MCU等待模式下不能运行
TIM1_TSCR1_TSFRZ = Enable; //timer 0 计数器在冻结模式下禁止运行
TIM1_TSCR1_TFFCA = Disable; //正常清除标志位
TIM1_TSCR1_PRNT = Disable; //
TIM1_TSCR2_PR = TPM_DIV; //Bus Clock / 4
TIM1_TSCR2_TCRE = Disable;
TIM1_TTOV = Disable;
TIM1_TCTL1 = Disable; //禁止输出比较功能
TIM1_TCTL2 = Disable;
TIM1_TCTL3 = Disable; //禁止输出比较功能
TIM1_TCTL4 = Disable;
TIM1_TFLG2_TOF = Enable;
TIM1_TSCR1_TEN = Enable; //使能timer 0 正常功能
TIM1_TSCR2_TOI = Enable; //溢出中断使能
}
//-----------------------------------------------------------------------------
// 函数名称 : Api_Motor_Init
// 函数功能 : 初始化电机驱动
// 输入 :
// *Motor -> 电机结构指针
// 输出 : 无
// 返回值 : 运行状态
// 其他 : 无
//-----------------------------------------------------------------------------
void Api_Motor_Init(void)
{
INT16U *w;
INT8U Nub;
MCCTL0_MCPRE = 0; //时钟为总线的8分频
MCCTL0_MCSWAI = Enable; //停止模式停止工作
MCCTL0_FAST = Disable; //11bit分辨率
MCCTL0_DITH = Disable; //PER-> P10-P0 0:包含P0
MCCTL0_MCTOIF = ClearFlag; //清零中断标志
MCCTL1_RECIRC = True; //低续流
MCCTL1_MCTOIE = Enable; //使能中断
MCPER = 1454; //PWM周期 中断频率 22000
//
MCCC0_MCOM = clear; //双全H桥模式
MCCC0_MCAM = clear; //左对齐
MCCC0_CD = clear; //禁止延时
MCCC1_MCOM = clear; //全H桥模式
MCCC1_MCAM = clear; //左对齐
MCCC1_CD = clear; //禁止延时
//
MCCC2_MCOM = clear; //双全H桥模式
MCCC2_MCAM = clear; //左对齐
MCCC2_CD = clear; //禁止延时
MCCC3_MCOM = clear; //全H桥模式
MCCC3_MCAM = clear; //左对齐
MCCC3_CD = clear; //禁止延时
MCCC4_MCOM = clear;
MCCC4_MCAM = clear;
MCCC4_CD = clear;
MCCC5_MCOM = clear;
MCCC5_MCAM = clear;
MCCC5_CD = clear;
MCCC6_MCOM = clear; //双全H桥模式
MCCC6_MCAM = clear; //左对齐
MCCC6_CD = clear; //禁止延时
MCCC7_MCOM = clear; //全H桥模式
MCCC7_MCAM = clear; //左对齐
MCCC7_CD = clear; //禁止延时
w = &MCDC0; //初始化MCOC 0-7
for(Nub = 0;Nub < 8 ;Nub++)
{
*(w + Nub) = 0;
}
}
//-----------------------------------------------------------------------------
// 函数名称 : Api_Motor_isr
// 函数功能 : PWM溢出中断
// 输入 : 无
// 输出 : 无
// 返回值 : 无
// 其他 : 无
//-----------------------------------------------------------------------------
interrupt void Api_Motor_isr(void)
{
MCCTL0_MCTOIF = ClearFlag; //清零中断标志
}
/*-------------------------------------------------------------------------
* Function Name : Api_Timer0_isr
* Description : 定时器中断
* Input : None
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
interrupt void Api_Timer0_isr(void)
{
if((CANRFLG_RSTAT == 0x03)||(CANRFLG_TSTAT == 0x03))
{
if(BusOffTime == null)
{
BusOffTime = TT_200ms;
CANMISC_BOHOLD = ClearFlag;
}
if(BusOffTime > null)
{
BusOffTime--;
}
}
TIM0_TFLG2_TOF = ClearFlag; //清除中断标志位
}
/*-------------------------------------------------------------------------
* Function Name : API_Timer1_isr
* Description : 定时器中断
* Input : None
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
interrupt void API_Timer1_isr(void)
{
TIM1_TFLG2_TOF = ClearFlag; //清除中断标志位
}
#define GLOBALS_APP_CAN
#include "../App_Headers/includes.h"
#include "../Library/TimeCtrl.h"
#include "../Library/FT_VehSpeedCalc.h"
#define LED_P_NUMBER 0 //正控灯数量
#define LED_N_NUMBER 0 //负控灯数量
#define CAN_MAGS_NUMBER 10 //can报文数量
#define OIL_MUMBER 0 //水油检测点数
INT8U led_P = 0,
led_N = 0,
can_num = 0,
oil_num = 0;
void flash_1Hz_process(void)//500ms call blink/flash
{
Flash_1Hz = !(Flash_1Hz);
}
/*-------------------------------------------------------------------------
* Function Name : App_Msg_Copy
* Description :
* Input : None
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
void App_Msg_Copy(CAN_message * CanMessage,INT16U* data)
{
CanMessage->Msg[0] = data[0];
CanMessage->Msg[0] = data[1];
CanMessage->Msg[0] = data[2];
CanMessage->Msg[0] = data[3];
CanMessage->Msg[0] = data[4];
CanMessage->Msg[0] = data[5];
CanMessage->Msg[0] = data[6];
CanMessage->Msg[0] = data[7];
//bReturn = Api_CANSendFrame(pMsg->id,0,pMsg->Len,pMsg->Data);
}
/*-------------------------------------------------------------------------
* Function Name : Write_CAN_Msg
* Description :
* Input : None
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
void Write_CAN_Msg(CAN_message * CanMessage,INT8U i,INT8U data)
{
CanMessage->Msg[i] = data;
}
void Clear_CAN_Msg(CAN_message * CanMessage)
{
INT8U i = 0;
for (i; i <= (CanMessage->Length - 1); i++)
{
CanMessage->Msg[i] = 0x00;
}
CanMessage->ID_EN = 1;
}
void Set_CAN_Msg(CAN_message * CanMessage)
{
INT8U i = 0;
for (i; i <= (CanMessage->Length - 1); i++)
{
CanMessage->Msg[i] = 0xFF;
}
}
void Set_CAN_CRC(CAN_message * CanMessage){
INT8U i;
for(i = 1; i < CanMessage->Length; i++){
CanMessage->Msg[0] ^= CanMessage->Msg[i];
}
}
/*zh:
0CFF7902
0CFF7C02
18FFDC01
18FEDCD5
18FEDED5
*/
void Format_CAN_Msg()
{
CanMsg_330.ID = 0x330;
CanMsg_360.ID = 0x360;
CanMsg_385.ID = 0x385;
CanMsg_330.Length = 8;
CanMsg_360.Length = 8;
CanMsg_385.Length = 8;
CanMsg_330.ID_EN = 1;
CanMsg_360.ID_EN = 1;
CanMsg_385.ID_EN = 1;
}
void Disable_CAN_Tx(void){
CanMsg_330.ID_EN = 0;
CanMsg_360.ID_EN = 0;
CanMsg_385.ID_EN = 0;
}
void Set_Pin(INT16U pin)
{
}
/*-------------------------------------------------------------------------
* Function Name : App_Can_Proc
* Description :
* Input : None
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
void App_Can_Proc(void)
{
unsigned char i;
unsigned int gMsg;
for(i = 0; i < CAN_List_Num; i++){
Message_Value_Calculate(CAN_List[i]);
}
if(GetCtrlTime(CANMsgSend_10ms) >= 10){
ClearCtrlTime(CANMsgSend_10ms);
//bReturn = Api_CANSendFrame((CAN_message *)&CanMessageID18FEDCD5);
//bReturn = Api_CANSendFrame((CAN_message *)&CanMessageID18FEDED5);
//Clear_CAN_Msg((CAN_message *)&CanMessageID18FEDCD5);
//Clear_CAN_Msg((CAN_message *)&CanMessageID18FEDED5);
}
if(GetCtrlTime(CANMsgSend_20ms) >= 20){
ClearCtrlTime(CANMsgSend_20ms);
}
if(GetCtrlTime(CANMsgSend_50ms) >= 50){
ClearCtrlTime(CANMsgSend_50ms);
bReturn = Api_CANSendFrame((CAN_message *)&CanMsg_330);
Clear_CAN_Msg((CAN_message *)&CanMsg_330);
bReturn = Api_CANSendFrame((CAN_message *)&CanMsg_360);
Clear_CAN_Msg((CAN_message *)&CanMsg_360);
bReturn = Api_CANSendFrame((CAN_message *)&CanMsg_385);
Clear_CAN_Msg((CAN_message *)&CanMsg_385);
}
if(GetCtrlTime(CANMsgSend_100ms) >= 100){
ClearCtrlTime(CANMsgSend_100ms);
}
if(GetCtrlTime(CANMsgSend_200ms) >= 200){
ClearCtrlTime(CANMsgSend_200ms);
}
if(GetCtrlTime(CANMsgSend_500ms) >= 500){
flash_1Hz_process();
ClearCtrlTime(CANMsgSend_500ms);
}
if(GetCtrlTime(CANMsgSend_1s) >= 1000){
ClearCtrlTime(CANMsgSend_1s);
}
if(GetCtrlTime(CANMsgSend_10s) >= 10000){
ClearCtrlTime(CANMsgSend_10s);
}
//REV 0
/*CanMessageID0CF80AF0.Msg[0] = 0x98;
CanMessageID0CF80AF0.Msg[1] = 0x3A;
CanMessageID18F816F3.Msg[3] |= 0x10; */
CurValueStr[ENUM_VSpeed ].val = 0;
CurValueStr[ENUM_Water ].val = 0;
CurValueStr[ENUM_VSpeed ].fval = Value_Plus;
CurValueStr[ENUM_Water ].fval = Value_Plus;
// CurVehSpeed = 0;
//LDW Open
//CanMessageID18FE5BE8.Msg[0] |= 0x40;
//FCW Open
// CanMessageID0CF02FA0.Msg[0] |= 0x03;
//AutoLwBm Open
// CanMessageID18FF0B21.Msg[5] |= 0x10;
}
#define GLOBALS_APP_DFLASH
#include "../App_Headers/includes.h"
//-----------------------------------------------------------------------------
// 函数名称 : App_CopyRam(INT8U *Dp,INT8U *Sp,INT8U Nub)
// 函数功能 : RAM 复制
// 输入 : *Dp -> 目的地址
// *Sp -> 原地址
// Nub -> 复制字节数量
// 输出 : 无
// 返回值 : 无
// 其他 : 无
//-----------------------------------------------------------------------------
void App_CopyRam(INT8U *Dp,INT8U *Sp,INT8U Nub)
{
INT8U b;
for(b = 0;b < Nub;b++)
{
*Dp++ = *Sp++;
}
}
/*-------------------------------------------------------------------------
* Function Name : App_Read_EE_Memory
* Description : 读取EEPROM中数据
* Input : INT32U addr,INT8U *DestStr,INT16U len
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
void App_Read_EE_Memory(INT16U ReadAddr,INT8U *DestStr,INT16U len)
{
INT16U i;
for(i= 0;i<len;i++)
{
*(DestStr + i) = Api_Flash_byte_read(ReadAddr + i);
}
}
\ No newline at end of file
/*
* APP_Data_Process.c
*
* Created on: 2012-6-17
* Author: qitiancun
*/
#define GLOBALS_APP_PROCESS
#include "../App_Headers/includes.h"
//CAN_message CanMsg_385;
//CAN_message CanMsg_155;
//CAN_message CanMsg_101;
//CAN_message CanMsg_205;
//CAN_message CanMsg_212;
//CAN_message CanMsg_323;
//CAN_message CanMsg_109;
//CAN_message CanMsg_26D;
/*-------------------------------------------------------------------------
* Function Name : App_State_Init
* Description : 加载数据
* Input : None
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
void App_State_Init(void)
{
}
/*-------------------------------------------------------------------------
* Function Name : App_Load_Data
* Description : 加载数据
* Input : None
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
void App_Load_Data(void)
{
App_Read_EE_Memory(DFLASH_RADIO_ADDR- DFLASH_PROGRAM_OFFSET,(INT8U *)&Radio,8);
check = App_CreateCheckSun((INT8U*)&Radio.VehRadio,Radio.bFlag,6);
if((Radio.bFlag != 0x55)||(check != Radio.bCheckSun))
{
Radio.RevRadio = 40;
Radio.VehRadio = 568;
Radio.VehNum = 4;
}
}
/*-------------------------------------------------------------------------
* Function Name : App_SCI_Proc
* Description : 串口数据处理
* Input : None
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
INT8U App_CreateCheckSun(INT8U *pData,INT8U checkbyte,INT8U len)
{
INT8U Check=0,i;
Check = 0xff ^ checkbyte;
for(i=0;i<len;i++)
{
Check = Check ^ pData[i];
}
return Check;
}
void App_Uds_Calc_Key(INT32U seed)
{
aaaa = 0xb5;//00000000 00000000 00000000 10110101
bbbb = 0xa3;//00000000 00000000 00000000 10100011
cccc = 0xf1;//00000000 00000000 00000000 11110001
dddd = 0x36;//00000000 00000000 00000000 00110110
dwSeed4 = (INT8U)( seed & 0x000000ff); //00000000 00000000 00000000 000000ff
dwSeed3 = (INT8U)((seed & 0x0000ff00) >> 8); //00000000 00000000 0000ff00 00000000
dwSeed2 = (INT8U)((seed & 0x00ff0000) >> 16); //00000000 00ff0000 00000000 00000000
dwSeed1 = (INT8U)((seed & 0xff000000) >> 24); //ff000000 00000000 00000000 00000000
dwKey1 = (INT8U)((aaaa * (dwSeed1 * dwSeed1)) + (bbbb * (dwSeed2 * dwSeed2)) + (cccc * (dwSeed1 * dwSeed2)));
dwKey2 = (INT8U)((aaaa * dwSeed1) + (bbbb * dwSeed2) + (dddd * (dwSeed1 * dwSeed2)));
dwKey3 = (INT8U)((aaaa * (dwSeed3 * dwSeed4)) + (bbbb * (dwSeed4 * dwSeed4)) + (cccc * (dwSeed3 * dwSeed4)));
dwKey4 = (INT8U)((aaaa * (dwSeed3 * dwSeed4)) + (bbbb * dwSeed4) + (dddd * (dwSeed3 * dwSeed4)));
CalcKey = (dwKey1 << 24UL) | (dwKey2 << 16UL) | (dwKey3 << 8UL) | dwKey4;
}
void UDS_Receive_Main(unsigned char *buf)
{
switch(EOLStep)
{
case 0:
{
if((buf[1] == 0x62) && (buf[2] == 0x02) && (buf[3] == 0x1F) && (buf[4] != EOLMode))
{
EOLStep = 1;
}
else
{
EOLStep = 0;
EOLError = 0;
}
}
break;
case 1:
{
if((buf[1] == 0x50) && (buf[2] == 0x03))
{
EOLStep = 2;
EOLError = 0;
}
else
{
EOLError++;
}
}
break;
case 2:
{
if((buf[1] == 0x67) && (buf[2] == 0x01))
{
GetSeed = buf[3];
GetSeed = GetSeed << 8;
GetSeed |= buf[4];
GetSeed = GetSeed << 8;
GetSeed |= buf[5];
GetSeed = GetSeed << 8;
GetSeed |= buf[6];
EOLStep = 3;
EOLError = 0;
}
else
{
EOLError++;
}
}
break;
case 3:
{
if((buf[1] == 0x67) && (buf[2] == 0x02))
{
EOLStep = 4;
EOLError = 0;
}
else
{
EOLError++;
}
}
break;
case 4:
{
if((buf[1] == 0x6E) && (buf[2] == 0x02) && (buf[3] == 0x1F))
{
EOLStep = 5;
EOLError = 0;
}
else
{
EOLError++;
}
}
break;
case 5:
{
if((buf[1] == 0x51) && (buf[2] == 0x01))
{
EOLStep = 0;
EOLError = 0;
}
else
{
EOLError++;
}
}
break;
default:
{
EOLStep = 0;
EOLError = 0;
}
}
if(EOLError >= 5)
{
EOLStep = 0;
EOLError = 0;
}
}
void Service_10_03_Proc(void)
{
/*
CanMessageID18DA17F9.ID = 0x18DA17F9;
CanMessageID18DA17F9.ID_EN = 1;
CanMessageID18DA17F9.Length = 8;
CanMessageID18DA17F9.Msg[0] = 0x02;
CanMessageID18DA17F9.Msg[1] = 0x10;
CanMessageID18DA17F9.Msg[2] = 0x03;
*/
}
void Service_11_01_Proc(void)
{
/*
CanMessageID18DA17F9.ID = 0x18DA17F9;
CanMessageID18DA17F9.ID_EN = 1;
CanMessageID18DA17F9.Length = 8;
CanMessageID18DA17F9.Msg[0] = 0x02;
CanMessageID18DA17F9.Msg[1] = 0x11;
CanMessageID18DA17F9.Msg[2] = 0x01;
*/
}
void Service_22_Proc(void)
{
/*
CanMessageID18DA17F9.ID = 0x18DA17F9;
CanMessageID18DA17F9.ID_EN = 1;
CanMessageID18DA17F9.Length = 8;
CanMessageID18DA17F9.Msg[0] = 0x03;
CanMessageID18DA17F9.Msg[1] = 0x22;
CanMessageID18DA17F9.Msg[2] = 0x02;
CanMessageID18DA17F9.Msg[3] = 0x1F;
*/
}
void Service_27_01_Proc(void)
{
/*
CanMessageID18DA17F9.ID = 0x18DA17F9;
CanMessageID18DA17F9.ID_EN = 1;
CanMessageID18DA17F9.Length = 8;
CanMessageID18DA17F9.Msg[0] = 0x02;
CanMessageID18DA17F9.Msg[1] = 0x27;
CanMessageID18DA17F9.Msg[2] = 0x01;
*/
}
void Service_27_02_Proc(void)
{
/*
CanMessageID18DA17F9.ID = 0x18DA17F9;
CanMessageID18DA17F9.ID_EN = 1;
CanMessageID18DA17F9.Length = 8;
App_Uds_Calc_Key(GetSeed);
CanMessageID18DA17F9.Msg[0] = 0x06;
CanMessageID18DA17F9.Msg[1] = 0x27;
CanMessageID18DA17F9.Msg[2] = 0x02;
CanMessageID18DA17F9.Msg[3] = (unsigned char)(CalcKey >> 24);
CanMessageID18DA17F9.Msg[4] = (unsigned char)(CalcKey >> 16);
CanMessageID18DA17F9.Msg[5] = (unsigned char)(CalcKey >> 8);
CanMessageID18DA17F9.Msg[6] = (unsigned char)(CalcKey);
*/
}
void Service_2E_Proc(void)
{
/*
CanMessageID18DA17F9.ID = 0x18DA17F9;
CanMessageID18DA17F9.ID_EN = 1;
CanMessageID18DA17F9.Length = 8;
CanMessageID18DA17F9.Msg[0] = 0x04;
CanMessageID18DA17F9.Msg[1] = 0x2E;
CanMessageID18DA17F9.Msg[2] = 0x02;
CanMessageID18DA17F9.Msg[3] = 0x1F;
CanMessageID18DA17F9.Msg[4] = EOLMode;
*/
}
void UDS_Service_Main(void)
{
switch(EOLStep)
{
case 0:
{
Service_22_Proc();
}
break;
case 1:
{
Service_10_03_Proc();
}
break;
case 2:
{
Service_27_01_Proc();
}
break;
case 3:
{
Service_27_02_Proc();
}
break;
case 4:
{
Service_2E_Proc();
}
break;
case 5:
{
Service_11_01_Proc();
}
break;
default:
{
EOLStep = 0;
EOLError = 0;
}
}
}
\ No newline at end of file
#define GLOBALS_APP_SCI
#include "../App_Headers/includes.h"
/*-------------------------------------------------------------------------
* Function Name : App_SCI_Proc
* Description : 串口数据处理
* Input : None
* Output : None
* Return : None
* onther :
--------------------------------------------------------------------------*/
void App_SCI_Proc(void)
{
if(CarFlag.FlagBits.RS232RV_Full == Enable)
{
CarFlag.FlagBits.RS232RV_Full = Disable;
App_CopyRam((INT8U *)&SciFrame,(INT8U *)SCIRV,SCI_LEN);
if(SCIRV[2] == 1) //车速
{
SCIRV[0] = 0xeb;
SCIRV[1] = 0x90;
SCIRV[2] = 0x55;
SCIRV[3] = 0x01;
SCIRV[4] = 0x02;//上传
SCIRV[5] = 0x00;
SCIRV[6] = 0x21;
SCIRV[40] = App_CreateCheckSun((INT8U*)&SCIRV[7],SCIRV[2],33);
SCIRV[41] = 0x55;
SCIRV[42] = 0xaa;
Api_SCI_Trans_Bytes((INT8U *)SCIRV,43);
}
if(SCIRV[2] == 2) //转速
{
SCIRV[0] = 0xeb;
SCIRV[1] = 0x90;
SCIRV[2] = 0x55;
SCIRV[3] = 0x02;
SCIRV[4] = 0x02;//上传
SCIRV[5] = 0x00;
SCIRV[6] = 0x21;
SCIRV[40] = App_CreateCheckSun((INT8U*)&SCIRV[7],SCIRV[2],33);
SCIRV[41] = 0x55;
SCIRV[42] = 0xaa;
Api_SCI_Trans_Bytes((INT8U *)SCIRV,43);
}
if(SCIRV[2] == 3) //水温
{
SCIRV[0] = 0xeb;
SCIRV[1] = 0x90;
SCIRV[2] = 0x55;
SCIRV[3] = 0x03;
SCIRV[4] = 0x02;//上传
SCIRV[5] = 0x00;
SCIRV[6] = 0x21;
SCIRV[40] = App_CreateCheckSun((INT8U*)&SCIRV[7],SCIRV[2],33);
SCIRV[41] = 0x55;
SCIRV[42] = 0xaa;
Api_SCI_Trans_Bytes((INT8U *)SCIRV,43);
}
if(SCIRV[2] == 4) //燃油
{
SCIRV[0] = 0xeb;
SCIRV[1] = 0x90;
SCIRV[2] = 0x55;
SCIRV[3] = 0x04;
SCIRV[4] = 0x02;//上传
SCIRV[5] = 0x00;
SCIRV[6] = 0x21;
SCIRV[40] = App_CreateCheckSun((INT8U*)&SCIRV[7],SCIRV[2],33);
SCIRV[41] = 0x55;
SCIRV[42] = 0xaa;
Api_SCI_Trans_Bytes((INT8U *)SCIRV,43);
}
if(SCIRV[2] == 11) //速比
{
SCIRV[0] = 0xeb;
SCIRV[1] = 0x90;
SCIRV[2] = 0x55;
SCIRV[3] = 0x0b;
SCIRV[4] = 0x02;//上传
SCIRV[5] = 0x00;
SCIRV[6] = 0x21;
App_CopyRam((INT8U *)&SCIRV[7],(INT8U *)&Radio.VehRadio,6);
SCIRV[40] = App_CreateCheckSun((INT8U*)&SCIRV[7],SCIRV[2],33);
SCIRV[41] = 0x55;
SCIRV[42] = 0xaa;
Api_SCI_Trans_Bytes((INT8U *)SCIRV,43);
}
if(SCIRV[2] == 12) //电压
{
SCIRV[0] = 0xeb;
SCIRV[1] = 0x90;
SCIRV[2] = 0x55;
SCIRV[3] = 0x0c;
SCIRV[4] = 0x02;//上传
SCIRV[5] = 0x00;
SCIRV[6] = 0x21;
//Veh
SCIRV[7] = 0;//ADEveArry.TmpEven
SCIRV[8] = 0;
//Rev
SCIRV[9] = 0;
SCIRV[10] = 0;
//tmp
SCIRV[11] = 0;
SCIRV[12] = 0;
//fuel
SCIRV[13] = 0;
SCIRV[14] = 0;
SCIRV[40] = App_CreateCheckSun((INT8U*)&SCIRV[7],SCIRV[2],33);
SCIRV[41] = 0x55;
SCIRV[42] = 0xaa;
Api_SCI_Trans_Bytes((INT8U *)SCIRV,43);
}
if(SciFrame.Dir == DownLoad)
{
switch(SciFrame.Frame_Type)
{
case VehType:
check = App_CreateCheckSun((INT8U*)SciFrame.Frame_Data,SciFrame.Frame_Check,33);
if(check == SciFrame.Frame_CheckSun)
{
SCIRV[0] = 0xeb;
SCIRV[1] = 0x90;
SCIRV[2] = 0x01;
SCIRV[3] = 0x55;
SCIRV[4] = 0xaa;
Api_SCI_Trans_Bytes((INT8U *)SCIRV,5);
}
break;
case RevType:
check = App_CreateCheckSun((INT8U*)SciFrame.Frame_Data,SciFrame.Frame_Check,33);
if(check == SciFrame.Frame_CheckSun)
{
SCIRV[0] = 0xeb;
SCIRV[1] = 0x90;
SCIRV[2] = 0x02;
SCIRV[3] = 0x55;
SCIRV[4] = 0xaa;
Api_SCI_Trans_Bytes((INT8U *)SCIRV,5);
}
break;
case TmpType:
check = App_CreateCheckSun((INT8U*)SciFrame.Frame_Data,SciFrame.Frame_Check,33);
if(check == SciFrame.Frame_CheckSun)
{
SCIRV[0] = 0xeb;
SCIRV[1] = 0x90;
SCIRV[2] = 0x03;
SCIRV[3] = 0x55;
SCIRV[4] = 0xaa;
Api_SCI_Trans_Bytes((INT8U *)SCIRV,5);
}
break;
case FueType:
check = App_CreateCheckSun((INT8U*)SciFrame.Frame_Data,SciFrame.Frame_Check,33);
if(check == SciFrame.Frame_CheckSun)
{
SCIRV[0] = 0xeb;
SCIRV[1] = 0x90;
SCIRV[2] = 0x04;
SCIRV[3] = 0x55;
SCIRV[4] = 0xaa;
Api_SCI_Trans_Bytes((INT8U *)SCIRV,5);
}
break;
case RadioType:
check = App_CreateCheckSun((INT8U*)SciFrame.Frame_Data,SciFrame.Frame_Check,33);
if(check == SciFrame.Frame_CheckSun)
{
Radio.bFlag = SciFrame.Frame_Check;
App_CopyRam((INT8U *)&Radio.VehRadio,(INT8U *)&SciFrame.Frame_Data[0],2);
App_CopyRam((INT8U *)&Radio.VehNum,(INT8U *)&SciFrame.Frame_Data[2],2);
App_CopyRam((INT8U *)&Radio.RevRadio,(INT8U *)&SciFrame.Frame_Data[4],2);
Radio.bCheckSun = App_CreateCheckSun((INT8U*)&Radio.VehRadio,Radio.bFlag,6);
SCIRV[0] = 0xeb;
SCIRV[1] = 0x90;
SCIRV[2] = 0x0b;
SCIRV[3] = 0x55;
SCIRV[4] = 0xaa;
Api_SCI_Trans_Bytes((INT8U *)SCIRV,5);
_FEED_COP();
bReturn = Api_DFlashEraseSector(DFLASH_RADIO_ADDR);
bReturn = Api_DFalshProgram(DFLASH_RADIO_ADDR,PAGE_LEN,(INT16U*)&Radio);
}
break;
case AccType:
check = App_CreateCheckSun((INT8U*)SciFrame.Frame_Data,SciFrame.Frame_Check,33);
if(check == SciFrame.Frame_CheckSun)
{
}
break;
default:
;
}
}
SciFrame.Frame_Head[0] = null;
SciFrame.Frame_Data[0] = null;
SciFrame.Frame_Data[1] = null;
SciFrame.Frame_Type = null;
SciFrame.Dir = null;
SCIRV[4] = null;
}
}
\ No newline at end of file
#define GLOBALS_APP_TEST
#include "../App_Headers/includes.h"
#include "../Library/TimeCtrl.h"
#define STEP_MAX 34//
void All_Lamp_TurnOn(void);
void APP_Test_Init(void){
Key.StepAuto = null;
Key.CAN_Step = null;
Key.CAN_Step = null;
// CurValueStr[ENUM_BatteryCurrent].val = 0;
//CurValueStr[CoolTemp].val = 0;
//CurValueStr[VehSpeed].val = 0;
//CurValueStr[AD_Blue].val = 0;
// CurValueStr[ENUM_BatteryCurrent].fval = Value_Plus;
//CurValueStr[CoolTemp].fval = Value_Plus;
//CurValueStr[VehSpeed].fval = Value_Plus;
//CurValueStr[AD_Blue].fval = Value_Plus;
//CanMessageID18F00029.Msg[1] = 0x7D;
//LDW Open
//CanMessageID18FE5BE8.Msg[0] |= 0x40;
//FCW Open
// CanMessageID0CF02FA0.Msg[0] |= 0x03;
//AutoLwBm Open
// CanMessageID18FF0B21.Msg[5] |= 0x10;
EOLMode = 1;
EOLStep = 0;
EOLError = 0;
}
void APP_Button_Proc(void){
/*if(Key.PushTime_1 > T_3s){
Key.StepAuto = 1;
}
if(Key.PushTime_2 > T_3s){
Key.StepAuto = 2;
}*/
if((Key.PushTime_2 > T_2s) || (Key.PushTime_1 > T_2s)){
Key.StepAuto = 1;
}
if(pSB1 == 1){
if((Key.PushTime_1 > T_50ms) && (!Key.StepAuto)){
Key.CAN_Step++;
if(Key.CAN_Step > STEP_MAX){
Key.CAN_Step = 0;
}
}
Key.PushTime_1 = null;
}
if(pSB2 == 1){
if((Key.PushTime_2 > T_50ms) && (!Key.StepAuto)){
if(Key.CAN_Step > 0){
Key.CAN_Step--;
}else{
Key.CAN_Step = STEP_MAX;
}
}
Key.PushTime_2 = null;
}
}
#define TirePressure(value) CurValueStr[ENUM_TirePressure_LF].val = value; CurValueStr[ENUM_TirePressure_RF].val = value; CurValueStr[ENUM_TirePressure_LR].val = value; CurValueStr[ENUM_TirePressure_RR].val = value;
#define TireTemp(value) CurValueStr[ENUM_TireTemp_LF ].val = value; CurValueStr[ENUM_TireTemp_RF ].val = value; CurValueStr[ENUM_TireTemp_LR ].val = value; CurValueStr[ENUM_TireTemp_RR ].val = value;
void APP_ICM_Proc(void) /*zh321*/ /*FS04*/
{
switch(Key.CAN_Step)
{
case 1:
{
CurValueStr[ENUM_VSpeed ].val = 52;//
CurValueStr[ENUM_Water ].val = 58;
}break;
case 2:
{
CurValueStr[ENUM_VSpeed ].val = 108;//
CurValueStr[ENUM_Water ].val = 68;
}break;
case 3:
{
CurValueStr[ENUM_VSpeed ].val = 165;//
CurValueStr[ENUM_Water ].val = 85;
}break;
case 4:
{
CurValueStr[ENUM_VSpeed ].val = 222;//
CurValueStr[ENUM_Water ].val = 102;
}break;
case 5:
{
CurValueStr[ENUM_VSpeed ].val = 279;//
CurValueStr[ENUM_Water ].val = 115;
}break;
case 6:
{
CurValueStr[ENUM_VSpeed ].val = 335;//
CurValueStr[ENUM_Water ].val = 120;
}break;
case 7:
{
CurValueStr[ENUM_VSpeed ].val = 388;//
CurValueStr[ENUM_Water ].val = 140;
Bits_Operation(&CanMsg_385, 0, 6, 2, 1); //EDR
}break;
case 8:
{
CurValueStr[ENUM_VSpeed ].val = 440;//
Bits_Operation(&CanMsg_360, 0, 4, 2, 1); //GPFƵ
}break;
case 9:
{
CurValueStr[ENUM_VSpeed ].val = 500;//
Bits_Operation(&CanMsg_360, 0, 4, 2, 2);//GPF
}break;
default:
Key.CAN_Step = null;
break;
}
}
void Message_ClearDatas(CAN_message *Message, unsigned char StartByte, unsigned char StartBit, unsigned char len, unsigned char Format){
unsigned char pBit, pByte, i;
pBit = StartBit;
pByte = StartByte;
switch(Format){
case Motorola:{
for(i = 0; i < len; i++){
__RESET_WATCHDOG();
Message->Msg[pByte] &= ~(1 << pBit);
pBit++;
if(pBit >= 8){
pBit = 0;
if(pByte > 0){
pByte--;
}else{
break;
}
}
}
}break;
case Intel:{
for(i = 0; i < len; i++){
__RESET_WATCHDOG();
Message->Msg[pByte] &= ~(1 << pBit);
pBit++;
if(pBit >= 8){
pBit = 0;
if(pByte < 7){
pByte++;
}else{
break;
}
}
}
}break;
default:{
;
}
}
}
void Message_FillDatas(CAN_message *Message, unsigned char StartByte, unsigned char StartBit, unsigned char len, unsigned char Format, unsigned long MessageValue){
unsigned char pBit, pByte, i;
pBit = StartBit;
pByte = StartByte;
MessageValue = MessageValue << pBit;
switch(Format){
case Motorola:{
for(i = 0; i < len; i++){
__RESET_WATCHDOG();
Message->Msg[pByte] |= MessageValue & (1 << pBit);
pBit++;
if(pBit >= 8){
pBit = 0;
if(pByte > 0){
pByte--;
MessageValue = MessageValue >> 8;
}else{
break;
}
}
}
}break;
case Intel:{
for(i = 0; i < len; i++){
__RESET_WATCHDOG();
Message->Msg[pByte] |= MessageValue & (1 << pBit);
pBit++;
if(pBit >= 8){
pBit = 0;
if(pByte < 7){
pByte++;
MessageValue = MessageValue >> 8;
}else{
break;
}
}
}
}break;
default:{
;
}
}
}
void Message_Value_Calculate(s_CAN_List list)
{
CAN_message *CanMessage;
INT8U Start_Byte, Start_Bit, len, Offset_Flag, Format_Flag;
INT16U Offset, Factor_1, Factor_2, CurValue, Value_Flag;
INT32U temp;
INT32U Message_Clear;
INT8U Byte_Count;
INT8U i;
CanMessage = list.canMsg;
Start_Byte = list.StartByte;
Start_Bit = list.StartBit;
len = list.SignalLen;
Offset_Flag = list.fOffset;
Format_Flag = list.fFormat;
Offset = list.Offset;
Factor_1 = list.Factor_1;
Factor_2 = list.Factor_2;
CurValue = list.CurValue->val;
Value_Flag = list.CurValue->fval;
temp = CurValue;
//计算偏移??
if(Offset != 0){
if(Offset_Flag == Offset_Minus){
if(Value_Flag == Value_Minus){
if(temp > Offset){
temp = 0; //错误,所要实现的值小于物理最小�?
}else{
temp = Offset - temp;
}
}else if(Value_Flag == Value_Plus){
temp += Offset;
}else{;}
}else if(Offset_Flag == Offset_Plus){
if(temp < Offset){
temp = 0; //错误,所要实现的值小于物理最小�?
}else{
temp -= Offset;
}
}
}
temp = temp * Factor_1 / Factor_2;
//temp = temp << Start_Bit;
Byte_Count = len / 8;
if((len % 8) != 0){
Byte_Count += 1;
}
//清脏数据
Message_ClearDatas(CanMessage, Start_Byte, Start_Bit, len, Format_Flag);
Message_FillDatas(CanMessage, Start_Byte, Start_Bit, len, Format_Flag, temp);
}
void FT_VehSpeedCalc(unsigned char spd){
unsigned long wTemp;
wTemp = spd;
}
/*zh:*/
/*------------------------------------------------------------------------------------------------
* function name : Bits_Operation
* parameter value range : StartByte(0~7) StartBit(0~7) Length(1~8) Value(0~255)
* notice : Do not span bytes.
* author : zhouhang
* date :2022.01.18
--------------------------------------------------------------------------------------------------*/
void Bits_Operation(CAN_message *Message, unsigned char StartByte, unsigned char StartBit, unsigned char Length, unsigned char Value) /*Do not span bytes*/
{
unsigned char i;
for (i = 0; i < Length; i++)
{
Message->Msg[StartByte] &= (~(1 << (i + StartBit)));
}
Message->Msg[StartByte] |= (Value << StartBit);
}
/*:zh*/
void All_Lamp_TurnOn(void)
{
;
}
\ No newline at end of file
#define GLOBALS_GUI_DISP
#include "../App_Headers/includes.h"
#include "../App_Headers/includes.h"
extern void _Startup(void); //ں
#ifndef VECTF
#define VECTF ( void ( *const near )( ) )
#endif
static interrupt void DummyISR(void)
{
for(;;);
}
#ifndef VECTF
#define VECTF ( void ( *const near )( ) )
#endif
//INTERRUPT VECTORS TABLE
#pragma CONST_SEG VECTORS_DATA
void near ( * const near _vectab[] )( ) =
{
VECTF DummyISR, //Spurious interrupt
VECTF DummyISR, //Reserved
VECTF DummyISR, //ATD Compare Interrupt
VECTF DummyISR, //High Temperature Interrupt
VECTF DummyISR, //Autonomous periodical interrupt (API)
VECTF DummyISR, //Low-voltage interrupt (LVI)
VECTF DummyISR, //PWM emergency shutdown
VECTF DummyISR, //Port T
VECTF DummyISR, //Reserved
VECTF DummyISR, //Reserved
VECTF DummyISR, //Reserved
VECTF Api_Motor_isr, //Motor Control Timer Overflow
VECTF DummyISR, //Reserved
VECTF DummyISR, //TIM1 Pulse accumulator input edge
VECTF DummyISR, //TIM1 Pulse accumulator A overflow
VECTF DummyISR, //TIM1 timer overflow
VECTF DummyISR, //TIM1 timer channel 7
VECTF DummyISR, //TIM1 timer channel 6
VECTF DummyISR, //TIM1 timer channel 5
VECTF DummyISR, //TIM1 timer channel 4
VECTF DummyISR, //TIM1 timer channel 3
VECTF DummyISR, //TIM1 timer channel 2
VECTF DummyISR, //TIM1 timer channel 1
VECTF DummyISR, //TIM1 timer channel 0
VECTF DummyISR, //CAN transmit
VECTF Api_CAN_Rev_isr, //CAN receive
VECTF DummyISR, //CAN errors
VECTF DummyISR, //CAN wake-up
VECTF DummyISR, //FLASH
VECTF DummyISR, //FLASH Fault Detect
VECTF DummyISR, //Reserved
VECTF DummyISR, //Reserved
VECTF DummyISR, //IIC bus
VECTF DummyISR, //Reserved
VECTF DummyISR, //Reserved
VECTF DummyISR, //CPMU PLL lock
VECTF DummyISR, //CPMU Oscillator Noise
VECTF DummyISR, //Port S
VECTF DummyISR, //Port R
VECTF DummyISR, //Port AD
VECTF DummyISR, //Reserved
VECTF DummyISR, //ATD
VECTF DummyISR, //Reserved
VECTF Api_SCI_Rev_isr,//SCI
VECTF DummyISR, //SPI
VECTF DummyISR, //TIM0 Pulse accumulator input edge
VECTF DummyISR, //TIM0 Pulse accumulator A overflow
VECTF Api_Timer0_isr, //TIM0 timer overflow Api_Timer0_isr
VECTF DummyISR, //TIM0 timer channel 7
VECTF DummyISR, //TIM0 timer channel 6
VECTF DummyISR, //TIM0 timer channel 5
VECTF DummyISR, //TIM0 timer channel 4
VECTF DummyISR, //TIM0 timer channel 3
VECTF DummyISR, //TIM0 timer channel 2
VECTF DummyISR, //TIM0 timer channel 1
VECTF DummyISR, //TIM0 timer channel 0
VECTF Api_RTC_isr, //Real time interrupt
VECTF DummyISR, //IRQ
VECTF DummyISR, //XIRQ
VECTF DummyISR, //SWI
VECTF DummyISR, //Unimplemented instruction trap
VECTF DummyISR, //COP watchdog reset
VECTF DummyISR, //Clock monitor reset
VECTF _Startup, // 0xFFFE: Reset
};
#pragma CONST_SEG DEFAULT
#ifdef GLOBALS_API_ATD
#define EXTERN_API_ATD
#else
#define EXTERN_API_ATD extern
#endif
#ifndef API_ATD_H_
#define API_ATD_H_
#define CHNAL1 1
#define CHNAL2 2
#define CHNAL3 3
#define SMP_TIME 0
#define SMP_PRE 16
EXTERN_API_ATD INT8U ADCH_SEL;
EXTERN_API_ATD INT16U ATD_Time;
EXTERN_API_ATD INT16U ATD_T3s;
EXTERN_API_ATD void API_ATD_init(void);
EXTERN_API_ATD void API_GetSensorAD(void);
#endif /* API_ATD_H_ */
#ifdef GLOBALS_API_CAN
#define EXTERN_API_CAN
#else
#define EXTERN_API_CAN extern
#endif
#ifndef API_CAN_H_
#define API_CAN_H_
#define SJW_1Tq 0
#define SJW_2Tq 1
#define SJW_3Tq 2
#define SAMP_1 0
#define Seg1_11Tq 10
#define Seg1_12Tq 11
#define Seg1_8Tq 7
#define Seg2_7Tq 6
#define Seg2_8Tq 7
#define Seg1_4Tq 3
#define Seg1_5Tq 4
#define Seg1_6Tq 5
#define Seg2_1Tq 0
#define Seg2_2Tq 1
#define Seg2_3Tq 2
#define Seg2_4Tq 3
#define IDAM_2_32Bit 0
#define IDAM_4_16Bit 1
#define IDHIT0 0
#define empoty 0
#define msg_full 1
#define bit0_mask 1
#define bit1_mask 2
#define bit2_mask 4
#define bit3_mask 8
#define bit4_mask 16
#define bit5_mask 32
#define bit6_mask 64
#define bit7_mask 128
//ºê¶¨Òå
#define GET_EXTPGN(id) (((((((INT32U)id&0xFF0000)>>16) >= 0xF0)?((INT32U)id & 0x00FF00):0)|((INT32U)id & 0x2FF0000)) >> 8)
#define ID138 0x138
#define success 1
#define failt 0
EXTERN_API_CAN void Api_CAN_Init(void);
EXTERN_API_CAN INT16U Api_GET_STAND_ID(INT8U *IDR0_Add);
EXTERN_API_CAN interrupt void Api_CAN_Rev_isr(void);
EXTERN_API_CAN INT8U Api_CANSendFrame(CAN_message * CanMessage);
#endif /* API_CAN_H_ */
#ifdef GLOBALS_API_DFLASH
#define EXTERN_API_DFLASH
#else
#define EXTERN_API_DFLASH extern
#endif
#ifndef API_DFLASH_H_
#define API_DFLASH_H_
#define MaxDFlashCommandCounter 0x06
#define MaxDelayTime BusClock
#define RunComplete 0
#define RunErr 1
#define RunParameterErr 2
#define RunOverTimeErr 3
#define RunErrACCERR 4
#define RunErrFPVIOL 5
#define RunErrMGSTAT1 6
#define RunErrMGSTAT0 7
#define RunErr 1
#define WordSize 0x02
//字大小
#define GLOBAL_ADDRESS_DFLASH 0x0000
//D Flash全局地址[17:16]
#define DFLASH_BLOCK_START_ADDR 0x004400
// D Flash 起始地址
#define DFLASH_VEH_ADDR DFLASH_BLOCK_START_ADDR
#define DFLASH_REV_ADDR DFLASH_VEH_ADDR + 256
#define DFLASH_TMP_ADDR DFLASH_REV_ADDR + 256
#define DFLASH_FUEL_ADDR DFLASH_TMP_ADDR + 256
#define DFLASH_RADIO_ADDR DFLASH_FUEL_ADDR + 256
#define DFLASH_SERKM_ADDR DFLASH_RADIO_ADDR + 256
#define DFLASH_POWER_ADDR DFLASH_SERKM_ADDR + 256
#define DFLASH_BLOCK_END_ADDR 0x0053FF
// D Flash 结束地址
#define DFLASH_SECTOR_SIZE 0x0100
// 256 字节数
#define DFLASH_ACC_START_ADD 0x004C00
//D-Falsh里程累计起始地址
#define DFLASH_ACC_END_ADD 0x004FFF
//D-Flash里程累计结束地址
#define DFLASH_MAXIMUM_SIZE 0x00001000
//D Flash 最大尺寸 4 KB
#define DFLASH_ERASE_VERIFY 0x10
//D Flash 擦除验证命令
#define DFLASH_PROGRAM 0x11
//D Falsh 编程命令
#define DFLASH_ERASE_SECTOR 0x12
//D Flash 擦除命令
#define DFLASH_ERASE_COM_LENGTH 0x01
//D Flash 擦除命令长度
#define DFLASH_ERASE_VERIFY_COM_LENGTH 0x02
//D Flash 擦除检验命令长度
#define DFLASH_PROGRAM_COM_LENGTH 0x04
//D Flash 最大编程字节长度
#define MaxProgramByteNumber 0x08
//最大编程字节数
#define DFlashAccSectorEndAdd 0x004F00
#define DflashAccSectorStartAdd 0x004C00
#define DFLASH_PROGRAM_OFFSET 0x4000
#define DFlashAccReadStartAdd (DFLASH_ACC_START_ADD - DFLASH_PROGRAM_OFFSET)
#define DFlashAccReadEndAdd (DFLASH_ACC_END_ADD - DFLASH_PROGRAM_OFFSET)
#define DFlashAccBlockNumber ((DFLASH_ACC_END_ADD - DFLASH_ACC_START_ADD + 1) / DFlashAccBlockLength)
EXTERN_API_DFLASH void Api_Flash_Init(void);
EXTERN_API_DFLASH INT8U Api_Flash_byte_read(INT16U _addr);
EXTERN_API_DFLASH INT8U Api_DFlashCommSequence(INT8U bCommandCounter);
EXTERN_API_DFLASH INT8U Api_DFlashEraseSector(INT16U wDestination);
EXTERN_API_DFLASH INT8U Api_DFalshProgram(INT16U wDest,INT16U wByteNub,INT16U *wSource);
EXTERN_API_DFLASH INT8U Api_DFlashEraseVerify(INT16U wDestination, INT16U wSize);
#endif /* API_DFLASH_H_ */
/*
* API_Device_Init.h
*
* Created on: 2012-3-27
* Author: arno.qi
*/
#ifdef GLOBALS_API_DEV
#define EXTERN_API_DEV
#else
#define EXTERN_API_DEV extern
#endif
#ifndef API_DEVICE_INIT_H_
#define API_DEVICE_INIT_H_
#define NormalChip 0x80
#define SpecialChip 0x00
#define InitDIRECT 0
#define InitIVBR 0xFF
#define InitCPMUPROT 0x26
#define InitCPMUCLKS 0x87
#define InitCPMUREFDIV 0x40
#define InitCPMUSYNR 0x47 //0X47 4M; 8M 0X43
#define InitCPMUPOSTDIV 0x00
#define InitCPMUPLL 0
#define InitPUCR 0x40
#define InitCPMUCOP 0x07
#define Enable 1
#define Disable 0
#define WaitRun 0
#define null 0
#define one 1
#define ClearFlag 1
#define clear 0
#define True 1
#define false 0
#define PushDown 0
#define UpSpring 1
#define BusClock 32000000 //16777216
#define SafetyVeh 10 *64
#define Prio1 1
#define Prio2 2
#define Prio3 3
#define Prio4 4
#define Prio5 5
#define Prio6 6
#define Prio7 7
#define PushDown 0
#define UpSpring 1
#define Auto 1
#define pSTB PTP_PTP1
/*#define pSBRInput PT1AD_PT1AD2 //Êó±ê-
#define pSBLInput PT1AD_PT1AD1 //Êó±ê+
#define P22_V7_BY1 PTV_PTV7
#define P21_V6_BY2 PTV_PTV6
#define P20_V5_OMID PTV_PTV5
#define P19_V4_OFUll PTV_PTV4
#define P16_V3_OPOW PTV_PTV3
#define P15_V2_OP1 PTV_PTV2
#define P14_V1_OP2 PTV_PTV1
#define P13_V0_OP3 PTV_PTV0
#define P12_U7_OP4 PTU_PTU7
#define P11_U6_OP5 PTU_PTU6
#define P10_U5_OP6 PTU_PTU5
#define P9_U4_ON1 PTU_PTU4
#define P6_U3_ON2 PTU_PTU3
#define P5_U2_ON3 PTU_PTU2
#define P99_AD6_ON4 PT1AD_PT1AD6
#define P98_AD5_ON5 PT1AD_PT1AD5
#define P97_AD4_ON6 PT1AD_PT1AD4
#define P96_AD3_IPOW PT1AD_PT1AD3*/
/*******************************************************
* INPUT
*******************************************************/
#define pSB1 PT1AD_PT1AD1
#define pSB2 PT1AD_PT1AD2
#define LED_P1 1
#define LED_P2 2
#define LED_P3 3
#define LED_P4 4
#define LED_P5 5
#define LED_P6 6
#define Full 7
#define Mid 8
#define LED_N1 11
#define LED_N2 12
#define LED_N3 13
#define LED_N4 14
#define LED_N5 15
#define LED_N6 16
#define LED_all 20
EXTERN_API_DEV void Api_Sys_Init(void);
EXTERN_API_DEV void Api_Clock_Init(void);
EXTERN_API_DEV void Api_IO_init(void);
#endif /* API_DEVICE_INIT_H_ */
#ifdef GLOBALS_API_LCD
#define EXTERN_API_LCD
const INT8U Matrix1[]=
{
//0 1 2 3 4 5 6 7 8 9
0xd7,0x06,0xe3,0xa7,0x36,0xb5,0xf5,0x07,0xf7,0xb7
};
const INT8U Matrix2[]=
{
//0 1 2 3 4 5 6 7 8 9
0xeb,0x0a,0xc7,0x8f,0x2e,0xad,0xed,0x0b,0xef,0xaf
};
const INT8U Matrix3[]=
{
//0 1 2 3 4 5 6 7 8 9
0x5f,0x06,0x6b,0x2f,0x36,0x3d,0x7d,0x07,0x7f,0x3f
};
#else
#define EXTERN_API_LCD extern
#endif
#ifndef API_LCD_H_
#define API_LCD_H_
#define Duty4 0 // 1/2 Duty
#define IRCCLK_1M 1 // IRCCLK 1M
EXTERN_API_LCD void Api_LCD_Init(void);
EXTERN_API_LCD void Api_LCD_Display(void);
#endif /* API_LCD_H_ */
#ifdef GLOBALS_API_RTC
#define EXTERN_API_RTC
#else
#define EXTERN_API_RTC extern
#endif
#ifndef API_RTC_H_
#define API_RTC_H_
#define T_1ms 1
#define T_10ms 10*T_1ms
#define T_20ms 20*T_1ms
#define T_25ms 25*T_1ms
#define T_50ms 50
#define T_100ms 100
#define T_1s 10*T_100ms
#define T_200ms 2*T_100ms
#define T_300ms 3*T_100ms
#define T_400ms 4*T_100ms
#define T_500ms 5*T_100ms
#define T_600ms 6*T_100ms
#define T_700ms 7*T_100ms
#define T_800ms 8*T_100ms
#define T_2s 2*T_1s
#define T_3s 3*T_1s
#define T_3_5s 3*T_1s
#define T_4s 4*T_1s
#define T_5s 5*T_1s
#define T_6s 6*T_1s
#define T_2_5s 2*T_1s
#define T_8s 8*T_1s
#define T_9s 9*T_1s
#define T_10s 10*T_1s
EXTERN_API_RTC interrupt void Api_RTC_isr(void);
EXTERN_API_RTC void Api_SetTimer7(INT16U Second,ClockType *T);
EXTERN_API_RTC INT8U Api_TimerOver7(ClockType *T);
EXTERN_API_RTC void Api_SetTimer6(INT16U Second,ClockType *T);
EXTERN_API_RTC INT8U Api_TimerOver6(ClockType *T);
EXTERN_API_RTC void Api_SetTimer5(INT16U Second,ClockType *T);
EXTERN_API_RTC INT8U Api_TimerOver5(ClockType *T);
EXTERN_API_RTC void Api_SetTimer4(INT16U Second,ClockType *T);
EXTERN_API_RTC INT8U Api_TimerOver4(ClockType *T);
EXTERN_API_RTC void Api_SetTimer3(INT16U Second,ClockType *T);
EXTERN_API_RTC INT8U Api_TimerOver3(ClockType *T);
EXTERN_API_RTC void Api_SetTimer2(INT16U Second,ClockType *T);
EXTERN_API_RTC INT8U Api_TimerOver2(ClockType *T);
EXTERN_API_RTC void Api_SetTimer1(INT16U Second,ClockType *T);
EXTERN_API_RTC INT8U Api_TimerOver1(ClockType *T);
EXTERN_API_RTC void Api_SetTimer0(INT16U Second,ClockType *T);
EXTERN_API_RTC INT8U Api_TimerOver0(ClockType *T);
EXTERN_API_RTC void Api_SetAutoTimer(INT16U Second,ClockType *T);
EXTERN_API_RTC INT8U Api_AutoTimerOver(ClockType *T);
#endif /* API_RTC_H_ */
\ No newline at end of file
#ifdef GLOBALS_API_SCI
#define EXTERN_API_SCI
#else
#define EXTERN_API_SCI extern
#endif
#ifndef API_SCI_H_
#define API_SCI_H_
#define CH1 1
#define CH2 2
#define baud_9600 208
#define baud_19200 104
#define baud_38400 52
#define baud_115200 17
#define div4 3
EXTERN_API_SCI void Api_SCI_Init(void);
EXTERN_API_SCI void Api_SCI_Trans_Byte(INT8U data);
EXTERN_API_SCI void Api_SCI_Trans_Bytes(INT8U *pStr, INT8U length);
EXTERN_API_SCI interrupt void Api_SCI_Rev_isr(void);
#endif /* API_SCI_H_ */
\ No newline at end of file
#ifdef GLOBALS_API_TPM
#define EXTERN_API_TPM
#else
#define EXTERN_API_TPM extern
#endif
#ifndef API_TPM_H_
#define API_TPM_H_
#define TPM_DIV4 2
#define TPM_DIV2 1
#define TPM_DIV1 0
#define TPM_DIV128 7
#define TT_10ms 5
#define TT_15ms 7
#define TT_30ms TT_15ms *2
#define TT_100ms 49
#define TT_200ms 96
#define TT_120ms 58
#define TT_180ms 87
#define TT_240ms 117
#define TT_250ms 122
#define TT_340ms 165
#define TT_500ms TT_100ms *5
#define TT_750ms 367
#define TT_1s 490
#define TT_1_5s 735
#define TT_2s 980
#define TT_2_5s 1225
#define TT_3s 1465
#define TT_6s 2930
#define TT_8s 3186
EXTERN_API_TPM void Api_Timer0_Init(INT8U TPM_DIV);
EXTERN_API_TPM void Api_Timer1_Init(INT8U TPM_DIV);
EXTERN_API_TPM void Api_Motor_Init(void);
EXTERN_API_TPM interrupt void Api_Timer0_isr(void);
EXTERN_API_TPM interrupt void API_Timer1_isr(void);
EXTERN_API_TPM interrupt void Api_Motor_isr(void);
#endif /* API_TPM_H_ */
#ifdef GLOBALS_APP_CAN
#define EXTERN_APP_CAN
#else
#define EXTERN_APP_CAN extern
#endif
#ifndef APP_CAN_H_
#define APP_CAN_H_
EXTERN_APP_CAN void Format_CAN_Msg();
EXTERN_APP_CAN void App_Msg_Copy(CAN_message * CanMessage,INT16U* data);
EXTERN_APP_CAN void App_Can_Proc(void);
EXTERN_APP_CAN void Set_CAN_CRC(CAN_message * CanMessage);
EXTERN_APP_CAN void Disable_CAN_Tx(void);
#endif /* APP_CAN_H_ */
\ No newline at end of file
#ifdef GLOBALS_APP_DFLASH
#define EXTERN_APP_DFLASH
#else
#define EXTERN_APP_DFLASH extern
#endif
#ifndef APP_DFLASH_H_
#define APP_DFLASH_H_
#define AccDataFlag 0x55
#define PAGE_LEN 256
#define WaitOverTime 50000
EXTERN_APP_DFLASH void App_CopyRam(INT8U *Dp,INT8U *Sp,INT8U Nub);
EXTERN_APP_DFLASH void App_Read_EE_Memory(INT16U ReadAddr,INT8U *DestStr,INT16U len);
#endif /* APP_DFLASH_H_ */
\ No newline at end of file
/*
* APP_Data_Process.h
*
* Created on: 2012-3-27
* Author: qitiancun
*/
#ifdef GLOBALS_APP_PROCESS
#define EXTERN_APP_PROCESS
#else
#define EXTERN_APP_PROCESS extern
#endif
#ifndef APP_DATA_PROCESS_H_
#define APP_DATA_PROCESS_H_
#define CheckFlag 0x55
EXTERN_APP_PROCESS void App_Load_Data(void);
EXTERN_APP_PROCESS void App_State_Init(void);
EXTERN_APP_PROCESS INT8U App_CreateCheckSun(INT8U *pData,INT8U checkbyte,INT8U len);
EXTERN_APP_PROCESS void UDS_Receive_Main(unsigned char *buf);
EXTERN_APP_PROCESS void UDS_Service_Main(void);
#endif /* APP_DATA_PROCESS_H_ */
#ifdef GLOBALS_APP_SCI
#define EXTERN_APP_SCI
#else
#define EXTERN_APP_SCI extern
#endif
#ifndef APP_SCI_H_
#define APP_SCI_H_
#define VehType 1
#define RevType 2
#define TmpType 3
#define FueType 4
#define VehStepType 5
#define RevStepType 6
#define TmpStepType 7
#define FuelStepType 8
#define RadioType 11
#define AccType 13
#define PowerType 14
#define SerType 15
#define DownLoad 1
#define UpLoad 2
#define SCI_LEN 43
EXTERN_APP_SCI void App_SCI_Proc(void);
#endif /* APP_SCI_H_ */
\ No newline at end of file
#ifdef GLOBALS_APP_TEST
#define EXTERN_APP_TEST
#else
#define EXTERN_APP_TEST extern
#endif
#ifndef APP_TEDT_H_
#define APP_TEDT_H_
#define Motorola 0
#define Intel 1
#define Offset_Minus 0
#define Offset_Plus 1
#define Value_Minus 0
#define Value_Plus 1
typedef struct{
unsigned int val;
unsigned char fval;
}s_CurValue;
typedef struct{
CAN_message *canMsg;
unsigned char StartByte;
unsigned char StartBit;
unsigned char SignalLen;
unsigned int Offset;
unsigned char fOffset;
unsigned int Factor_1;/*Denominator of Resolution*/ /*精度的分母*/
unsigned int Factor_2;/*Numerator of Resolution*/ /*精度的分子*/
s_CurValue *CurValue;
unsigned char fFormat;
}s_CAN_List;
enum
{
ENUM_VSpeed = 0,//车速
ENUM_Water ,
CAN_List_Num ,
};
EXTERN_APP_TEST volatile s_CurValue CurValueStr[CAN_List_Num];
static const s_CAN_List CAN_List[] =
{
{&CanMsg_330, 1, 0, 13, 0, Offset_Plus , 100000, 5625, &CurValueStr[ENUM_VSpeed ], Motorola},
{&CanMsg_360, 1, 0, 8, 48, Offset_Minus, 100, 75, &CurValueStr[ENUM_Water ], Motorola},
};
EXTERN_APP_TEST void APP_Button_Proc(void);
EXTERN_APP_TEST void Message_Value_Calculate(s_CAN_List list);
void Bits_Operation(CAN_message *Message, unsigned char StartByte, unsigned char StartBit, unsigned char Length, unsigned char Value); /*Do not span bytes*/
#endif /* API_CAN_H_ */
/*
* GUI_Display.h
*
* Created on: 2012-3-27
* Author: arno.qi
*/
#ifdef GLOBALS_GUI_DISP
#define EXTERN_GUI_DISP
#else
#define EXTERN_GUI_DISP extern
#endif
#ifndef GUI_DISP_H_
#define GUI_DISP_H_
#endif /* GUI_DISP_H_ */
\ No newline at end of file
#ifdef GLOBALS_VARIABLE
#define EXTERN_VAR
#else
#define EXTERN_VAR extern
#endif
#ifndef GLOBALS_VAR_H_
#define GLOBALS_VAR_H_
EXTERN_VAR INT8U Flash_1Hz;
EXTERN_VAR volatile INT8U SCIRV[43];
EXTERN_VAR volatile INT8U bReturn;
EXTERN_VAR volatile INT16U FlashCommandArray[MaxDFlashCommandCounter];
EXTERN_VAR volatile ClockType Clock;
EXTERN_VAR volatile INT8U rvcnt;
EXTERN_VAR volatile CarFlagType CarFlag;
EXTERN_VAR volatile INT16U BusOffTime;
/*EXTERN_VAR volatile CanMsg Msg;
EXTERN_VAR volatile CanMsg Msg1;
EXTERN_VAR volatile CanMsg Msg2;*/
EXTERN_VAR volatile TwoINT8U TwoByte;
EXTERN_VAR volatile EcuType Ecu;
EXTERN_VAR volatile SciFrameType SciFrame;
EXTERN_VAR volatile RadioMeter Radio;
EXTERN_VAR volatile INT32U wTemp;
EXTERN_VAR volatile INT8U check;
EXTERN_VAR volatile INT16U VehFre;
EXTERN_VAR volatile INT8U RunStep;
EXTERN_VAR volatile KeyType Key;
EXTERN_VAR volatile INT8U step_cycle;
EXTERN_VAR volatile INT8U LCDFP4BP;
EXTERN_VAR volatile INT8U LCDFP5BP;
EXTERN_VAR volatile INT8U LCDFP6BP;
EXTERN_VAR volatile INT8U LCDFP7BP;
EXTERN_VAR volatile INT8U LCDFP8BP;
EXTERN_VAR volatile INT8U LCDFP9BP;
EXTERN_VAR volatile INT8U LCDFP10BP;
EXTERN_VAR volatile INT8U LCDFP11BP;
EXTERN_VAR volatile INT8U LCDFP12BP;
EXTERN_VAR volatile INT8U LCDFP13BP;
EXTERN_VAR volatile INT8U LCDFP14BP;
EXTERN_VAR volatile INT8U LCDFP15BP;
EXTERN_VAR volatile INT8U LCDFP16BP;
EXTERN_VAR volatile INT8U LCDFP17BP;
EXTERN_VAR volatile INT8U LCDFP18BP;
EXTERN_VAR volatile INT8U LCDFP19BP;
EXTERN_VAR volatile INT8U LCDFP20BP;
EXTERN_VAR volatile INT8U LCDFP21BP;
EXTERN_VAR volatile INT8U LCDFP22BP;
EXTERN_VAR volatile INT32U TEST;
/*EXTERN_VAR CAN_message CanMessageID092; //10
EXTERN_VAR CAN_message CanMessageID0A0; //50
EXTERN_VAR CAN_message CanMessageID0A1; //10
EXTERN_VAR CAN_message CanMessageID0A4; //20
EXTERN_VAR CAN_message CanMessageID100; //100
EXTERN_VAR CAN_message CanMessageID102; //100
EXTERN_VAR CAN_message CanMessageID104; //25
EXTERN_VAR CAN_message CanMessageID108; //100
EXTERN_VAR CAN_message CanMessageID10A; //100
EXTERN_VAR CAN_message CanMessageID112; //100
EXTERN_VAR CAN_message CanMessageID116; //100
EXTERN_VAR CAN_message CanMessageID139; //10
EXTERN_VAR CAN_message CanMessageID141; //10
EXTERN_VAR CAN_message CanMessageID144; //10
EXTERN_VAR CAN_message CanMessageID2F1; //50
EXTERN_VAR CAN_message CanMessageID150; //event
EXTERN_VAR CAN_message CanMessageID200; //100
EXTERN_VAR CAN_message CanMessageID290; //60
EXTERN_VAR CAN_message CanMessageID294; //event
EXTERN_VAR CAN_message CanMessageID2F0; //1000
EXTERN_VAR CAN_message CanMessageID316; //50
EXTERN_VAR CAN_message CanMessageID3EF; //1000
EXTERN_VAR CAN_message CanMessageID0B2; //10
EXTERN_VAR CAN_message CanMessageID10E; //100
EXTERN_VAR CAN_message CanMessageID071; //event
EXTERN_VAR CAN_message CanMessageID220; //100
EXTERN_VAR CAN_message CanMessageID20A; //100
EXTERN_VAR CAN_message CanMessageID387; //100
EXTERN_VAR CAN_message CanMessageID206; //100*/
/*EXTERN_VAR CAN_message CanMessageID0CF80AF0;
EXTERN_VAR CAN_message CanMessageID0CF80BF0;
EXTERN_VAR CAN_message CanMessageID0CF814F3;
EXTERN_VAR CAN_message CanMessageID18F815F3;
EXTERN_VAR CAN_message CanMessageID18F816F3;
EXTERN_VAR CAN_message CanMessageID0CF81EA7;
EXTERN_VAR CAN_message CanMessageID0CF81FA7;
EXTERN_VAR CAN_message CanMessageID18F820A7;
EXTERN_VAR CAN_message CanMessageID18F8058F;
EXTERN_VAR CAN_message CanMessageID18F8068F;*/
/*zh:*/
/*CS08 test*/
EXTERN_VAR CAN_message CanMessageID0CFF7F03;
EXTERN_VAR CAN_message CanMsg_330;
EXTERN_VAR CAN_message CanMsg_360;
EXTERN_VAR CAN_message CanMsg_385;
extern CAN_message CanMsg_330;
extern CAN_message CanMsg_360;
extern CAN_message CanMsg_385;
/**/
/*:zh*/
EXTERN_VAR Max_Page MaxPage;
EXTERN_VAR INT8U Auto_First;
EXTERN_VAR INT8U RT_10ms_En;
EXTERN_VAR INT8U RT_20ms_En;
EXTERN_VAR INT8U RT_25ms_En;
EXTERN_VAR INT8U RT_50ms_En;
EXTERN_VAR INT8U RT_60ms_En;
EXTERN_VAR INT8U RT_100ms_En;
EXTERN_VAR INT8U RT_200ms_En;
EXTERN_VAR INT8U RT_500ms_En;
EXTERN_VAR INT8U RT_1s_En;
EXTERN_VAR INT8U CurVehSpeed;
EXTERN_VAR volatile INT32U seed1;
EXTERN_VAR volatile INT32U seed2;
EXTERN_VAR volatile INT32U seed3;
EXTERN_VAR volatile INT32U seed4;
EXTERN_VAR volatile INT32U dwSeed1;
EXTERN_VAR volatile INT32U dwSeed2;
EXTERN_VAR volatile INT32U dwSeed3;
EXTERN_VAR volatile INT32U dwSeed4;
EXTERN_VAR volatile INT32U dwKey1;
EXTERN_VAR volatile INT32U dwKey2;
EXTERN_VAR volatile INT32U dwKey3;
EXTERN_VAR volatile INT32U dwKey4;
EXTERN_VAR volatile INT32U aaaa;
EXTERN_VAR volatile INT32U bbbb;
EXTERN_VAR volatile INT32U cccc;
EXTERN_VAR volatile INT32U dddd;
EXTERN_VAR volatile INT32U CalcKey;
EXTERN_VAR volatile INT32U GetSeed;
EXTERN_VAR volatile INT8U EOLMode;
EXTERN_VAR volatile INT8U EOLStep;
EXTERN_VAR volatile INT8U EOLError;
#endif /* GLOBALS_VAR_H_ */
/*
* Var_Type.h
*
* Created on: 2012-3-23
* Author: qitiancun
*/
#ifndef VAR_TYPE_H_
#define VAR_TYPE_H_
#define ADEveLen 10
typedef unsigned char INT8U;
typedef volatile unsigned char VINT8U;
typedef unsigned int INT16U;
typedef volatile unsigned int VINT16U;
typedef unsigned long INT32U;
typedef struct
{
INT8U ProceF; //处理标志位
INT32U id;
INT8U Len;
INT8U Data[8];
}CanMsg;
typedef union
{
struct
{
//1 word
INT32U EngRunAtv :1;
INT32U EngSpdStat:2;
INT32U EngCltTmpV:1;
INT32U EngCltTmp :1;
INT32U FlLvlPctV :1;
INT32U VehSpdAvgDrvnV :1;
INT32U ABSAtv :1;
INT32U ABSMlfIO :1;
INT32U EBDMlfIO :1;
INT32U IgnKyInstAtv :1;
INT32U IgnKyPstn :2;
INT32U HhBmIO :1;
INT32U LwBmIO :1;
INT32U FtFgLtIO :1;
//2 word
INT32U PnLgtAtv :1;
INT32U RrFgLtIO :1;
INT32U RtTrnLmpAtv :1;
INT32U LftTrnLmpAtv :1;
INT32U TDLckSwAtv :1;
INT32U RSDOpnSwAtv :1;
INT32U PDOpnSwAtv :1;
INT32U DDOpnSwAtv :1;
INT32U EPSIO :1;
INT32U NetCtlKeep :1;
INT32U NetDataKeep :1;
INT32U CanDataSend:1;
INT32U Reserved2:1;
INT32U Reserved3:1;
INT32U Reserved4:1;
INT32U Reserved5:1;
//3 word
INT32U MotorReset:1;
INT32U MotorInit:1;
INT32U Safety:1;
INT32U RunStar :1;
INT32U TmpFlash:1;
INT32U CanState:1;
INT32U Led:1;
INT32U DoorOpen:1;
INT32U KeyEn:1;
INT32U LampEn:1;
INT32U AccKmValid:1;
INT32U Perilous:1; //危险信号
INT32U RS232RV_Full:1;
INT32U ClearAcc:1;
INT32U Reserved20:1;
INT32U Reserved21:1;
//4 word
INT32U Reserved22:1;
INT32U Reserved23:1;
INT32U Reserved24:1;
INT32U Reserved25:1;
INT32U Reserved26:1;
INT32U Reserved27:1;
INT32U Reserved28:1;
INT32U Reserved29:1;
INT32U Reserved30:1;
INT32U Reserved31:1;
INT32U Reserved32:1;
INT32U Reserved33:1;
INT32U Reserved34:1;
INT32U Reserved35:1;
INT32U Reserved36:1;
INT32U Reserved37:1;
}FlagBits;
INT32U FlagArry[3];
}CarFlagType;
typedef union
{
struct
{
INT8U bit0:1;
INT8U bit1:1;
INT8U bit2:1;
INT8U bit3:1;
INT8U bit4:1;
INT8U bit5:1;
INT8U bit6:1;
INT8U bit7:1;
INT8U bit8:1;
INT8U bit9:1;
INT8U bit10:1;
INT8U bit11:1;
INT8U bit12:1;
INT8U bit13:1;
INT8U bit14:1;
INT8U bit15:1;
}bits;
INT16U w;
}WordBit;
typedef union
{
struct
{
INT16U d16H;
INT16U d16L;
}dw;
INT32U dw32;
}ULONG;
typedef union
{
struct
{
INT8U d8H;
INT8U d8L;
}bytes;
INT16U int16u;
}TwoINT8U;
typedef struct
{
INT8U bDat[256];
INT16U wSectorStartAdd;
INT16U wBlockAdd;
}tDFlashBuff;
typedef struct
{
INT8U Col;
INT16U isFlash; //是否闪烁
INT8U FlashEn; //闪烁使能
INT8U TEnable7;
INT16U OverTime7; //定时极限
INT16U Time7;
INT8U TEnable6;
INT16U OverTime6; //定时极限
INT16U Time6;
INT8U TEnable5;
INT16U OverTime5; //定时极限
INT16U Time5;
INT8U TEnable4;
INT16U OverTime4; //定时极限
INT16U Time4;
INT8U TEnable3;
INT16U OverTime3; //定时极限
INT16U Time3;
INT8U TEnable2;
INT16U OverTime2; //定时极限
INT16U Time2;
INT8U TEnable1;
INT16U OverTime1; //定时极限
INT16U Time1;
INT8U TEnable0;
INT16U OverTime0; //定时极限
INT16U Time0;
INT8U AutoEnable;
INT16U OverAutoTime; //定时极限
INT16U AutoTime;
INT8U HalfSeconds; //1/10秒
INT8U Seconds;
INT8U Minutes;
INT8U Hours;
}ClockType;
typedef union
{
INT16U duty;
INT16U cycle;
INT16U time;
}EcuType;
typedef struct
{
INT8U Frame_Head[2]; //数据帧头
INT8U Frame_Check; //校验字
INT8U Frame_Type; //数据帧类型
INT8U Dir;
INT8U Bak2;
INT8U Frame_Len;
INT8U Frame_Data[33];
INT8U Frame_CheckSun;
INT8U Frame_END[2];
}SciFrameType;
typedef struct //
{
INT8U bFlag;
INT16U VehRadio; //
INT16U VehNum; //
INT16U RevRadio; //
INT8U bCheckSun;
}RadioMeter;
typedef struct
{
INT16U PushTime_1;
INT16U PushTime_2;
INT8U CAN_Step;
INT8U StepAuto;
INT8U CheckDispOk;
}KeyType;
typedef struct
{
INT32U ID;
INT8U Length;
INT8U ID_EN;
INT8U Msg[8];
}CAN_message;
typedef struct{
INT8U Led;
INT8U Trip;
INT8U WF;
INT8U Radar;
}Max_Page;
#endif /* VAR_TYPE_H_ */
/*
* includes.h
*
* Created on: 2012-3-21
* Author: qitiancun
*/
#ifndef _INCLUDES_H_
#define _INCLUDES_H_
#include "hidef.h" /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#include "mc9s12hy64.h"
#include "../App_Headers/Var_Type.h"
//
#include "../App_Headers/API_Device_Init.h"
#include "../App_Headers/API_DFlash.h"
#include "../App_Headers/API_CAN.h"
#include "../App_Headers/API_TPM.h"
#include "../App_Headers/API_SCI.h"
#include "../App_Headers/API_RTC.h"
#include "../App_Headers/API_LCD.h"
//Ӧò
#include "../App_Headers/Globals_Var.h"
#include "../App_Headers/APP_CAN.h"
#include "../App_Headers/APP_DFlash.h"
#include "../App_Headers/APP_Data_Process.h"
#include "../App_Headers/APP_SCI.h"
#include "../App_Headers/APP_Test.h"
//GUI
#include "../App_Headers/GUI_Display.h"
#endif /* _INCLUDES_H_ */
OPEN source 0 0 60 39
Source < attributes TOOLTIP on,TOOLTIP_FORMAT signed,TOOLTIP_MODE details,FREEZE off,MARKS off
OPEN assembly 60 0 40 31
Assembly < attributes ADR on,CODE off,ABSADR on,SYMB off,FORMAT Auto,FREEZE off,TOPPC 0xC054
OPEN procedure 0 39 60 17
Procedure < attributes VALUES on,TYPES off
OPEN register 60 31 40 25
Register < attributes FORMAT AUTO,COMPLEMENT None
OPEN memory 60 56 40 22
Memory < attributes FORMAT hex,COMPLEMENT None,WORD 1,ASC on,ADR on,MODE automatic,UPDATERATE 10,ADDRESS 0x80
OPEN data 0 56 60 22
Data:1 < attributes SCOPE global,COMPLEMENT None,FORMAT Symb,MODE automatic,SORT NotSort,UPDATERATE 10,NAMEWIDTH 16
OPEN data 0 32 60 68
Data:2 < attributes SCOPE local,COMPLEMENT None,FORMAT Symb,MODE periodical,SORT NotSort,UPDATERATE 1,NAMEWIDTH 16
OPEN command 60 78 40 22
Command < attributes CACHESIZE 1000
bckcolor 50331647
font 'Courier New' 9 BLACK
AUTOSIZE on
ACTIVATE "Command" "Procedure" "Data:1" "Register" "Assembly" "Memory" "Data:2" "Source"
[STARTUP]
CPUTARGETTYPE=0
USE_CYCLONEPRO_RELAYS=1
CyclonePro_poweroffonexit=0
CyclonePro_currentvoltage=255
CyclonePro_PowerDownDelay=250
CyclonePro_PowerUpDelay=250
RESET_DELAY=0
PORT=101
interface_selection=4
SHOWDIALOG=0
IO_DELAY_SET=0
frequency_has_changed_old_io_delay_cnt=0
IO_DELAY_CNT=0
PCI_DELAY=0
[Environment Variables]
GENPATH={Project}Sources;{Compiler}lib\hc12c\src;{Compiler}lib\hc12c\include;{Compiler}lib\hc12c\lib;{Compiler}lib\xgatec\src;{Compiler}lib\xgatec\include;{Compiler}lib\xgatec\lib
LIBPATH={Compiler}lib\hc12c\include;{Compiler}lib\xgatec\include
OBJPATH={Project}bin
TEXTPATH={Project}bin
ABSPATH={Project}bin
[HI-WAVE]
Target=icd12
Layout=C_layout.hwl
LoadDialogOptions=AUTOERASEANDFLASH RUNANDSTOPAFTERLOAD="main"
CPU=HC12
MainFrame=0,1,-1,-1,-1,-1,25,25,1050,551
TOOLBAR=57600 57601 32795 0 57635 57634 57637 0 57671 57669 0 32777 32776 32782 32780 32781 32778 0 32806
[HC12MultilinkCyclonePro_GDI_SETTINGS]
CMDFILE0=CMDFILE STARTUP ON ".\cmd\CyclonePro_USB_startup.cmd"
CMDFILE1=CMDFILE RESET ON ".\cmd\CyclonePro_USB_reset.cmd"
CMDFILE2=CMDFILE PRELOAD ON ".\cmd\CyclonePro_USB_preload.cmd"
CMDFILE3=CMDFILE POSTLOAD ON ".\cmd\CyclonePro_USB_postload.cmd"
CMDFILE4=CMDFILE VPPON ON ".\cmd\CyclonePro_USB_vppon.cmd"
CMDFILE5=CMDFILE VPPOFF ON ".\cmd\CyclonePro_USB_vppoff.cmd"
CMDFILE6=CMDFILE UNSECURE ON ".\cmd\CyclonePro_USB_erase_unsecure_hcs12p.cmd"
MCUID=0x02F2
NV_PARAMETER_FILE=
NV_SAVE_WSP=0
NV_AUTO_ID=1
[ICD12]
COMSETTINGS=SETCOMM DRIVER NOPROTOCOL NOPERIODICAL
SETCLKSW=0
HOTPLUGGING=0
DETECTRUNNING=0
RESYNCONCOPRESET=0
BDMAutoSpeed=1
BDMClockSpeed=0
HIGHIODELAYCONSTFORPLL=40
[PORT]
IP=
CAN_FILE [文件标识不可改动]
TBEGAIN [开始标识不可改动]
T=1000ms [组标识]
150 068 00 00 00 00 00 00 00 00
150 268 00 00 00 00 00 00 00 00
T=1000ms [组标识]
20 288 81 00 00 00 [水温60]
T=1000ms [组标识]
20 288 A1 00 00 00 [水温84]
T=1000ms [组标识]
20 288 CA 00 00 00 [水温115]
T=1000ms [组标识]
20 288 D1 00 00 00 [水温120]
T=1000ms [组标识]
20 094 00 00 07 D0 [转速500]
20 088 14 00 00 00 [车速20]
T=1000ms [组标识]
20 094 00 00 0F A0 [转速1000]
20 088 28 00 00 00 [车速40]
T=1000ms [组标识]
20 094 00 00 1F 40 [转速2000]
20 088 3C 00 00 00 [车速60]
T=1000ms [组标识]
20 094 00 00 2E E0 [转速3000]
20 088 50 00 00 00 [车速80]
T=1000ms [组标识]
20 094 00 00 3E 80 [转速4000]
20 088 64 00 00 00 [车速100]
T=1000ms [组标识]
20 094 00 00 4E 20 [转速5000]
20 088 78 00 00 00 [车速120]
T=1000ms [组标识]
20 094 00 00 5D C0 [转速6000]
20 088 8C 00 00 00 [车速140]
T=1000ms [组标识]
20 094 00 00 6D 60 [转速7000]
20 088 A0 00 00 00 [车速160]
T=1000ms [组标识]
20 094 00 00 7D 00 [转速8000]
20 088 B4 00 00 00 [车速180]
T=1000ms [组标识]
20 094 00 00 7D 00 [转速8000]
20 088 C8 00 00 00 [车速200]
T=1000ms [组标识]
20 094 00 00 7D 00 [转速8000]
20 088 DC 00 00 00 [车速220]
T=1000ms [组标识]
20 094 00 00 7D 00 [转速8000]
20 088 F0 00 00 00 [车速240]
T=1000ms [组标识]
150 068 00 00 00 00 00 00 00 00
150 118 00 00 00 00 00 00 00 00 [P档]
150 116 00 80 00 00 00 00 00 00 [P档]
T=1000ms [组标识]
150 068 00 00 00 00 00 00 00 00
150 118 00 00 00 00 00 00 00 00 [R档]
150 116 00 70 00 00 00 00 00 00 [R档]
T=1000ms [组标识]
150 068 00 00 00 00 00 00 00 00
150 118 00 00 00 00 00 00 00 00 [N档]
150 116 00 60 00 00 00 00 00 00 [N档]
T=1000ms [组标识]
150 068 00 00 00 00 00 00 00 00
150 118 00 00 00 00 00 00 00 00 [D档]
150 116 00 50 00 00 00 00 00 00 [D档]
T=1000ms [组标识]
150 068 00 00 00 00 00 00 00 00
150 268 00 00 00 00 00 00 00 00
150 118 00 02 06 00 00 00 00 00 [6档]
T=1000ms [组标识]
150 068 00 00 00 00 00 00 00 00
150 268 00 00 00 00 00 00 00 00
150 118 00 02 05 00 00 00 00 00 [5档]
T=1000ms [组标识]
150 068 00 00 00 00 00 00 00 00
150 268 00 00 00 00 00 00 00 00
150 118 00 02 04 00 00 00 00 00 [4档]
T=1000ms [组标识]
150 068 08 00 00 00 00 00 00 00 [ABS]
150 268 00 00 00 00 00 00 00 00
150 118 00 02 03 00 00 00 00 00 [3档]
T=1000ms [组标识]
150 068 00 00 00 00 00 00 00 00 [空 机油压力]
150 268 00 00 00 00 00 00 00 00
150 118 00 02 02 00 00 00 00 00 [2档]
T=1000ms [组标识]
150 068 00 00 00 00 00 00 00 00 [空 车门]
150 268 00 00 00 00 00 00 00 00
150 118 00 02 01 00 00 00 00 00 [1档]
T=1000ms [组标识]
150 288 00 04 00 00 00 00 00 00 [发动故障]
150 068 00 00 00 00 00 00 00 00
150 268 00 00 00 00 00 00 00 00
T=1000ms [组标识]
150 068 00 00 00 00 00 00 00 00 [空 充电灯]
150 268 00 00 00 00 00 00 00 00
150 288 00 00 00 00 00 00 00 00
T=1000ms [组标识]
150 268 20 00 00 00 00 00 00 00 [安全气囊]
150 068 00 00 00 00 00 00 00 00
150 288 00 00 00 00 00 00 00 00
T=1000ms [组标识]
150 068 00 00 00 00 00 00 00 00 [空 制动器]
150 268 00 00 00 00 00 00 00 00
T=1000ms [组标识]
100 082 00 00 00 00 00 00 00 80 [CRUISE]
150 068 00 00 00 00 00 00 00 00
150 268 00 00 00 00 00 00 00 00
T=1000ms [组标识]
150 288 00 02 00 00 00 00 00 00 [SVS]
150 068 00 00 00 00 00 00 00 00
100 082 00 00 00 00 00 00 00 00
150 268 00 00 00 00 00 00 00 00
T=1000ms [组标识]
150 068 04 00 00 00 00 00 00 00 [EBD]
150 268 00 00 00 00 00 00 00 00
150 288 00 00 00 00 00 00 00 00
T=1000ms [组标识]
20 268 00 00 00 00 00
20 094 00 00 7D 00 [转速8000]
20 088 F0 00 00 00 [车速240]
TEND [结束标识不可改动]
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<?codewarrior exportversion="2.0" ideversion="5.9.0" ?>
<!DOCTYPE PROJECT [
<!ELEMENT PROJECT (TARGETLIST, TARGETORDER, GROUPLIST, DESIGNLIST?, PLUGINDATALIST?)>
<!ELEMENT TARGETLIST (TARGET+)>
<!ELEMENT TARGET (NAME, SETTINGLIST, FILELIST, LINKORDER?, SEGMENTLIST?, OVERLAYGROUPLIST?, SUBTARGETLIST?, SUBPROJECTLIST?, FRAMEWORKLIST?, PACKAGEACTIONSLIST?)>
<!ELEMENT PACKAGEACTIONSLIST (PACKAGEACTION+)>
<!ELEMENT PACKAGEACTION (#PCDATA)>
<!ATTLIST PACKAGEACTION PACKAGEACTIONTYPE CDATA #REQUIRED>
<!ELEMENT NAME (#PCDATA)>
<!ELEMENT PATH (#PCDATA)>
<!ELEMENT FILELIST (FILE*)>
<!ELEMENT FILE (PATHTYPE, PATHROOT?, ACCESSPATH?, PATH, PATHFORMAT, ROOTFILEREF?, FILEKIND, FILEFLAGS)>
<!ELEMENT PATHTYPE (#PCDATA)>
<!ELEMENT PATHROOT (#PCDATA)>
<!ELEMENT ACCESSPATH (#PCDATA)>
<!ELEMENT PATHFORMAT (#PCDATA)>
<!ELEMENT ROOTFILEREF (PATHTYPE, PATHROOT?, ACCESSPATH?, PATH, PATHFORMAT)>
<!ELEMENT FILEKIND (#PCDATA)>
<!ELEMENT FILEFLAGS (#PCDATA)>
<!ELEMENT FILEREF (TARGETNAME?, PATHTYPE, PATHROOT?, ACCESSPATH?, PATH, PATHFORMAT)>
<!ELEMENT TARGETNAME (#PCDATA)>
<!ELEMENT SETTINGLIST ((SETTING|PANELDATA)*)>
<!ELEMENT SETTING (NAME?, (VALUE|(SETTING+)))>
<!ELEMENT PANELDATA (NAME, VALUE)>
<!ELEMENT VALUE (#PCDATA)>
<!ELEMENT LINKORDER (FILEREF*)>
<!ELEMENT SEGMENTLIST (SEGMENT+)>
<!ELEMENT SEGMENT (NAME?, ATTRIBUTES?, FILEREF*)>
<!ELEMENT ATTRIBUTES (#PCDATA)>
<!ELEMENT OVERLAYGROUPLIST (OVERLAYGROUP+)>
<!ELEMENT OVERLAYGROUP (NAME, BASEADDRESS, OVERLAY*)>
<!ELEMENT BASEADDRESS (#PCDATA)>
<!ELEMENT OVERLAY (NAME, FILEREF*)>
<!ELEMENT SUBTARGETLIST (SUBTARGET+)>
<!ELEMENT TARGETOUTPUTNAME (#PCDATA)>
<!ELEMENT TARGETOUTPUTDISPLAYNAME (#PCDATA)>
<!ELEMENT TARGETOUTPUTPATHFORMAT (#PCDATA)>
<!ELEMENT TARGETOUTPUTACCESSTYPE (#PCDATA)>
<!ELEMENT SUBTARGET (TARGETNAME, ATTRIBUTES?, TARGETOUTPUTNAME?, TARGETOUTPUTDISPLAYNAME?, TARGETOUTPUTPATHFORMAT?, TARGETOUTPUTACCESSTYPE?, FILEREF?)>
<!ELEMENT SUBPROJECTLIST (SUBPROJECT+)>
<!ELEMENT SUBPROJECT (FILEREF, SUBPROJECTTARGETLIST)>
<!ELEMENT SUBPROJECTTARGETLIST (SUBPROJECTTARGET*)>
<!ELEMENT SUBPROJECTTARGET (TARGETNAME, ATTRIBUTES?, FILEREF?)>
<!ELEMENT FRAMEWORKLIST (FRAMEWORK+)>
<!ELEMENT FRAMEWORK (FILEREF, VERSION?, DYNAMICLIBRARY?)>
<!ELEMENT DYNAMICLIBRARY (#PCDATA)>
<!ELEMENT VERSION (#PCDATA)>
<!ELEMENT TARGETORDER (ORDEREDTARGET|ORDEREDDESIGN)*>
<!ELEMENT ORDEREDTARGET (NAME)>
<!ELEMENT ORDEREDDESIGN (NAME, ORDEREDTARGET+)>
<!ELEMENT GROUPLIST (GROUP|FILEREF)*>
<!ELEMENT GROUP (NAME, (GROUP|FILEREF)*)>
<!ELEMENT DESIGNLIST (DESIGN+)>
<!ELEMENT DESIGN (NAME, DESIGNDATA)>
<!ELEMENT DESIGNDATA (#PCDATA)>
<!ELEMENT PLUGINDATALIST (PLUGINDATA+)>
<!ELEMENT PLUGINDATA (NAME, VALUE)>
]>
<PROJECT>
<TARGETLIST>
<TARGET>
<NAME>Standard</NAME>
<SETTINGLIST>
<!-- Settings for "Source Trees" panel -->
<SETTING><NAME>UserSourceTrees</NAME><VALUE></VALUE></SETTING>
<!-- Settings for "Access Paths" panel -->
<SETTING><NAME>AlwaysSearchUserPaths</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>InterpretDOSAndUnixPaths</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>RequireFrameworkStyleIncludes</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>SourceRelativeIncludes</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>UserSearchPaths</NAME>
<SETTING>
<SETTING><NAME>SearchPath</NAME>
<SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
<SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
</SETTING>
<SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>SearchPath</NAME>
<SETTING><NAME>Path</NAME><VALUE>bin</VALUE></SETTING>
<SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
<SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
</SETTING>
<SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>SearchPath</NAME>
<SETTING><NAME>Path</NAME><VALUE>prm</VALUE></SETTING>
<SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
<SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
</SETTING>
<SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>SearchPath</NAME>
<SETTING><NAME>Path</NAME><VALUE>cmd</VALUE></SETTING>
<SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
<SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
</SETTING>
<SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>SearchPath</NAME>
<SETTING><NAME>Path</NAME><VALUE>Sources</VALUE></SETTING>
<SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
<SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
</SETTING>
<SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>SearchPath</NAME>
<SETTING><NAME>Path</NAME><VALUE>lib\HC12c\lib</VALUE></SETTING>
<SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
<SETTING><NAME>PathRoot</NAME><VALUE>CodeWarrior</VALUE></SETTING>
</SETTING>
<SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>SearchPath</NAME>
<SETTING><NAME>Path</NAME><VALUE>lib\HC12c\src</VALUE></SETTING>
<SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
<SETTING><NAME>PathRoot</NAME><VALUE>CodeWarrior</VALUE></SETTING>
</SETTING>
<SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>SearchPath</NAME>
<SETTING><NAME>Path</NAME><VALUE>Api_Sources</VALUE></SETTING>
<SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
<SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
</SETTING>
<SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>SearchPath</NAME>
<SETTING><NAME>Path</NAME><VALUE>App_Headers</VALUE></SETTING>
<SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
<SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
</SETTING>
<SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>SearchPath</NAME>
<SETTING><NAME>Path</NAME><VALUE>Library</VALUE></SETTING>
<SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
<SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
</SETTING>
<SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
</SETTING>
</SETTING>
<SETTING><NAME>SystemSearchPaths</NAME>
<SETTING>
<SETTING><NAME>SearchPath</NAME>
<SETTING><NAME>Path</NAME><VALUE>lib\HC12c\include</VALUE></SETTING>
<SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
<SETTING><NAME>PathRoot</NAME><VALUE>CodeWarrior</VALUE></SETTING>
</SETTING>
<SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
</SETTING>
</SETTING>
<!-- Settings for "Target Settings" panel -->
<SETTING><NAME>Linker</NAME><VALUE>Linker for HC12</VALUE></SETTING>
<SETTING><NAME>PreLinker</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>PostLinker</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>Targetname</NAME><VALUE>Standard</VALUE></SETTING>
<SETTING><NAME>OutputDirectory</NAME>
<SETTING><NAME>Path</NAME><VALUE>bin</VALUE></SETTING>
<SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
<SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
</SETTING>
<SETTING><NAME>SaveEntriesUsingRelativePaths</NAME><VALUE>false</VALUE></SETTING>
<!-- Settings for "File Mappings" panel -->
<SETTING><NAME>FileMappings</NAME>
<SETTING>
<SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.a12</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE>Assembler for HC12</VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE>mwe_asm_HC12</VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.asm</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE>Assembler for HC12</VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE>mwe_asm_HC12</VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.axgate</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE>Assembler for XGATE</VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE>mwe_asm_XGATE</VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.bbl</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE>mwe_bbl</VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.c</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE>Compiler for HC12</VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE>mwe_cpp_HC12</VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.c12</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE>Compiler for HC12</VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE>mwe_cpp_HC12</VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.cc</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE>Compiler for HC12</VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE>mwe_cpp_HC12</VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.cmd</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.cp</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE>Compiler for HC12</VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE>mwe_cpp_HC12</VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.cpp</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE>Compiler for HC12</VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE>mwe_cpp_HC12</VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.cxgate</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE>Compiler for XGATE</VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE>mwe_cpp_XGATE</VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.cxx</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE>Compiler for HC12</VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE>mwe_cpp_HC12</VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.dbg</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE>Assembler for HC12</VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE>mwe_asm_HC12</VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.equ</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE>Assembler for HC12</VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE>mwe_asm_HC12</VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.h</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE>Compiler for HC12</VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE>mwe_cpp_HC12</VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.hpp</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE>Compiler for HC12</VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE>mwe_cpp_HC12</VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.hxx</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE>Compiler for HC12</VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE>mwe_cpp_HC12</VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.inc</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE>Assembler for HC12</VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE>mwe_asm_HC12</VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.ini</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.lst</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE>mwe_imp_HC12</VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.map</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.oil</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE>OSEK Sysgen</VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>true</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>true</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.pre</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE>mwe_cpp_HC12</VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.prm</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE>mwe_prm</VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.s</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE>Assembler for HC12</VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE>mwe_asm_HC12</VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.s1</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.s19</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.sgm</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE>Compiler for HC12</VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE>mwe_cpp_HC12</VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.sx</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.txt</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.a</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE>Importer for HC12</VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.abs</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE>Importer for HC12</VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.elf</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE>Importer for HC12</VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.lib</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE>Importer for HC12</VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.o</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE>Importer for HC12</VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.obj</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE>Importer for HC12</VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.pdf</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>true</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE>.sym</VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
</SETTING>
<SETTING>
<SETTING><NAME>FileExtension</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
</SETTING>
</SETTING>
<!-- Settings for "Build Extras" panel -->
<SETTING><NAME>CacheModDates</NAME><VALUE>true</VALUE></SETTING>
<SETTING><NAME>DumpBrowserInfo</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>CacheSubprojects</NAME><VALUE>true</VALUE></SETTING>
<SETTING><NAME>UseThirdPartyDebugger</NAME><VALUE>true</VALUE></SETTING>
<SETTING><NAME>BrowserGenerator</NAME><VALUE>1</VALUE></SETTING>
<SETTING><NAME>DebuggerAppPath</NAME>
<SETTING><NAME>Path</NAME><VALUE>prog\hiwave.exe</VALUE></SETTING>
<SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
<SETTING><NAME>PathRoot</NAME><VALUE>CodeWarrior</VALUE></SETTING>
</SETTING>
<SETTING><NAME>DebuggerCmdLineArgs</NAME><VALUE>%targetFilePath -Prod=%projectFileDir\TBDML.ini -instance=tbdml</VALUE></SETTING>
<SETTING><NAME>DebuggerWorkingDir</NAME>
<SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
<SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
</SETTING>
<SETTING><NAME>CodeCompletionPrefixFileName</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>CodeCompletionMacroFileName</NAME><VALUE></VALUE></SETTING>
<!-- Settings for "Custom Keywords" panel -->
<SETTING><NAME>CustomColor1</NAME>
<SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
<SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
<SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
</SETTING>
<SETTING><NAME>CustomColor2</NAME>
<SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
<SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
<SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
</SETTING>
<SETTING><NAME>CustomColor3</NAME>
<SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
<SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
<SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
</SETTING>
<SETTING><NAME>CustomColor4</NAME>
<SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
<SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
<SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
</SETTING>
<PANELDATA><NAME>PEOptions</NAME><VALUE>
0100
</VALUE></PANELDATA>
<!-- Settings for "Panel for Assembler for HC12" panel -->
<SETTING><NAME>Panel for Assembler for HC12</NAME>
<SETTING><NAME>Options</NAME><VALUE> -CpuHCS12 -Ms </VALUE></SETTING>
<SETTING><NAME>UseDecoder</NAME><VALUE>0</VALUE></SETTING>
<SETTING><NAME>EchoCommandLine</NAME><VALUE>0</VALUE></SETTING>
</SETTING>
<!-- Settings for "Panel for Burner for HC12" panel -->
<SETTING><NAME>Panel for Burner for HC12</NAME>
<SETTING><NAME>Options</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>EchoCommandLine</NAME><VALUE>0</VALUE></SETTING>
<SETTING><NAME>BurnerDialogdata</NAME><VALUE></VALUE></SETTING>
</SETTING>
<!-- Settings for "Panel for Compiler for HC12" panel -->
<SETTING><NAME>Panel for Compiler for HC12</NAME>
<SETTING><NAME>Options</NAME><VALUE>-CPUHCS12 -DPPAGE_ADDR=0x15 -D__NO_FLOAT__ -Ms</VALUE></SETTING>
<SETTING><NAME>UseDecoder</NAME><VALUE>0</VALUE></SETTING>
<SETTING><NAME>EchoCommandLine</NAME><VALUE>0</VALUE></SETTING>
</SETTING>
<!-- Settings for "Panel for Importer for HC12" panel -->
<SETTING><NAME>Panel for Importer for HC12</NAME>
<SETTING><NAME>Options</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>EchoCommandLine</NAME><VALUE>0</VALUE></SETTING>
</SETTING>
<!-- Settings for "Panel for Libmaker for HC12" panel -->
<SETTING><NAME>Panel for Libmaker for HC12</NAME>
<SETTING><NAME>Options</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>EchoCommandLine</NAME><VALUE>0</VALUE></SETTING>
<SETTING><NAME>OutputFilename</NAME><VALUE>out.lib</VALUE></SETTING>
<SETTING><NAME>LibGenObjFile</NAME><VALUE>0</VALUE></SETTING>
</SETTING>
<!-- Settings for "Panel for Linker for HC12" panel -->
<SETTING><NAME>Panel for Linker for HC12</NAME>
<SETTING><NAME>Options</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>LinkParameterFilename</NAME><VALUE>out.prm</VALUE></SETTING>
<SETTING><NAME>EchoCommandLine</NAME><VALUE>0</VALUE></SETTING>
<SETTING><NAME>OutputFilename</NAME><VALUE>Project.abs</VALUE></SETTING>
<SETTING><NAME>UseTemplate</NAME><VALUE>2</VALUE></SETTING>
<SETTING><NAME>PrmTemplateName</NAME><VALUE>mc9s12hy64.prm</VALUE></SETTING>
<SETTING><NAME>RunPreprocessor</NAME><VALUE>0</VALUE></SETTING>
</SETTING>
<!-- Settings for "Panel for Assembler for XGATE" panel -->
<SETTING><NAME>Panel for Assembler for XGATE</NAME>
<SETTING><NAME>Options</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>UseDecoder</NAME><VALUE>0</VALUE></SETTING>
<SETTING><NAME>EchoCommandLine</NAME><VALUE>0</VALUE></SETTING>
</SETTING>
<!-- Settings for "Panel for Burner for XGATE" panel -->
<SETTING><NAME>Panel for Burner for XGATE</NAME>
<SETTING><NAME>Options</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>EchoCommandLine</NAME><VALUE>0</VALUE></SETTING>
<SETTING><NAME>BurnerDialogdata</NAME><VALUE></VALUE></SETTING>
</SETTING>
<!-- Settings for "Panel for Compiler for XGATE" panel -->
<SETTING><NAME>Panel for Compiler for XGATE</NAME>
<SETTING><NAME>Options</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>UseDecoder</NAME><VALUE>0</VALUE></SETTING>
<SETTING><NAME>EchoCommandLine</NAME><VALUE>0</VALUE></SETTING>
</SETTING>
<!-- Settings for "Panel for Importer for XGATE" panel -->
<SETTING><NAME>Panel for Importer for XGATE</NAME>
<SETTING><NAME>Options</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>EchoCommandLine</NAME><VALUE>0</VALUE></SETTING>
</SETTING>
<!-- Settings for "Panel for Libmaker for XGATE" panel -->
<SETTING><NAME>Panel for Libmaker for XGATE</NAME>
<SETTING><NAME>Options</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>EchoCommandLine</NAME><VALUE>0</VALUE></SETTING>
<SETTING><NAME>OutputFilename</NAME><VALUE>out.lib</VALUE></SETTING>
<SETTING><NAME>LibGenObjFile</NAME><VALUE>0</VALUE></SETTING>
</SETTING>
<!-- Settings for "Panel for Linker for XGATE" panel -->
<SETTING><NAME>Panel for Linker for XGATE</NAME>
<SETTING><NAME>Options</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>LinkParameterFilename</NAME><VALUE>out.prm</VALUE></SETTING>
<SETTING><NAME>EchoCommandLine</NAME><VALUE>0</VALUE></SETTING>
<SETTING><NAME>OutputFilename</NAME><VALUE>out.abs</VALUE></SETTING>
<SETTING><NAME>UseTemplate</NAME><VALUE>2</VALUE></SETTING>
<SETTING><NAME>PrmTemplateName</NAME><VALUE>default.prm</VALUE></SETTING>
<SETTING><NAME>RunPreprocessor</NAME><VALUE>0</VALUE></SETTING>
</SETTING>
<!-- Settings for "OSEK Sysgen Panel" panel -->
<SETTING><NAME>OSEKCompilerPref_PropertyFileName</NAME><VALUE>{Project}gen\osprop.h</VALUE></SETTING>
<SETTING><NAME>OSEKCompilerPref_IncludeFileName</NAME><VALUE>{Project}gen\cfg.h</VALUE></SETTING>
<SETTING><NAME>OSEKCompilerPref_SourceFileName</NAME><VALUE>{Project}gen\cfg.c</VALUE></SETTING>
<SETTING><NAME>OSEKCompilerPref_StkLabelFileName</NAME><VALUE>{Project}gen\stklabel.s</VALUE></SETTING>
<SETTING><NAME>OSEKCompilerPref_ORTIFileName</NAME><VALUE>{TargetFile}.ort</VALUE></SETTING>
<SETTING><NAME>OSEKCompilerPref_SysGenFileName</NAME><VALUE>{Compiler}osek\shared\bin\sysgen.exe</VALUE></SETTING>
<SETTING><NAME>OSEKCompilerPref_OptionFileName</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>OSEKCompilerPref_UserTypesFileName</NAME><VALUE>{Project}Sources\usertypes.h</VALUE></SETTING>
<SETTING><NAME>OSEKCompilerPref_PrefixFilePathName</NAME><VALUE>{Project}gen</VALUE></SETTING>
<SETTING><NAME>OSEKCompilerPref_IncludePaths</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>OSEKCompilerPref_DisabledMsgs</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>OSEKCompilerPref_OptionLine</NAME><VALUE> -p "{Project}gen\osprop.h" -h "{Project}gen\cfg.h" -c "{Project}gen\cfg.c" -s "{Project}gen\stklabel.s" -o "{TargetFile}.ort" -O "2.1"</VALUE></SETTING>
<SETTING><NAME>OSEKCompilerPref_OrtiVersion</NAME><VALUE>2.1</VALUE></SETTING>
<SETTING><NAME>OSEKCompilerPref_SuppressWarning</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>OSEKCompilerPref_AbsolutePathes</NAME><VALUE>false</VALUE></SETTING>
<SETTING><NAME>OSEKCompilerPref_GenerateSingleBackslash</NAME><VALUE>false</VALUE></SETTING>
<!-- Settings for "BatchRunner Panel" panel -->
<SETTING><NAME>MWBatchRunnerPostLinker_BatchPath</NAME>
<SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
<SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
</SETTING>
<SETTING><NAME>MWBatchRunnerPostLinker_SendParam</NAME><VALUE>false</VALUE></SETTING>
<!-- Settings for "BatchRunner PreLinker Panel" panel -->
<SETTING><NAME>MWBatchRunnerPreLinker_BatchPath</NAME>
<SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
<SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
</SETTING>
<!-- Settings for "PCLint Options" panel -->
<SETTING><NAME>useMeyers</NAME><VALUE>0</VALUE></SETTING>
<SETTING><NAME>useSaks</NAME><VALUE>0</VALUE></SETTING>
<SETTING><NAME>useMisra</NAME><VALUE>0</VALUE></SETTING>
<SETTING><NAME>useATL</NAME><VALUE>0</VALUE></SETTING>
<SETTING><NAME>useSTL</NAME><VALUE>0</VALUE></SETTING>
<SETTING><NAME>useOIL</NAME><VALUE>0</VALUE></SETTING>
<SETTING><NAME>useWIN16</NAME><VALUE>0</VALUE></SETTING>
<SETTING><NAME>useWIN32</NAME><VALUE>0</VALUE></SETTING>
<SETTING><NAME>useWINNT</NAME><VALUE>0</VALUE></SETTING>
<SETTING><NAME>useMFC</NAME><VALUE>0</VALUE></SETTING>
<SETTING><NAME>useCORBA</NAME><VALUE>0</VALUE></SETTING>
<SETTING><NAME>wLevel</NAME><VALUE>3</VALUE></SETTING>
<SETTING><NAME>wlibLevel</NAME><VALUE>3</VALUE></SETTING>
<SETTING><NAME>addOptions</NAME><VALUE></VALUE></SETTING>
<!-- Settings for "PCLint Main Settings" panel -->
<SETTING><NAME>exePath</NAME><VALUE>{Compiler}Lint\Lint-nt.exe</VALUE></SETTING>
<SETTING><NAME>configPath</NAME><VALUE>{Compiler}Lint\lnt\CodeWarrior</VALUE></SETTING>
<SETTING><NAME>showCmdLine</NAME><VALUE>0</VALUE></SETTING>
<SETTING><NAME>cofile</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>showDefCoFiles</NAME><VALUE>0</VALUE></SETTING>
<SETTING><NAME>prefixFile</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>noLink</NAME><VALUE>1</VALUE></SETTING>
<!-- Settings for "x86 Exceptions Panel" panel -->
<SETTING><NAME>MWDebugger_X86_Exceptions</NAME>
<SETTING><VALUE>0</VALUE></SETTING>
<SETTING><VALUE>0</VALUE></SETTING>
<SETTING><VALUE>0</VALUE></SETTING>
<SETTING><VALUE>0</VALUE></SETTING>
<SETTING><VALUE>0</VALUE></SETTING>
<SETTING><VALUE>0</VALUE></SETTING>
<SETTING><VALUE>0</VALUE></SETTING>
<SETTING><VALUE>0</VALUE></SETTING>
<SETTING><VALUE>0</VALUE></SETTING>
<SETTING><VALUE>0</VALUE></SETTING>
<SETTING><VALUE>0</VALUE></SETTING>
<SETTING><VALUE>0</VALUE></SETTING>
<SETTING><VALUE>0</VALUE></SETTING>
<SETTING><VALUE>0</VALUE></SETTING>
<SETTING><VALUE>0</VALUE></SETTING>
<SETTING><VALUE>0</VALUE></SETTING>
<SETTING><VALUE>0</VALUE></SETTING>
<SETTING><VALUE>0</VALUE></SETTING>
<SETTING><VALUE>0</VALUE></SETTING>
<SETTING><VALUE>0</VALUE></SETTING>
<SETTING><VALUE>0</VALUE></SETTING>
<SETTING><VALUE>0</VALUE></SETTING>
<SETTING><VALUE>0</VALUE></SETTING>
<SETTING><VALUE>0</VALUE></SETTING>
</SETTING>
<!-- Settings for "External Build Panel" panel -->
<SETTING><NAME>MWExternalBuild_buildCommand</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>MWExternalBuild_executableFile</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>MWExternalBuild_symbolicsFile</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>MWExternalBuild_buildDirectory</NAME>
<SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
<SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
</SETTING>
<SETTING><NAME>MWExternalBuild_targetOS</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>MWExternalBuild_targetCPU</NAME><VALUE></VALUE></SETTING>
<SETTING><NAME>MWExternalBuild_targetName</NAME><VALUE></VALUE></SETTING>
</SETTINGLIST>
<FILELIST>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>main.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS>Debug</FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>derivative.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS>Debug</FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>datapage.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS>Debug</FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>Start12.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS>Debug</FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>burner.bbl</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS>Debug</FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>Project.prm</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS>Debug</FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>mc9s12hy64.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS>Debug</FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>mc9s12hy64.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS>Debug</FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>ansisi.lib</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Unknown</FILEKIND>
<FILEFLAGS>Debug</FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>Project.map</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS>Debug</FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>vecter.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS>Debug</FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>includes.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS></FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_Device_Init.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS></FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_Device_Init.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS>Debug</FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>Var_Type.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS></FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_DFlash.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS></FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_DFlash.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS>Debug</FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>Globals_Var.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS></FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_CAN.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS>Debug</FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_CAN.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS></FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_TPM.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS></FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_TPM.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS>Debug</FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>APP_CAN.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS>Debug</FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>APP_CAN.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS></FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_SCI.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS></FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_SCI.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS>Debug</FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>APP_DFlash.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS>Debug</FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>APP_DFlash.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS></FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>APP_Data_Process.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS></FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>APP_Data_Process.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS>Debug</FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>APP_SCI.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS></FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>APP_SCI.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS>Debug</FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>GUI_Display.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS></FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>GUI_Display.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS>Debug</FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_RTC.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS>Debug</FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_RTC.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS></FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_LCD.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS></FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_LCD.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS>Debug</FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>&#176;&#230;&#177;&#190;&#203;&#181;&#195;&#247;.txt</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS></FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>APP_Test.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS></FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>APP_Test.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS>Debug</FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>TimeCtrl.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS>Debug</FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>TimeCtrl.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS></FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>FT_VehSpeedCalc.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS></FILEFLAGS>
</FILE>
<FILE>
<PATHTYPE>Name</PATHTYPE>
<PATH>FT_VehSpeedCalc.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
<FILEKIND>Text</FILEKIND>
<FILEFLAGS>Debug</FILEFLAGS>
</FILE>
</FILELIST>
<LINKORDER>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>mc9s12hy64.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>main.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>derivative.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>datapage.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>Start12.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>burner.bbl</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>Project.prm</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>mc9s12hy64.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>ansisi.lib</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>Project.map</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>vecter.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>includes.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_Device_Init.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_Device_Init.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>Var_Type.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_DFlash.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_DFlash.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>Globals_Var.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_CAN.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_CAN.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_TPM.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_TPM.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>APP_CAN.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>APP_CAN.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_SCI.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_SCI.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>APP_DFlash.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>APP_DFlash.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>APP_Data_Process.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>APP_Data_Process.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>APP_SCI.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>APP_SCI.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>GUI_Display.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>GUI_Display.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_RTC.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_RTC.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_LCD.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_LCD.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>&#176;&#230;&#177;&#190;&#203;&#181;&#195;&#247;.txt</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>APP_Test.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>APP_Test.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>TimeCtrl.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>TimeCtrl.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>FT_VehSpeedCalc.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<PATHTYPE>Name</PATHTYPE>
<PATH>FT_VehSpeedCalc.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
</LINKORDER>
</TARGET>
</TARGETLIST>
<TARGETORDER>
<ORDEREDTARGET><NAME>Standard</NAME></ORDEREDTARGET>
</TARGETORDER>
<GROUPLIST>
<GROUP><NAME>Library</NAME>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>TimeCtrl.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>TimeCtrl.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>FT_VehSpeedCalc.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>FT_VehSpeedCalc.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
</GROUP>
<GROUP><NAME>Sources</NAME>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>main.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>datapage.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>vecter.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_Device_Init.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_SCI.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>APP_SCI.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_TPM.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_LCD.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_RTC.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_CAN.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>APP_CAN.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_DFlash.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>APP_DFlash.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>APP_Data_Process.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>GUI_Display.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>APP_Test.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
</GROUP>
<GROUP><NAME>Includes</NAME>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_Device_Init.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>derivative.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>mc9s12hy64.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>includes.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>Var_Type.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>Globals_Var.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_SCI.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_LCD.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>APP_SCI.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_TPM.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_RTC.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_CAN.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>APP_CAN.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>API_DFlash.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>APP_DFlash.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>APP_Data_Process.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>GUI_Display.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>&#176;&#230;&#177;&#190;&#203;&#181;&#195;&#247;.txt</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>APP_Test.h</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
</GROUP>
<GROUP><NAME>Project Settings</NAME>
<GROUP><NAME>Startup Code</NAME>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>Start12.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
</GROUP>
<GROUP><NAME>Linker Files</NAME>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>burner.bbl</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>Project.prm</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>Project.map</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
</GROUP>
</GROUP>
<GROUP><NAME>Libs</NAME>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>mc9s12hy64.c</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
<FILEREF>
<TARGETNAME>Standard</TARGETNAME>
<PATHTYPE>Name</PATHTYPE>
<PATH>ansisi.lib</PATH>
<PATHFORMAT>Windows</PATHFORMAT>
</FILEREF>
</GROUP>
</GROUPLIST>
<PLUGINDATALIST>
<PLUGINDATA>
<NAME>HC12 Wizard Configuration</NAME>
<VALUE>
3C3F786D6C2076657273696F6E3D22312E30223F3E0A3C57697A617264436F6E
66696775726174696F6E2076657273696F6E3D22312E33223E0A20203C53656C
656374656457697A617264456C656D656E74206E616D653D2250524D5F416461
70746174696F6E7322207465726D3D2250524D5F41646170746174696F6E7322
2069643D2249445F50524D5F41444150544154494F4E5322206964726566733D
2249445F50524D5F41444150544154494F4E53222068696464656E3D22596573
222F3E0A20203C53656C656374656457697A617264456C656D656E74206E616D
653D225374616E6461726422207465726D3D225374616E64617264222069643D
2249445F5354414E4441524422206964726566733D2249445F5354414E444152
44222068696464656E3D22596573222F3E0A20203C53656C656374656457697A
617264456C656D656E74206E616D653D22507263457870496E7374616C6C6174
696F6E22207465726D3D22507263457870496E7374616C6C6174696F6E436865
636B222069643D2249445F494E53545F5052435F45585022206964726566733D
2249445F494E53545F5052435F455850222068696464656E3D22596573222F3E
0A20203C53656C656374656457697A617264456C656D656E74206E616D653D22
50434C696E74496E7374616C6C6174696F6E22207465726D3D2250434C696E74
496E7374616C6C6174696F6E436865636B222069643D2249445F494E53545F50
435F4C494E5422206964726566733D2249445F494E53545F50435F4C494E5422
2068696464656E3D22596573222F3E0A20203C53656C656374656457697A6172
64456C656D656E74206E616D653D224368697022207465726D3D224D43395331
3248593634222069643D2249445F434849505F4859363422206964726566733D
2249445F434849505F4C4953542049445F434849505F46414D494C595F686373
31322049445F434849505F68637331325F53554246414D494C595F4859204944
5F434849505F48593634222F3E0A20203C53656C656374656457697A61726445
6C656D656E74206E616D653D224C616E677561676522207465726D3D22432220
69643D2249445F4C414E475F4322206964726566733D2249445F4C414E475F4C
4953542049445F4C414E475F43222F3E0A20203C53656C656374656457697A61
7264456C656D656E74206E616D653D2250726345787022207465726D3D224E6F
6E65222069643D2249445F5052435F4558505F4E4F22206964726566733D2249
445F5052435F4558502049445F5052435F4558505F4E4F222F3E0A20203C5365
6C656374656457697A617264456C656D656E74206E616D653D2250434C696E74
22207465726D3D224E6F222069643D2249445F50435F4C494E545F4E4F222069
64726566733D2249445F50435F4C494E542049445F50435F4C494E545F4E4F22
2F3E0A20203C53656C656374656457697A617264456C656D656E74206E616D65
3D2258474154455F7965735F6E6F22207465726D3D2253696E676C6520436F72
65202848435331325829222069643D2249445F58474154455F4E4F2220696472
6566733D2249445F58474154452049445F58474154455F4E4F222F3E0A20203C
53656C656374656457697A617264456C656D656E74206E616D653D2253746172
747570436F646522207465726D3D22414E5349207374617274757020636F6465
222069643D2249445F535441525455505F434F44455F414E5349222069647265
66733D2249445F535441525455505F434F44452049445F535441525455505F43
4F44455F414E5349222F3E0A20203C53656C656374656457697A617264456C65
6D656E74206E616D653D224D656D4D6F64656C22207465726D3D22536D616C6C
222069643D2249445F4D454D5F4D444C5F5322206964726566733D2249445F4D
454D5F4D444C2049445F4D454D5F4D444C5F53222F3E0A20203C53656C656374
656457697A617264456C656D656E74206E616D653D22484331325F464C506F69
6E7422207465726D3D224E6F6E65222069643D2249445F484331325F464C5F50
4F494E545F4E4F4E4522206964726566733D2249445F484331325F464C5F504F
494E542049445F484331325F464C5F504F494E545F4E4F4E45222F3E0A20203C
53656C656374656457697A617264456C656D656E74206E616D653D2254617267
657422207465726D3D225442444D4C222069643D2249445F434F4E4E5F544244
4D4C22206964726566733D2249445F434F4E4E454354494F4E5F4C4953542049
445F434F4E4E5F5442444D4C222F3E0A3C2F57697A617264436F6E6669677572
6174696F6E3E0A
</VALUE></PLUGINDATA>
</PLUGINDATALIST>
</PROJECT>
#include "FT_VehSpeedCalc.h"
typedef struct{
unsigned int N;
unsigned int VehSpd;
}s_VehSpeedInfo_Buffer;
s_VehSpeedInfo_Buffer MsgToSpd;
s_VehSpeedInfo_Buffer SpdToMsg;
unsigned int FT_WheelRadius = 309;
unsigned int FT_WheelTeeth = 68;
unsigned int FT_WheelRatio = 5135;
void SetWheelInfo(unsigned int Radius, unsigned int Teeth){
unsigned long wTemp;
wTemp = Radius;
wTemp = 2 * 314 * wTemp / Teeth;
wTemp = wTemp * 36 * 50;
wTemp = wTemp / 1000;
FT_WheelRatio = wTemp;
}
unsigned int TestMsg;
void FT_VehSpeedCalc_Main(unsigned int Data, unsigned int *DestData, unsigned char Dir){
unsigned long wTemp;
switch(Dir){
case CANMESSAGE_TO_SPEED:{
}break;
case SPEED_TO_CANMESSAGE:{
SpdToMsg.VehSpd = Data;
wTemp = SpdToMsg.VehSpd;
wTemp = wTemp * 1000 * 2;
wTemp = wTemp / FT_WheelRatio;
TestMsg = wTemp;
SpdToMsg.N += wTemp;
if(SpdToMsg.N > 64255){
SpdToMsg.N -= 64255;
}
*DestData = SpdToMsg.N;
}break;
default:
;
}
}
void FT_Fill_VehSpeedCANMessage(unsigned int val, unsigned char *Data){
Data[0] = val;
Data[1] = val >> 8;
Data[2] = val;
Data[3] = val >> 8;
Data[4] = val;
Data[5] = val >> 8;
Data[6] = val;
Data[7] = val >> 8;
}
\ No newline at end of file
#ifndef __FT_VEHSPEEDCALC_H_
#define __FT_VEHSPEEDCALC_H_
#define SPEED_TO_CANMESSAGE 1
#define CANMESSAGE_TO_SPEED 0
void SetWheelInfo(unsigned int Radius, unsigned int Teeth);
void FT_VehSpeedCalc_Main(unsigned int Data, unsigned int *DestData, unsigned char Dir);
void FT_Fill_VehSpeedCANMessage(unsigned int val, unsigned char *Data);
#endif
\ No newline at end of file
#include "TimeCtrl.h"
typedef struct{
unsigned int Time;
unsigned char En;
}s_TimeCtrl;
s_TimeCtrl TimeCtrl[TimeSNMax];
typedef struct{
unsigned int Timer_2ms;
unsigned int Timer_10ms;
}s_BaseTimer;
s_BaseTimer BaseTimer;
/*************************************************************************
* Timer Control
*************************************************************************/
void InitTimeCtrl(void){
unsigned char i;
for(i = 0; i < TimeSNMax; i++){
TimeCtrl[i].Time = 0;
TimeCtrl[i].En = 0;
}
BaseTimer.Timer_2ms = 0;
BaseTimer.Timer_10ms = 0;
}
void TimerCtrlms(unsigned int time){
unsigned char i;
for(i = 0; i < TimeSNMax; i++){
if(TimeCtrl[i].En){
if(TimeCtrl[i].Time < MAX_CTRL_TIME){
TimeCtrl[i].Time += time;
}
}else{
TimeCtrl[i].Time = 0;
}
}
}
void EnableTimeCtrl(e_TimeSN sn){
if(!TimeCtrl[sn].En){
TimeCtrl[sn].En = 1;
TimeCtrl[sn].Time = 0;
}
}
void DisableTimeCtrl(e_TimeSN sn){
if(TimeCtrl[sn].En){
TimeCtrl[sn].En = 0;
TimeCtrl[sn].Time = 0;
}
}
void ClearCtrlTime(e_TimeSN sn){
TimeCtrl[sn].Time = 0;
}
unsigned int GetCtrlTime(e_TimeSN sn){
return TimeCtrl[sn].Time;
}
/*************************************************************************
* Timer Task
* 2ms / 10ms
*************************************************************************/
void Timer_1ms_Base(void){
if(BaseTimer.Timer_10ms <= 5000){
BaseTimer.Timer_10ms += 1;
}
if(BaseTimer.Timer_2ms <= 5000){
BaseTimer.Timer_2ms += 1;
}
}
void Timer_2ms_Task(void){
unsigned int n;
unsigned char i;
if(BaseTimer.Timer_2ms >= 2){
n = BaseTimer.Timer_2ms / 2;
BaseTimer.Timer_2ms = BaseTimer.Timer_2ms - (n * 2);
TimerCtrlms(2 * n);
}
}
void Timer_10ms_Task(void){
unsigned int n;
unsigned char i;
if(BaseTimer.Timer_10ms >= 10){
n = BaseTimer.Timer_10ms / 10;
BaseTimer.Timer_10ms = BaseTimer.Timer_10ms - (n * 10);
}
}
\ No newline at end of file
#ifndef __TIMECTRL_H_
#define __TIMECTRL_H_
#define MAX_CTRL_TIME 15000 //ms
typedef enum{
CANMsgSend_10ms = 0,
CANMsgSend_20ms,
CANMsgSend_50ms,
CANMsgSend_100ms,
CANMsgSend_200ms,
CANMsgSend_500ms,
CANMsgSend_1s,
CANMsgSend_10s,
TwoLamp_Ctrl,
TimeSNMax,
}e_TimeSN;
void InitTimeCtrl(void);
void TimerCtrlms(unsigned int time);
void EnableTimeCtrl(e_TimeSN sn);
void DisableTimeCtrl(e_TimeSN sn);
void ClearCtrlTime(e_TimeSN sn);
unsigned int GetCtrlTime(e_TimeSN sn);
void Timer_1ms_Base(void);
void Timer_2ms_Task(void);
void Timer_10ms_Task(void);
#endif
\ No newline at end of file
[STARTUP]
CPUTARGETTYPE=0
USE_CYCLONEPRO_RELAYS=0
PORT=1
interface_selection=0
SHOWDIALOG=0
IO_DELAY_SET=1
frequency_has_changed_old_io_delay_cnt=14
CyclonePro_poweroffonexit=0
CyclonePro_currentvoltage=255
CyclonePro_PowerDownDelay=250
CyclonePro_PowerUpDelay=250
IO_DELAY_CNT=14
PCI_DELAY=0
RESET_DELAY=0
[Environment Variables]
GENPATH={Project}Sources;{Compiler}lib\hc12c\src;{Compiler}lib\hc12c\include;{Compiler}lib\hc12c\lib;{Compiler}lib\xgatec\src;{Compiler}lib\xgatec\include;{Compiler}lib\xgatec\lib
LIBPATH={Compiler}lib\hc12c\include;{Compiler}lib\xgatec\include
OBJPATH={Project}bin
TEXTPATH={Project}bin
ABSPATH={Project}bin
[HI-WAVE]
Target=TBDML
Layout=C_layout.hwl
LoadDialogOptions=AUTOERASEANDFLASH RUNANDSTOPAFTERLOAD="main"
CPU=HC12
AEFWarningDialog=FALSE
MainFrame=2,3,-32000,-32000,-1,-1,108,-2,1133,531
TOOLBAR=57600 57601 32795 0 57635 57634 57637 0 57671 57669 0 32777 32776 32782 32780 32781 32778 0 32806
Configuration=P&E_Multilink_USB.hwc
Statusbar=1
ShowToolbar=1
Smallborder=0
Hideheadline=0
Hidetitle=0
[HC12MultilinkCyclonePro_GDI_SETTINGS]
CMDFILE0=CMDFILE STARTUP ON ".\cmd\P&E_Multilink_USB_startup.cmd"
CMDFILE1=CMDFILE RESET ON ".\cmd\P&E_Multilink_USB_reset.cmd"
CMDFILE2=CMDFILE PRELOAD ON ".\cmd\P&E_Multilink_USB_preload.cmd"
CMDFILE3=CMDFILE POSTLOAD ON ".\cmd\P&E_Multilink_USB_postload.cmd"
CMDFILE4=CMDFILE VPPON ON ".\cmd\P&E_Multilink_USB_vppon.cmd"
CMDFILE5=CMDFILE VPPOFF ON ".\cmd\P&E_Multilink_USB_vppoff.cmd"
CMDFILE6=CMDFILE UNSECURE ON ".\cmd\P&E_Multilink_USB_erase_unsecure_hcs12p.cmd"
MCUId=0x2F2
CHIPSECURE=CHIPSECURE SETUP 0xFF0F 0x3 0x2
DBG0=DBG GENERAL DISARM_ON PROTECT_OFF ANALYZE_ON STEPATRUN_ON
DBG1=DBG PREDEFINED SELECT 0
DBG2=DBG PREDEFINED DBGENGINE TRACE ENABLE RECORDAFTER PUREPC
NV_PARAMETER_FILE=
NV_SAVE_WSP=0
NV_AUTO_ID=1
[ICD12]
COMSETTINGS=SETCOMM DRIVER NOPROTOCOL NOPERIODICAL
SETCLKSW=0
HOTPLUGGING=0
DETECTRUNNING=0
RESYNCONCOPRESET=0
BDMAutoSpeed=0
BDMClockSpeed=14
HIGHIODELAYCONSTFORPLL=40
[PORT]
IP=
[Recent Applications File List]
File0=D:\李亭龙工作\天有为工作\我的程序\Freescale\CAN检测软件\CAN FC-3跑表架\bin\Project.abs
File1=D:\李亭龙工作\天有为工作\我的程序\Freescale\CAN检测软件\CAN NL-1跑表架\bin\Project.abs
File2=D:\李亭龙工作\天有为工作\我的程序\Freescale\CAN检测软件\CAN 扩展帧\bin\Project.abs
File3=F:\21--505CAN检测程序\CAN检测软件\bin\Project.abs
LoadFlags0=AUTOERASEANDFLASH RUNANDSTOPAFTERLOAD="main"
LoadFlags1=AUTOERASEANDFLASH RUNANDSTOPAFTERLOAD="main"
LoadFlags2=AUTOERASEANDFLASH RUNANDSTOPAFTERLOAD="main"
LoadFlags3=AUTOERASEANDFLASH RUNANDSTOPAFTERLOAD="main"
[Recent Layout File List]
File0=C_layout.hwl
File1=
File2=
File3=
[TBDML]
COMSETTINGS=SETCOMM DRIVER NOPROTOCOL NOPERIODICAL
[TBDML HCS12_GDI_SETTINGS]
CMDFILE0=CMDFILE STARTUP ON "startup.cmd"
CMDFILE1=CMDFILE RESET ON "reset.cmd"
CMDFILE2=CMDFILE PRELOAD ON "preload.cmd"
CMDFILE3=CMDFILE POSTLOAD ON "postload.cmd"
MCUId=0x2F2
CMDFILE4=CMDFILE VPPON ON "vppon.cmd"
CMDFILE5=CMDFILE VPPOFF ON "vppoff.cmd"
CMDFILE6=CMDFILE UNSECURE ON "unsecure.cmd"
CHIPSECURE=CHIPSECURE SETUP 0xFF0F 0x3 0x2
DBG0=DBG GENERAL DISARM_ON PROTECT_OFF ANALYZE_ON STEPATRUN_ON
DBG1=DBG PREDEFINED SELECT 0
DBG2=DBG PREDEFINED DBGENGINE TRACE ENABLE RECORDAFTER PUREPC
NV_PARAMETER_FILE=C:\Program Files (x86)\Freescale\CWS12v5.1\prog\FPP\mcu02F2.fpp
NV_SAVE_WSP=0
NV_AUTO_ID=1
/*****************************************************
start12.c - standard startup code
The startup code may be optimized to special user requests
----------------------------------------------------
Copyright (c) Metrowerks, Basel, Switzerland
All rights reserved
Note: ROM libraries are not implemented in this startup code
Note: C++ destructors of global objects are NOT yet supported in the HIWARE Object File Format.
To use this feature, please build your application with the ELF object file format.
*****************************************************/
/* these macros remove some unused fields in the startup descriptor */
#define __NO_FLAGS_OFFSET /* we do not need the flags field in the startup data descriptor */
#define __NO_MAIN_OFFSET /* we do not need the main field in the startup data descriptor */
#define __NO_STACKOFFSET_OFFSET /* we do not need the stackOffset field in the startup data descriptor */
/*#define __BANKED_COPY_DOWN : allow to allocate .copy in flash area */
#if defined(__BANKED_COPY_DOWN) && (!defined(__HCS12X__) || !defined(__ELF_OBJECT_FILE_FORMAT__))
#error /* the __BANKED_COPY_DOWN switch is only supported for the HCS12X with ELF */
/* (and not for the HC12, HCS12 or for the HIWARE object file format) */
#endif
#include "hidef.h"
#include "start12.h"
/***************************************************************************/
/* Macros to control how the startup code handles the COP: */
/* #define _DO_FEED_COP_ : do feed the COP */
/* #define _DO_ENABLE_COP_: do enable the COP */
/* #define _DO_DISABLE_COP_: disable the COP */
/* Without defining any of these, the startup code does NOT handle the COP */
/***************************************************************************/
/* __ONLY_INIT_SP define: */
/* This define selects an shorter version of the startup code */
/* which only loads the stack pointer and directly afterwards calls */
/* main. This version does however NOT initialized global variables */
/* (So this version is not ANSI compliant!) */
/***************************************************************************/
/* __FAR_DATA define: */
/* By default, the startup code only supports to initialize the default */
/* kind of memory. If some memory is allocated far in the small or banked */
/* memory model, then the startup code only supports to initialize this */
/* memory blocks if __FAR_DATA is defined. If __FAR_DATA is not defined, */
/* then the linker will issue a message like */
/* "L1128: Cutting value _Range beg data member from 0xF01000 to 0x1000" */
/* and this startup code writes to the cutted address */
/***************************************************************************/
/* __BANKED_COPY_DOWN define: */
/* by default, the startup code assumes that the startup data structure */
/* _startupData, the zero out areas and the .copy section are all */
/* allocated in NON_BANKED memory. Especially the .copy section can be */
/* huge if there are many or huge RAM areas to initialize. */
/* For the HCS12X, which also copies the XGATE RAM located code via .copy */
/* section, the startup code supports to allocate .copy in a banked flash */
/* The placement of .copy in the prm file has to be adapted when adding or */
/* removing the this macro. */
/* Note: This macro is only supported for the HCS12X and when using ELF */
/***************************************************************************/
#ifdef __cplusplus
#define __EXTERN_C extern "C"
#else
#define __EXTERN_C
#endif
/*lint -estring(961,"only preprocessor statements and comments before '#include'") , MISRA 19.1 ADV, non_bank.sgm and default.sgm each contain a conditionally compiled CODE_SEG pragma */
__EXTERN_C void main(void); /* prototype of main function */
#ifndef __ONLY_INIT_SP
#pragma DATA_SEG __NEAR_SEG STARTUP_DATA /* _startupData can be accessed using 16 bit accesses. */
/* This is needed because it contains the stack top, and without stack, far data cannot be accessed */
struct _tagStartup _startupData; /* read-only: */
/* _startupData is allocated in ROM and */
/* initialized by the linker */
#pragma DATA_SEG DEFAULT
#endif /* __ONLY_INIT_SP */
#if defined(FAR_DATA) && (!defined(__HCS12X__) || defined(__BANKED_COPY_DOWN))
/*lint -e451 non_bank.sgm contains a conditionally compiled CODE_SEG pragma */
#include "non_bank.sgm"
/*lint +e451 */
/* the init function must be in non banked memory if banked variables are used */
/* because _SET_PAGE is called, which may change any page register. */
/*lint -esym(752,_SET_PAGE) , symbol '_SET_PAGE' is referenced in HLI */
__EXTERN_C void _SET_PAGE(void); /* the inline assembler needs a prototype */
/* this is a runtime routine with a special */
/* calling convention, do not use it in c code! */
#else
/*lint -e451 default.sgm contains a conditionally compiled CODE_SEG pragma */
#include "default.sgm"
/*lint +e451 */
#endif /* defined(FAR_DATA) && (!defined(__HCS12X__) || defined(__BANKED_COPY_DOWN)) */
/* define value and bits for Windef Register */
#ifdef HC812A4
#define WINDEF (*(volatile unsigned char*) 0x37)
#if defined( __BANKED__) || defined(__LARGE__) || defined(__PPAGE__)
#define __ENABLE_PPAGE__ 0x40
#else
#define __ENABLE_PPAGE__ 0x0
#endif
#if defined(__DPAGE__)
#define __ENABLE_DPAGE__ 0x80
#else
#define __ENABLE_DPAGE__ 0x0
#endif
#if defined(__EPAGE__)
#define __ENABLE_EPAGE__ 0x20
#else
#define __ENABLE_EPAGE__ 0x0
#endif
#endif /* HC812A4 */
#ifdef _HCS12_SERIALMON
/* for Monitor based software remap the RAM & EEPROM to adhere
to EB386. Edit RAM and EEPROM sections in PRM file to match these. */
#define ___INITRM (*(volatile unsigned char *) 0x0010)
#define ___INITRG (*(volatile unsigned char *) 0x0011)
#define ___INITEE (*(volatile unsigned char *) 0x0012)
#endif
#if defined(_DO_FEED_COP_)
#define __FEED_COP_IN_HLI() } asm movb #0x55, _COP_RST_ADR; asm movb #0xAA, _COP_RST_ADR; asm {
#else
#define __FEED_COP_IN_HLI() /* do nothing */
#endif
#ifndef __ONLY_INIT_SP
#if (!defined(FAR_DATA) || defined(__HCS12X__)) && (defined( __BANKED__) || defined(__LARGE__) || defined(__BANKED_COPY_DOWN))
static void __far Init(void)
#else
static void Init(void)
#endif
{
/* purpose: 1) zero out RAM-areas where data is allocated */
/* 2) copy initialization data from ROM to RAM */
/* 3) call global constructors in C++ */
/* called from: _Startup, LibInits */
asm {
ZeroOut:
#if defined(__HIWARE_OBJECT_FILE_FORMAT__) && defined(__LARGE__)
LDX _startupData.pZeroOut:1 ; in the large memory model in the HIWARE format, pZeroOut is a 24 bit pointer
#else
LDX _startupData.pZeroOut ; *pZeroOut
#endif
LDY _startupData.nofZeroOuts ; nofZeroOuts
BEQ CopyDown ; if nothing to zero out
NextZeroOut: PSHY ; save nofZeroOuts
#if defined(FAR_DATA)
LDAB 1,X+ ; load page of destination address
LDY 2,X+ ; load offset of destination address
#if defined(__HCS12X__)
STAB __GPAGE_ADR__
#else /* defined(__HCS12X__) */
__PIC_JSR(_SET_PAGE) ; sets the page in the correct page register
#endif /* defined(__HCS12X__) */
#else /* FAR_DATA */
LDY 2,X+ ; start address and advance *pZeroOut (X = X+4)
#endif /* FAR_DATA */
#if defined(__HCS12X__) && defined(FAR_DATA)
PSHX
LDX 0,X ; byte count
#if defined(__OPTIMIZE_FOR_SIZE__)
CLRA
NextWord: GSTAA 1,Y+ ; clear memory byte
__FEED_COP_IN_HLI() ; feed the COP if necessary /*lint !e505 !e522 asm code */
DBNE X, NextWord ; dec byte count
#else
LDD #0
LSRX
BEQ LoopClrW1 ; do we copy more than 1 byte?
NextWord: GSTD 2,Y+ ; clear memory word
__FEED_COP_IN_HLI() ; feed the COP if necessary /*lint !e505 !e522 asm code */
DBNE X, NextWord ; dec word count
LoopClrW1:
BCC LastClr ; handle last byte
GSTAA 1,Y+ ; handle last byte
LastClr:
#endif
PULX
LEAX 2,X
#elif defined(__OPTIMIZE_FOR_SIZE__) /* -os, default */
LDD 2,X+ ; byte count
NextWord: CLR 1,Y+ ; clear memory byte
__FEED_COP_IN_HLI() ; feed the COP if necessary /*lint !e505 !e522 asm code */
DBNE D, NextWord ; dec byte count
#else /* __OPTIMIZE_FOR_TIME__ */
LDD 2,X+ ; byte count
LSRD ; /2 and save bit 0 in the carry
BEQ LoopClrW1 ; do we copy more than 1 byte?
PSHX
LDX #0
LoopClrW: STX 2,Y+ ; Word-Clear
__FEED_COP_IN_HLI() ; feed the COP if necessary /*lint !e505 !e522 asm code */
DBNE D, LoopClrW
PULX
LoopClrW1:
BCC LastClr ; handle last byte
CLR 1,Y+
LastClr:
#endif /* __OPTIMIZE_FOR_SIZE__/__OPTIMIZE_FOR_TIME__ */
PULY ; restore nofZeroOuts
DEY ; dec nofZeroOuts
BNE NextZeroOut
CopyDown:
#if defined(__BANKED_COPY_DOWN)
LDAA _startupData.toCopyDownBeg:0 ; get PAGE address of .copy section
STAA __PPAGE_ADR__ ; set PPAGE address
LDX _startupData.toCopyDownBeg:1 ; load address of copy down desc.
#elif defined(__ELF_OBJECT_FILE_FORMAT__)
LDX _startupData.toCopyDownBeg ; load address of copy down desc.
#else
LDX _startupData.toCopyDownBeg:2 ; load address of copy down desc.
#endif
NextBlock:
LDD 2,X+ ; size of init-data -> D
BEQ funcInits ; end of copy down desc.
#ifdef FAR_DATA
PSHD ; save counter
LDAB 1,X+ ; load destination page
LDY 2,X+ ; destination address
#if defined(__HCS12X__)
STAB __GPAGE_ADR__
#else /* __HCS12X__ */
__PIC_JSR(_SET_PAGE) ; sets the destinations page register
#endif /* __HCS12X__ */
PULD ; restore counter
#else /* FAR_DATA */
LDY 2,X+ ; load destination address
#endif /* FAR_DATA */
#if defined(__HCS12X__) && defined(FAR_DATA)
#if defined(__OPTIMIZE_FOR_SIZE__) /* -os, default */
Copy: PSHA
LDAA 1,X+
GSTAA 1,Y+ ; move a byte from ROM to the data area
PULA
__FEED_COP_IN_HLI() ; feed the COP if necessary /*lint !e505 !e522 asm code */
DBNE D,Copy ; copy-byte loop
#else
LSRD ; /2 and save bit 0 in the carry
BEQ Copy1 ; do we copy more than 1 byte?
Copy: PSHD
LDD 2,X+
GSTD 2,Y+ ; move a word from ROM to the data area
PULD
__FEED_COP_IN_HLI() ; feed the COP if necessary /*lint !e505 !e522 asm code */
DBNE D,Copy ; copy-word loop
Copy1:
BCC NextBlock ; handle last byte?
LDAA 1,X+
GSTAA 1,Y+ ; move a byte from ROM to the data area
#endif
#elif defined(__OPTIMIZE_FOR_SIZE__) /* -os, default */
Copy: MOVB 1,X+,1,Y+ ; move a byte from ROM to the data area
__FEED_COP_IN_HLI() ; feed the COP if necessary /*lint !e505 !e522 asm code */
DBNE D,Copy ; copy-byte loop
#else /* __OPTIMIZE_FOR_TIME__ */
LSRD ; /2 and save bit 0 in the carry
BEQ Copy1 ; do we copy more than 1 byte?
Copy: MOVW 2,X+,2,Y+ ; move a word from ROM to the data area
__FEED_COP_IN_HLI() ; feed the COP if necessary /*lint !e505 !e522 asm code */
DBNE D,Copy ; copy-word loop
Copy1:
BCC NextBlock ; handle last byte?
MOVB 1,X+,1,Y+ ; copy the last byte
#endif /* __OPTIMIZE_FOR_SIZE__/__OPTIMIZE_FOR_TIME__ */
BRA NextBlock
funcInits: ; call of global construtors is only in c++ necessary
#if defined(__cplusplus)
#if defined(__ELF_OBJECT_FILE_FORMAT__)
#if defined( __BANKED__) || defined(__LARGE__)
LDY _startupData.nofInitBodies; load number of cpp.
BEQ done ; if cppcount == 0, goto done
LDX _startupData.initBodies ; load address of first module to initialize
nextInit:
LEAX 3,X ; increment to next init
PSHX ; save address of next function to initialize
PSHY ; save cpp counter
CALL [-3,X] ; use double indirect call to load the page register also
PULY ; restore cpp counter
PULX ; restore actual address
DEY ; decrement cpp counter
BNE nextInit
#else /* defined( __BANKED__) || defined(__LARGE__) */
LDD _startupData.nofInitBodies; load number of cpp.
BEQ done ; if cppcount == 0, goto done
LDX _startupData.initBodies ; load address of first module to initialize
nextInit:
LDY 2,X+ ; load address of first module to initialize
PSHD
PSHX ; save actual address
JSR 0,Y ; call initialization function
PULX ; restore actual address
PULD ; restore cpp counter
DBNE D, nextInit
#endif /* defined( __BANKED__) || defined(__LARGE__) */
#else /* __ELF_OBJECT_FILE_FORMAT__ */
LDX _startupData.mInits ; load address of first module to initialize
#if defined( __BANKED__) || defined(__LARGE__)
nextInit: LDY 3,X+ ; load address of initialization function
BEQ done ; stop when address == 0
; in common environments the offset of a function is never 0, so this test could be avoided
#ifdef __InitFunctionsMayHaveOffset0__
BRCLR -1,X, done, 0xff ; stop when address == 0
#endif /* __InitFunctionsMayHaveOffset0__ */
PSHX ; save address of next function to initialize
CALL [-3,X] ; use double indirect call to load the page register also
#else /* defined( __BANKED__) || defined(__LARGE__) */
nextInit:
LDY 2,X+ ; load address of first module to initialize
BEQ done ; stop when address of function == 0
PSHX ; save actual address
JSR 0,Y ; call initialization function
#endif /* defined( __BANKED__) || defined(__LARGE__) */
PULX ; restore actual address
BRA nextInit
#endif /* __ELF_OBJECT_FILE_FORMAT__ */
done:
#endif /* __cplusplus */
}
}
#endif /* __ONLY_INIT_SP */
#if defined( __ELF_OBJECT_FILE_FORMAT__) && defined(__cplusplus ) && 0 /* the call to main does not support to return anymore */
#if !defined(FAR_DATA) && (defined( __BANKED__) || defined(__LARGE__))
static void __far Fini(void)
#else
static void Fini(void)
#endif
{
/* purpose: 1) call global destructors in C++ */
asm {
#if defined( __BANKED__) || defined(__LARGE__)
LDY _startupData.nofFiniBodies; load number of cpp.
BEQ done ; if cppcount == 0, goto done
LDX _startupData.finiBodies ; load address of first module to finalize
nextInit2:
LEAX 3,X ; increment to next init
PSHX ; save address of next function to finalize
PSHY ; save cpp counter
CALL [-3,X] ; use double indirect call to load the page register also
PULY ; restore cpp counter
PULX ; restore actual address
DEY ; decrement cpp counter
BNE nextInit2
#else /* defined( __BANKED__) || defined(__LARGE__) */
LDD _startupData.nofFiniBodies; load number of cpp.
BEQ done ; if cppcount == 0, goto done
LDX _startupData.finiBodies ; load address of first module to finalize
nextInit2:
LDY 2,X+ ; load address of first module to finalize
PSHD
PSHX ; save actual address
JSR 0,Y ; call finalize function
PULX ; restore actual address
PULD ; restore cpp counter
DBNE D, nextInit2
#endif /* defined(__BANKED__) || defined(__LARGE__) */
done:;
}
}
#endif
/*lint -e451 non_bank.sgm contains a conditionally compiled CODE_SEG pragma */
#include "non_bank.sgm"
/*lint +e451 */
#pragma MESSAGE DISABLE C12053 /* Stack-pointer change not in debugging-information */
#pragma NO_FRAME
#pragma NO_ENTRY
#if !defined(__SMALL__)
#pragma NO_EXIT
#endif
/* The function _Startup must be called in order to initialize global variables and to call main */
/* You can adapt this function or call it from your startup code to implement a different startup */
/* functionality. */
/* You should also setup the needed IO registers as WINDEF (HC12A4 only) or the COP registers to run */
/* on hardware */
/* to set the reset vector several ways are possible : */
/* 1. define the function with "interrupt 0" as done below in the first case */
/* 2. add the following line to your prm file : VECTOR ADDRESS 0xfffe _Startup */
/* of course, even more posibilities exists */
/* the reset vector must be set so that the application has a defined entry point */
#if defined(__SET_RESET_VECTOR__)
__EXTERN_C void __interrupt 0 _Startup(void) {
#else
__EXTERN_C void _Startup(void) {
#endif
/* purpose: 1) initialize the stack
2) initialize the RAM, copy down init data etc (Init)
3) call main;
parameters: NONE
called from: _PRESTART-code generated by the Linker
or directly referenced by the reset vector */
/* initialize the stack pointer */
/*lint -e{960} , MISRA 14.3 REQ, macro INIT_SP_FROM_STARTUP_DESC() expands to HLI code */
/*lint -e{522} , MISRA 14.2 REQ, macro INIT_SP_FROM_STARTUP_DESC() expands to HLI code */
INIT_SP_FROM_STARTUP_DESC(); /* HLI macro definition in hidef.h */
#if defined(_HCS12_SERIALMON)
/* for Monitor based software remap the RAM & EEPROM to adhere
to EB386. Edit RAM and EEPROM sections in PRM file to match these. */
___INITRG = 0x00; /* lock registers block to 0x0000 */
___INITRM = 0x39; /* lock Ram to end at 0x3FFF */
___INITEE = 0x09; /* lock EEPROM block to end at 0x0fff */
#endif
/* Here user defined code could be inserted, the stack could be used */
#if defined(_DO_DISABLE_COP_)
_DISABLE_COP();
#endif
/* Example : Set up WinDef Register to allow Paging */
#ifdef HC812A4 /* HC12 A4 derivative needs WINDEF to configure which pages are available */
#if (__ENABLE_EPAGE__ != 0 || __ENABLE_DPAGE__ != 0 || __ENABLE_PPAGE__ != 0)
WINDEF= __ENABLE_EPAGE__ | __ENABLE_DPAGE__ | __ENABLE_PPAGE__;
#endif
#endif
#if (defined(__MAP_RAM__) || defined(__MAP_FLASH__) || defined(__MAP_EXTERNAL__)) && !defined(__DO_SET_MMCTL1__)
#define __DO_SET_MMCTL1__
#endif
#if defined(__DO_SET_MMCTL1__)
/* Set the MMCTL1 byte. Please use for HCS12XE and change the bits according */
/* to your configuration. */
/* Note: MMCTL1 is write once therefore please adapt this initialization here. */
/* This has to be done prior to the call to Init. */
#define _MMCTL1_ADR (0x00000013)
#define _MMCTL1_BIT_TGMRAMON (1<<7) /* EEE Tag RAM and FTM SCRATCH RAM visible in the memory map */
#define _MMCTL1_BIT_EEEIFRON (1<<5) /* EEE IFR visible in the memory map */
#define _MMCTL1_BIT_PGMIFRON (1<<4) /* Program IFR visible in the memory map */
#define _MMCTL1_BIT_RAMHM (1<<3) /* RAM only in the higher half of the memory map */
#define _MMCTL1_BIT_EROMON (1<<2) /* Enables emulated Flash or ROM memory in the memory map */
#define _MMCTL1_BIT_ROMHM (1<<1) /* FLASH or ROM only in higher Half of Memory Map */
#define _MMCTL1_BIT_ROMON (1<<0) /* Enable FLASH or ROM in the memory map */
#define _MMCTL1_SET(value) ((*(volatile unsigned char*)_MMCTL1_ADR)= (value))
#if defined(__MAP_FLASH__)
_MMCTL1_SET(_MMCTL1_BIT_ROMON | _MMCTL1_BIT_EROMON);
#elif defined(__MAP_EXTERNAL__)
_MMCTL1_SET(_MMCTL1_BIT_ROMON | _MMCTL1_BIT_EROMON | _MMCTL1_BIT_ROMHM);
#else /* RAM */
_MMCTL1_SET(_MMCTL1_BIT_ROMON | _MMCTL1_BIT_EROMON | _MMCTL1_BIT_RAMHM | _MMCTL1_BIT_ROMHM);
#endif
#endif
#ifndef __ONLY_INIT_SP
/*lint -e{522} , MISRA 14.2 REQ, function Init() contains HLI only */
Init(); /* zero out, copy down, call constructors */
#endif
/* Here user defined code could be inserted, all global variables are initilized */
#if defined(_DO_ENABLE_COP_)
_ENABLE_COP(1);
#endif
/* call main() */
main();
}
/*lint --e{766} , non_bank.sgm is not a regular header file, it contains a conditionally compiled CODE_SEG pragma */
/*lint +estring(961,"only preprocessor statements and comments before '#include'") */
/*lint +e451 */
/******************************************************************************
FILE : datapage.c
PURPOSE : paged data access runtime routines
MACHINE : Freescale 68HC12 (Target)
LANGUAGE : ANSI-C
HISTORY : 21.7.96 first version created
******************************************************************************/
#include "hidef.h"
#include "non_bank.sgm"
#include "runtime.sgm"
/*lint --e{957} , MISRA 8.1 REQ, these are runtime support functions and, as such, are not meant to be called in user code; they are only invoked via jumps, in compiler-generated code */
/*lint -estring(553, __OPTION_ACTIVE__) , MISRA 19.11 REQ , __OPTION_ACTIVE__ is a built-in compiler construct to check for active compiler options */
#ifndef __HCS12X__ /* it's different for the HCS12X. See the text below at the #else // __HCS12X__ */
/*
According to the -Cp option of the compiler the
__DPAGE__, __PPAGE__ and __EPAGE__ macros are defined.
If none of them is given as argument, then no page accesses should occur and
this runtime routine should not be used !
To be on the save side, the runtime routines are created anyway.
*/
/* Compile with option -DHCS12 to activate this code */
#if defined(HCS12) || defined(_HCS12) || defined(__HCS12__)
#ifndef PPAGE_ADDR
#ifdef __PPAGE_ADR__
#define PPAGE_ADDR __PPAGE_ADR__
#else
#define PPAGE_ADDR (0x30 + REGISTER_BASE)
#endif
#endif
#ifndef __PPAGE__ /* may be set already by option -CPPPAGE */
#define __PPAGE__
#endif
/* Compile with option -DDG128 to activate this code */
#elif defined DG128 /* HC912DG128 derivative has PPAGE register only at 0xFF */
#ifndef PPAGE_ADDR
#define PPAGE_ADDR (0xFF+REGISTER_BASE)
#endif
#ifndef __PPAGE__ /* may be set already by option -CPPPAGE */
#define __PPAGE__
#endif
#elif defined(HC812A4)
/* all setting default to A4 already */
#endif
#if !defined(__EPAGE__) && !defined(__PPAGE__) && !defined(__DPAGE__)
/* as default use all page registers */
#define __DPAGE__
#define __EPAGE__
#define __PPAGE__
#endif
/* modify the following defines to your memory configuration */
#define EPAGE_LOW_BOUND 0x400u
#define EPAGE_HIGH_BOUND 0x7ffu
#define DPAGE_LOW_BOUND 0x7000u
#define DPAGE_HIGH_BOUND 0x7fffu
#define PPAGE_LOW_BOUND (DPAGE_HIGH_BOUND+1u)
#define PPAGE_HIGH_BOUND 0xBFFFu
#ifndef REGISTER_BASE
#define REGISTER_BASE 0x0u
#endif
#ifndef DPAGE_ADDR
#define DPAGE_ADDR (0x34u+REGISTER_BASE)
#endif
#ifndef EPAGE_ADDR
#define EPAGE_ADDR (0x36u+REGISTER_BASE)
#endif
#ifndef PPAGE_ADDR
#define PPAGE_ADDR (0x35u+REGISTER_BASE)
#endif
/*
The following parts about the defines are assumed in the code of _GET_PAGE_REG :
- the memory region controlled by DPAGE is above the area controlled by the EPAGE and
below the area controlled by the PPAGE.
- the lower bound of the PPAGE area is equal to be the higher bound of the DPAGE area + 1
*/
#if (EPAGE_LOW_BOUND >= EPAGE_HIGH_BOUND) || (EPAGE_HIGH_BOUND >= DPAGE_LOW_BOUND) || (DPAGE_LOW_BOUND >= DPAGE_HIGH_BOUND) || (DPAGE_HIGH_BOUND >= PPAGE_LOW_BOUND) || (PPAGE_LOW_BOUND >= PPAGE_HIGH_BOUND)
#error /* please adapt _GET_PAGE_REG for this non default page configuration */
#endif
#if (DPAGE_HIGH_BOUND+1u) != PPAGE_LOW_BOUND
#error /* please adapt _GET_PAGE_REG for this non default page configuration */
#endif
/* this module does either control if any access is in the bounds of the specified page or */
/* ,if only one page is specified, just use this page. */
/* This behavior is controlled by the define USE_SEVERAL_PAGES. */
/* If !USE_SEVERAL_PAGES does increase the performance significantly */
/* NOTE : When !USE_SEVERAL_PAGES, the page is also set for accesses outside of the area controlled */
/* by this single page. But this is should not cause problems because the page is restored to the old value before any other access could occur */
#if !defined(__DPAGE__) && !defined(__EPAGE__) && !defined(__PPAGE__)
/* no page at all is specified */
/* only specifying the right pages will speed up these functions a lot */
#define USE_SEVERAL_PAGES 1
#elif (defined(__DPAGE__) && defined(__EPAGE__)) || (defined(__DPAGE__) && defined(__PPAGE__)) || (defined(__EPAGE__) && defined(__PPAGE__))
/* more than one page register is used */
#define USE_SEVERAL_PAGES 1
#else
#define USE_SEVERAL_PAGES 0
#if defined(__DPAGE__) /* check which pages are used */
#define PAGE_ADDR PPAGE_ADDR
#elif defined(__EPAGE__)
#define PAGE_ADDR EPAGE_ADDR
#elif defined(__PPAGE__)
#define PAGE_ADDR PPAGE_ADDR
#else /* we do not know which page, decide it at runtime */
#error /* must not happen */
#endif
#endif
#if USE_SEVERAL_PAGES /* only needed for several pages support */
/*--------------------------- _GET_PAGE_REG --------------------------------
Runtime routine to detect the right register depending on the 16 bit offset part
of an address.
This function is only used by the functions below.
Depending on the compiler options -Cp different versions of _GET_PAGE_REG are produced.
Arguments :
- Y : offset part of an address
Result :
if address Y is controlled by a page register :
- X : address of page register if Y is controlled by an page register
- Zero flag cleared
- all other registers remain unchanged
if address Y is not controlled by a page register :
- Zero flag is set
- all registers remain unchanged
--------------------------- _GET_PAGE_REG ----------------------------------*/
#if defined(__DPAGE__)
#ifdef __cplusplus
extern "C"
#endif
#pragma NO_ENTRY
#pragma NO_EXIT
#pragma NO_FRAME
static void NEAR _GET_PAGE_REG(void) { /*lint -esym(528, _GET_PAGE_REG) used in asm code */
asm {
L_DPAGE:
CPY #DPAGE_LOW_BOUND ;/* test of lower bound of DPAGE */
#if defined(__EPAGE__)
BLO L_EPAGE ;/* EPAGE accesses are possible */
#else
BLO L_NOPAGE ;/* no paged memory below accesses */
#endif
CPY #DPAGE_HIGH_BOUND ;/* test of higher bound DPAGE/lower bound PPAGE */
#if defined(__PPAGE__)
BHI L_PPAGE ;/* EPAGE accesses are possible */
#else
BHI L_NOPAGE ;/* no paged memory above accesses */
#endif
FOUND_DPAGE:
LDX #DPAGE_ADDR ;/* load page register address and clear zero flag */
RTS
#if defined(__PPAGE__)
L_PPAGE:
CPY #PPAGE_HIGH_BOUND ;/* test of higher bound of PPAGE */
BHI L_NOPAGE
FOUND_PPAGE:
LDX #PPAGE_ADDR ;/* load page register address and clear zero flag */
RTS
#endif
#if defined(__EPAGE__)
L_EPAGE:
CPY #EPAGE_LOW_BOUND ;/* test of lower bound of EPAGE */
BLO L_NOPAGE
CPY #EPAGE_HIGH_BOUND ;/* test of higher bound of EPAGE */
BHI L_NOPAGE
FOUND_EPAGE:
LDX #EPAGE_ADDR ;/* load page register address and clear zero flag */
RTS
#endif
L_NOPAGE:
ORCC #0x04 ;/* sets zero flag */
RTS
}
}
#else /* !defined(__DPAGE__) */
#if defined( __PPAGE__ )
#ifdef __cplusplus
extern "C"
#endif
#pragma NO_ENTRY
#pragma NO_EXIT
#pragma NO_FRAME
static void NEAR _GET_PAGE_REG(void) { /*lint -esym(528, _GET_PAGE_REG) used in asm code */
asm {
L_PPAGE:
CPY #PPAGE_LOW_BOUND ;/* test of lower bound of PPAGE */
#if defined( __EPAGE__ )
BLO L_EPAGE
#else
BLO L_NOPAGE ;/* no paged memory below */
#endif
CPY #PPAGE_HIGH_BOUND ;/* test of higher bound PPAGE */
BHI L_NOPAGE
FOUND_PPAGE:
LDX #PPAGE_ADDR ;/* load page register address and clear zero flag */
RTS
#if defined( __EPAGE__ )
L_EPAGE:
CPY #EPAGE_LOW_BOUND ;/* test of lower bound of EPAGE */
BLO L_NOPAGE
CPY #EPAGE_HIGH_BOUND ;/* test of higher bound of EPAGE */
BHI L_NOPAGE
FOUND_EPAGE:
LDX #EPAGE_ADDR ;/* load page register address and clear zero flag */
RTS
#endif
L_NOPAGE: ;/* not in any allowed page area */
;/* its a far access to a non paged variable */
ORCC #0x04 ;/* sets zero flag */
RTS
}
}
#else /* !defined(__DPAGE__ ) && !defined( __PPAGE__) */
#if defined(__EPAGE__)
#ifdef __cplusplus
extern "C"
#endif
#pragma NO_ENTRY
#pragma NO_EXIT
#pragma NO_FRAME
static void NEAR _GET_PAGE_REG(void) { /*lint -esym(528, _GET_PAGE_REG) used in asm code */
asm {
L_EPAGE:
CPY #EPAGE_LOW_BOUND ;/* test of lower bound of EPAGE */
BLO L_NOPAGE
CPY #EPAGE_HIGH_BOUND ;/* test of higher bound of EPAGE */
BHI L_NOPAGE
FOUND_EPAGE:
LDX #EPAGE_ADDR ;/* load page register address and clear zero flag */
RTS
L_NOPAGE: ;/* not in any allowed page area */
;/* its a far access to a non paged variable */
ORCC #0x04 ;/* sets zero flag */
RTS
}
}
#endif /* defined(__EPAGE__) */
#endif /* defined(__PPAGE__) */
#endif /* defined(__DPAGE__) */
#endif /* USE_SEVERAL_PAGES */
/*--------------------------- _SET_PAGE --------------------------------
Runtime routine to set the right page register. This routine is used if the compiler
does not know the right page register, i.e. if the option -Cp is used for more than
one page register or if the runtime option is used for one of the -Cp options.
Arguments :
- offset part of an address in the Y register
- page part of an address in the B register
Result :
- page part written into the correct page register.
- the old page register content is destroyed
- all processor registers remains unchanged
--------------------------- _SET_PAGE ----------------------------------*/
#ifdef __cplusplus
extern "C"
#endif
#pragma NO_ENTRY
#pragma NO_EXIT
#pragma NO_FRAME
void NEAR _SET_PAGE(void) {
#if USE_SEVERAL_PAGES
asm {
PSHX ;/* save X register */
__PIC_JSR(_GET_PAGE_REG)
BEQ L_NOPAGE
STAB 0,X ;/* set page register */
L_NOPAGE:
PULX ;/* restore X register */
RTS
}
#else /* USE_SEVERAL_PAGES */
asm {
STAB PAGE_ADDR ;/* set page register */
RTS
}
#endif /* USE_SEVERAL_PAGES */
}
/*--------------------------- _LOAD_FAR_8 --------------------------------
This runtime routine is used to access paged memory via a runtime function.
It may also be used if the compiler option -Cp is not used with the runtime argument.
Arguments :
- offset part of an address in the Y register
- page part of an address in the B register
Result :
- value to be read in the B register
- all other registers remains unchanged
- all page register still contain the same value
--------------------------- _LOAD_FAR_8 ----------------------------------*/
#ifdef __cplusplus
extern "C"
#endif
#pragma NO_ENTRY
#pragma NO_EXIT
#pragma NO_FRAME
void NEAR _LOAD_FAR_8(void) {
#if USE_SEVERAL_PAGES
asm {
PSHX ;/* save X register */
__PIC_JSR(_GET_PAGE_REG)
BEQ L_NOPAGE
PSHA ;/* save A register */
LDAA 0,X ;/* save page register */
STAB 0,X ;/* set page register */
LDAB 0,Y ;/* actual load, overwrites page */
STAA 0,X ;/* restore page register */
PULA ;/* restore A register */
PULX ;/* restore X register */
RTS
L_NOPAGE:
LDAB 0,Y ;/* actual load, overwrites page */
PULX ;/* restore X register */
RTS
}
#else /* USE_SEVERAL_PAGES */
asm {
PSHA ;/* save A register */
LDAA PAGE_ADDR ;/* save page register */
STAB PAGE_ADDR ;/* set page register */
LDAB 0,Y ;/* actual load, overwrites page */
STAA PAGE_ADDR ;/* restore page register */
PULA ;/* restore A register */
RTS
}
#endif /* USE_SEVERAL_PAGES */
}
/*--------------------------- _LOAD_FAR_16 --------------------------------
This runtime routine is used to access paged memory via a runtime function.
It may also be used if the compiler option -Cp is not used with the runtime argument.
Arguments :
- offset part of an address in the Y register
- page part of an address in the B register
Result :
- value to be read in the Y register
- all other registers remains unchanged
- all page register still contain the same value
--------------------------- _LOAD_FAR_16 ----------------------------------*/
#ifdef __cplusplus
extern "C"
#endif
#pragma NO_ENTRY
#pragma NO_EXIT
#pragma NO_FRAME
void NEAR _LOAD_FAR_16(void) {
#if USE_SEVERAL_PAGES
asm {
PSHX ;/* save X register */
__PIC_JSR(_GET_PAGE_REG)
BEQ L_NOPAGE
PSHA ;/* save A register */
LDAA 0,X ;/* save page register */
STAB 0,X ;/* set page register */
LDY 0,Y ;/* actual load, overwrites address */
STAA 0,X ;/* restore page register */
PULA ;/* restore A register */
PULX ;/* restore X register */
RTS
L_NOPAGE:
LDY 0,Y ;/* actual load, overwrites address */
PULX ;/* restore X register */
RTS
}
#else /* USE_SEVERAL_PAGES */
asm {
PSHA ;/* save A register */
LDAA PAGE_ADDR ;/* save page register */
STAB PAGE_ADDR ;/* set page register */
LDY 0,Y ;/* actual load, overwrites address */
STAA PAGE_ADDR ;/* restore page register */
PULA ;/* restore A register */
RTS
}
#endif /* USE_SEVERAL_PAGES */
}
/*--------------------------- _LOAD_FAR_24 --------------------------------
This runtime routine is used to access paged memory via a runtime function.
It may also be used if the compiler option -Cp is not used with the runtime argument.
Arguments :
- offset part of an address in the Y register
- page part of an address in the B register
Result :
- value to be read in the Y:B registers
- all other registers remains unchanged
- all page register still contain the same value
--------------------------- _LOAD_FAR_24 ----------------------------------*/
#ifdef __cplusplus
extern "C"
#endif
#pragma NO_ENTRY
#pragma NO_EXIT
#pragma NO_FRAME
void NEAR _LOAD_FAR_24(void) {
#if USE_SEVERAL_PAGES
asm {
PSHX ;/* save X register */
__PIC_JSR(_GET_PAGE_REG)
BEQ L_NOPAGE
PSHA ;/* save A register */
LDAA 0,X ;/* save page register */
STAB 0,X ;/* set page register */
LDAB 0,Y ;/* actual load, overwrites page of address */
LDY 1,Y ;/* actual load, overwrites offset of address */
STAA 0,X ;/* restore page register */
PULA ;/* restore A register */
PULX ;/* restore X register */
RTS
L_NOPAGE:
LDAB 0,Y ;/* actual load, overwrites page of address */
LDY 1,Y ;/* actual load, overwrites offset of address */
PULX ;/* restore X register */
RTS
}
#else /* USE_SEVERAL_PAGES */
asm {
PSHA ;/* save A register */
LDAA PAGE_ADDR ;/* save page register */
STAB PAGE_ADDR ;/* set page register */
LDAB 0,Y ;/* actual load, overwrites page of address */
LDY 1,Y ;/* actual load, overwrites offset of address */
STAA PAGE_ADDR ;/* restore page register */
PULA ;/* restore A register */
RTS
}
#endif /* USE_SEVERAL_PAGES */
}
/*--------------------------- _LOAD_FAR_32 --------------------------------
This runtime routine is used to access paged memory via a runtime function.
It may also be used if the compiler option -Cp is not used with the runtime argument.
Arguments :
- offset part of an address in the Y register
- page part of an address in the B register
Result :
- low 16 bit of value to be read in the D registers
- high 16 bit of value to be read in the Y registers
- all other registers remains unchanged
- all page register still contain the same value
--------------------------- _LOAD_FAR_32 ----------------------------------*/
#ifdef __cplusplus
extern "C"
#endif
#pragma NO_ENTRY
#pragma NO_EXIT
#pragma NO_FRAME
void NEAR _LOAD_FAR_32(void) {
#if USE_SEVERAL_PAGES
asm {
PSHX ;/* save X register */
__PIC_JSR(_GET_PAGE_REG)
BEQ L_NOPAGE
LDAA 0,X ;/* save page register */
PSHA ;/* put it onto the stack */
STAB 0,X ;/* set page register */
LDD 2,Y ;/* actual load, low word */
LDY 0,Y ;/* actual load, high word */
MOVB 1,SP+,0,X ;/* restore page register */
PULX ;/* restore X register */
RTS
L_NOPAGE:
LDD 2,Y ;/* actual load, low word */
LDY 0,Y ;/* actual load, high word */
PULX ;/* restore X register */
RTS
}
#else /* USE_SEVERAL_PAGES */
asm {
LDAA PAGE_ADDR ;/* save page register */
PSHA ;/* put it onto the stack */
STAB PAGE_ADDR ;/* set page register */
LDD 2,Y ;/* actual load, low word */
LDY 0,Y ;/* actual load, high word */
MOVB 1,SP+,PAGE_ADDR ;/* restore page register */
RTS
}
#endif /* USE_SEVERAL_PAGES */
}
/*--------------------------- _STORE_FAR_8 --------------------------------
This runtime routine is used to access paged memory via a runtime function.
It may also be used if the compiler option -Cp is not used with the runtime argument.
Arguments :
- offset part of an address in the Y register
- page part of an address in the B register
- value to be stored in the B register
Result :
- value stored at the address
- all registers remains unchanged
- all page register still contain the same value
--------------------------- _STORE_FAR_8 ----------------------------------*/
#ifdef __cplusplus
extern "C"
#endif
#pragma NO_ENTRY
#pragma NO_EXIT
#pragma NO_FRAME
void NEAR _STORE_FAR_8(void) {
#if USE_SEVERAL_PAGES
asm {
PSHX ;/* save X register */
__PIC_JSR(_GET_PAGE_REG)
BEQ L_NOPAGE
PSHB ;/* save B register */
LDAB 0,X ;/* save page register */
MOVB 0,SP, 0,X ;/* set page register */
STAA 0,Y ;/* store the value passed in A */
STAB 0,X ;/* restore page register */
PULB ;/* restore B register */
PULX ;/* restore X register */
RTS
L_NOPAGE:
STAA 0,Y ;/* store the value passed in A */
PULX ;/* restore X register */
RTS
}
#else /* USE_SEVERAL_PAGES */
asm {
PSHB ;/* save A register */
LDAB PAGE_ADDR ;/* save page register */
MOVB 0,SP,PAGE_ADDR ;/* set page register */
STAA 0,Y ;/* store the value passed in A */
STAB PAGE_ADDR ;/* restore page register */
PULB ;/* restore B register */
RTS
}
#endif /* USE_SEVERAL_PAGES */
}
/*--------------------------- _STORE_FAR_16 --------------------------------
This runtime routine is used to access paged memory via a runtime function.
It may also be used if the compiler option -Cp is not used with the runtime argument.
Arguments :
- offset part of an address in the Y register
- page part of an address in the B register
- value to be stored in the X register
Result :
- value stored at the address
- all registers remains unchanged
- all page register still contain the same value
--------------------------- _STORE_FAR_16 ----------------------------------*/
#ifdef __cplusplus
extern "C"
#endif
#pragma NO_ENTRY
#pragma NO_EXIT
#pragma NO_FRAME
void NEAR _STORE_FAR_16(void) {
#if USE_SEVERAL_PAGES
asm {
PSHX ;/* save X register */
__PIC_JSR(_GET_PAGE_REG)
BEQ L_NOPAGE
PSHA
LDAA 0,X ;/* save page register */
STAB 0,X ;/* set page register */
MOVW 1,SP,0,Y ;/* store the value passed in X */
STAA 0,X ;/* restore page register */
PULA ;/* restore A register */
PULX ;/* restore X register */
RTS
L_NOPAGE:
STX 0,Y ;/* store the value passed in X */
PULX ;/* restore X register */
RTS
}
#else /* USE_SEVERAL_PAGES */
asm {
PSHA ;/* save A register */
LDAA PAGE_ADDR ;/* save page register */
STAB PAGE_ADDR ;/* set page register */
STX 0,Y ;/* store the value passed in X */
STAA PAGE_ADDR ;/* restore page register */
PULA ;/* restore A register */
RTS
}
#endif /* USE_SEVERAL_PAGES */
}
/*--------------------------- _STORE_FAR_24 --------------------------------
This runtime routine is used to access paged memory via a runtime function.
It may also be used if the compiler option -Cp is not used with the runtime argument.
Arguments :
- offset part of an address in the Y register
- page part of an address in the B register
- value to be stored in the X:A registers (X : low 16 bit, A : high 8 bit)
Result :
- value stored at the address
- all registers remains unchanged
- all page register still contain the same value
--------------------------- _STORE_FAR_24 ----------------------------------*/
#ifdef __cplusplus
extern "C"
#endif
#pragma NO_ENTRY
#pragma NO_EXIT
#pragma NO_FRAME
void NEAR _STORE_FAR_24(void) {
#if USE_SEVERAL_PAGES
asm {
PSHX ;/* save X register */
__PIC_JSR(_GET_PAGE_REG)
BEQ L_NOPAGE
PSHA
LDAA 0,X ;/* save page register */
STAB 0,X ;/* set page register */
MOVW 1,SP, 1,Y ;/* store the value passed in X */
MOVB 0,SP, 0,Y ;/* store the value passed in A */
STAA 0,X ;/* restore page register */
PULA ;/* restore A register */
PULX ;/* restore X register */
RTS
L_NOPAGE:
STX 1,Y ;/* store the value passed in X */
STAA 0,Y ;/* store the value passed in X */
PULX ;/* restore X register */
RTS
}
#else /* USE_SEVERAL_PAGES */
asm {
PSHA ;/* save A register */
LDAA PAGE_ADDR ;/* save page register */
STAB PAGE_ADDR ;/* set page register */
MOVB 0,SP, 0,Y ;/* store the value passed in A */
STX 1,Y ;/* store the value passed in X */
STAA PAGE_ADDR ;/* restore page register */
PULA ;/* restore A register */
RTS
}
#endif /* USE_SEVERAL_PAGES */
}
/*--------------------------- _STORE_FAR_32 --------------------------------
This runtime routine is used to access paged memory via a runtime function.
It may also be used if the compiler option -Cp is not used with the runtime argument.
Arguments :
- offset part of an address in the Y register
- page part of an address is on the stack at 3,SP (just below the return address)
- value to be stored in the X:D registers (D : low 16 bit, X : high 16 bit)
Result :
- value stored at the address
- all registers remains unchanged
- the page part is removed from the stack
- all page register still contain the same value
--------------------------- _STORE_FAR_32 ----------------------------------*/
#ifdef __cplusplus
extern "C"
#endif
#pragma NO_ENTRY
#pragma NO_EXIT
#pragma NO_FRAME
void NEAR _STORE_FAR_32(void) {
#if USE_SEVERAL_PAGES
asm {
PSHX ;/* save X register */
__PIC_JSR(_GET_PAGE_REG)
BEQ L_NOPAGE
PSHD
LDAA 0,X ;/* save page register */
MOVB 6,SP, 0,X ;/* set page register */
MOVW 2,SP, 0,Y ;/* store the value passed in X (high word) */
MOVW 0,SP, 2,Y ;/* store the value passed in D (low word) */
STAA 0,X ;/* restore page register */
PULD ;/* restore A register */
BRA done
L_NOPAGE:
MOVW 0,SP, 0,Y ;/* store the value passed in X (high word) */
STD 2,Y ;/* store the value passed in D (low word) */
done:
PULX ;/* restore X register */
MOVW 0,SP, 1,+SP ;/* move return address */
RTS
}
#else /* USE_SEVERAL_PAGES */
asm {
PSHD ;/* save D register */
LDAA PAGE_ADDR ;/* save page register */
LDAB 4,SP ;/* load page part of address */
STAB PAGE_ADDR ;/* set page register */
STX 0,Y ;/* store the value passed in X */
MOVW 0,SP, 2,Y ;/* store the value passed in D (low word) */
STAA PAGE_ADDR ;/* restore page register */
PULD ;/* restore D register */
MOVW 0,SP, 1,+SP ;/* move return address */
RTS
}
#endif /* USE_SEVERAL_PAGES */
}
/*--------------------------- _FAR_COPY_RC --------------------------------
This runtime routine is used to access paged memory via a runtime function.
It may also be used if the compiler option -Cp is not used with the runtime argument.
Arguments :
- offset part of the source int the X register
- page part of the source in the A register
- offset part of the dest int the Y register
- page part of the dest in the B register
- number of bytes to be copied is defined by the next 2 bytes after the return address.
Result :
- memory area copied
- no registers are saved, i.e. all registers may be destroyed
- all page register still contain the same value as before the call
- the function returns after the constant defining the number of bytes to be copied
stack-structure at the loop-label:
0,SP : destination offset
2,SP : source page
3,SP : destination page
4,SP : source offset
6,SP : points to length to be copied. This function returns after the size
A usual call to this function looks like:
struct Huge src, dest;
; ...
LDX #src
LDAA #PAGE(src)
LDY #dest
LDAB #PAGE(dest)
JSR _FAR_COPY_RC
DC.W sizeof(struct Huge)
; ...
--------------------------- _FAR_COPY_RC ----------------------------------*/
#ifdef __cplusplus
extern "C"
#endif
#pragma NO_ENTRY
#pragma NO_EXIT
#pragma NO_FRAME
void NEAR _FAR_COPY_RC(void) {
#if USE_SEVERAL_PAGES
asm {
DEX ;/* source addr-=1, because loop counter ends at 1 */
PSHX ;/* save source offset */
PSHD ;/* save both pages */
DEY ;/* destination addr-=1, because loop counter ends at 1 */
PSHY ;/* save destination offset */
LDY 6,SP ;/* Load Return address */
LDX 2,Y+ ;/* Load Size to copy */
STY 6,SP ;/* Store adjusted return address */
loop:
LDD 4,SP ;/* load source offset */
LEAY D,X ;/* calculate actual source address */
LDAB 2,SP ;/* load source page */
__PIC_JSR(_LOAD_FAR_8) ;/* load 1 source byte */
PSHB ;/* save value */
LDD 0+1,SP ;/* load destination offset */
LEAY D,X ;/* calculate actual destination address */
PULA ;/* restore value */
LDAB 3,SP ;/* load destination page */
__PIC_JSR(_STORE_FAR_8) ;/* store one byte */
DEX
BNE loop
LEAS 6,SP ;/* release stack */
_SRET ;/* debug info only: This is the last instr of a function with a special return */
RTS ;/* return */
}
#else
asm {
PSHD ;/* store page registers */
TFR X,D
PSHY ;/* temporary space */
LDY 4,SP ;/* load return address */
ADDD 2,Y+ ;/* calculate source end address. Increment return address */
STY 4,SP
PULY
PSHD ;/* store src end address */
LDAB 2,SP ;/* reload source page */
LDAA PAGE_ADDR ;/* save page register */
PSHA
loop:
STAB PAGE_ADDR ;/* set source page */
LDAA 1,X+ ;/* load value */
MOVB 4,SP, PAGE_ADDR ;/* set destination page */
STAA 1,Y+
CPX 1,SP
BNE loop
LDAA 5,SP+ ;/* restore old page value and release stack */
STAA PAGE_ADDR ;/* store it into page register */
_SRET ;/* debug info only: This is the last instr of a function with a special return */
RTS
}
#endif
}
/*--------------------------- _FAR_COPY --------------------------------
The _FAR_COPY runtime routine was used to copied large memory blocks in previous compiler releases.
However this release now does use _FAR_COPY_RC instead. The only difference is how the size of
the area to be copied is passed into the function. For _FAR_COPY the size is passed on the stack just
above the return address. _FAR_COPY_RC does expect the return address just after the JSR _FAR_COPY_RC call
in the code of the caller. This allows for denser code calling _FAR_COPY_RC but does also need a slightly
larger runtime routine and it is slightly slower.
The _FAR_COPY routine is here now mainly for compatibility with previous releases.
The current compiler does not use it.
--------------------------- _FAR_COPY ----------------------------------*/
#ifdef __cplusplus
extern "C"
#endif
#pragma NO_ENTRY
#pragma NO_EXIT
#pragma NO_FRAME
void NEAR _FAR_COPY(void) {
#if USE_SEVERAL_PAGES
asm {
DEX ;/* source addr-=1, because loop counter ends at 1 */
PSHX ;/* save source offset */
PSHD ;/* save both pages */
DEY ;/* destination addr-=1, because loop counter ends at 1 */
PSHY ;/* save destination offset */
LDX 8,SP ;/* load counter, assuming counter > 0 */
loop:
LDD 4,SP ;/* load source offset */
LEAY D,X ;/* calculate actual source address */
LDAB 2,SP ;/* load source page */
__PIC_JSR(_LOAD_FAR_8) ;/* load 1 source byte */
PSHB ;/* save value */
LDD 0+1,SP ;/* load destination offset */
LEAY D,X ;/* calculate actual destination address */
PULA ;/* restore value */
LDAB 3,SP ;/* load destination page */
__PIC_JSR(_STORE_FAR_8) ;/* store one byte */
DEX
BNE loop
LDX 6,SP ;/* load return address */
LEAS 10,SP ;/* release stack */
JMP 0,X ;/* return */
}
#else
asm {
PSHD ;/* store page registers */
TFR X,D
ADDD 4,SP ;/* calculate source end address */
STD 4,SP
PULB ;/* reload source page */
LDAA PAGE_ADDR ;/* save page register */
PSHA
loop:
STAB PAGE_ADDR ;/* set source page */
LDAA 1,X+ ;/* load value */
MOVB 1,SP, PAGE_ADDR ;/* set destination page */
STAA 1,Y+
CPX 4,SP
BNE loop
LDAA 2,SP+ ;/* restore old page value and release stack */
STAA PAGE_ADDR ;/* store it into page register */
LDX 4,SP+ ;/* release stack and load return address */
JMP 0,X ;/* return */
}
#endif
}
#else /* __HCS12X__ */
/*
The HCS12X knows two different kind of addresses:
- Logical addresses. E.g.
MOVB #page(var),RPAGE
INC var
- Global addresses E.g.
MOVB #page(var),GPAGE
GLDAA var
INCA
GSTAA var
Global addresses are used with G-Load's and G-Store's, logical addresses are used for all the other instructions
and occasions. As HC12's or HCS12's do not have the G-Load and G-Store instructions,
global addresses are not used with these processor families.
They are only used with HCS12X chips (and maybe future ones deriving from a HCS12X).
Logical and Global addresses can point to the same object, however the global and logical address of an object
are different for most objects (actually for all except the registers from 0 to 0x7FF).
Therefore the compiler needs to transform in between them.
HCS12X Pointer types:
The following are logical addresses:
- all 16 bit pointers
- "char* __near": always.
- "char *" in the small and banked memory model
- 24 bit dpage, epage, ppage or rpage pointers (*1) (note: the first HCS12X compilers may not support these pointer types)
- "char *__dpage": Note this type only exists for
orthogonality with the HC12 A4 chip which has a DPAGE reg.
It does not apply to the HCS12X.
- "char *__epage": 24 bit pointer using the EPAGE register
- "char *__ppage": 24 bit pointer using the PPAGE register.
As the PPAGE is also used for BANKED code,
using this pointer type is only legal from non banked code.
- "char *__rpage": 24 bit pointer using the RPAGE register
The following are global addresses:
"char*": in the large memory model (only HCS12X)
"char* __far": always for HCS12X.
(*1): For the HC12 and HCS12 "char* __far" and "char*" in the large memory model are also logical.
Some notes for the HC12/HCS12 programmers.
The address of a far object for a HC12 and for a HCS12X is different, even if they are at the same place in the memory map.
For the HC12, a far address is using the logical addresses, for the HCS12X however, far addresses are using global addresses.
This does cause troubles for the unaware!
The conversion routines implemented in this file support the special HCS12XE RAM mapping (when RAMHM is set).
To enable this mapping compile this file with the "-MapRAM" compiler option.
HCS12X Logical Memory map
Logical Addresses Used for shadowed at page register Global Address
0x000000 .. 0x0007FF Peripheral Registers Not Paged 0x000000
0x??0800 .. 0x??0BFF Paged EEPROM EPAGE (@0x17) 0x100000+EPAGE*0x0400
0x000C00 .. 0x000FFF Non Paged EEPROM 0xFF0800..0xFF0FFF Not Paged 0x13FC00
0x??1000 .. 0x??1FFF Paged RAM RPAGE (@0x16) 0x000000+RPAGE*0x1000
0x002000 .. 0x003FFF Non Paged RAM 0xFE1000..0xFF1FFF Not Paged 0x0FE000
0x004000 .. 0x007FFF Non Paged FLASH 0xFC8000..0xFCBFFF Not Paged 0x7F4000
0x??8000 .. 0x00BFFF Paged FLASH PPAGE (@0x30) 0x400000+PPAGE*0x4000
0x00C000 .. 0x00FFFF Non Paged FLASH 0xFF8000..0xFFBFFF Not Paged 0x7FC000
NA: Not Applicable
HCS12X Global Memory map
Global Addresses Used for Logical mapped at
0x000000 .. 0x0007FF Peripheral Registers 0x000000 .. 0x0007FF
0x000800 .. 0x000FFF DMA registers Not mapped
0x001000 .. 0x0FFFFF RAM 0x??1000 .. 0x??1FFF
0x0FE000 .. 0x0FFFFF RAM, Log non paged 0x002000 .. 0x003FFF
0x100000 .. 0x13FFFF EEPROM 0x??0800 .. 0x??0BFF
0x13FC00 .. 0x13FFFF EEPROM non paged 0x000C00 .. 0x000FFF
0x140000 .. 0x3FFFFF External Space Not mapped
0x400000 .. 0x7FFFFF FLASH 0x??8000 .. 0x??BFFF
0x7F4000 .. 0x7F7FFF FLASH, Log non paged 0x004000 .. 0x007FFF
0x7FC000 .. 0x7FFFFF FLASH, Log non paged 0x00C000 .. 0x00FFFF
HCS12XE Logical Memory map (with RAMHM set)
Logical Addresses Used for shadowed at page register Global Address
0x000000 .. 0x0007FF Peripheral Registers Not Paged 0x000000
0x??0800 .. 0x??0BFF Paged EEPROM EPAGE 0x100000+EPAGE*0x0400
0x000C00 .. 0x000FFF Non Paged EEPROM 0xFF0800..0xFF0FFF Not Paged 0x13FC00
0x??1000 .. 0x??1FFF Paged RAM RPAGE 0x000000+RPAGE*0x1000
0x002000 .. 0x003FFF Non Paged RAM 0xFA1000..0xFB1FFF Not Paged 0x0FA000
0x004000 .. 0x007FFF Non Paged RAM 0xFC1000..0xFF1FFF Not Paged 0x0FC000
0x??8000 .. 0x00BFFF Paged FLASH PPAGE 0x400000+PPAGE*0x4000
0x00C000 .. 0x00FFFF Non Paged FLASH 0xFF8000..0xFFBFFF Not Paged 0x7FC000
NA: Not Applicable
HCS12X Global Memory map (with RAMHM set)
Global Addresses Used for Logical mapped at
0x000000 .. 0x0007FF Peripheral Registers 0x000000 .. 0x0007FF
0x000800 .. 0x000FFF DMA registers Not mapped
0x001000 .. 0x0FFFFF RAM 0x??1000 .. 0x??1FFF
0x0FA000 .. 0x0FFFFF RAM, Log non paged 0x002000 .. 0x007FFF
0x100000 .. 0x13FFFF EEPROM 0x??0800 .. 0x??0BFF
0x13FC00 .. 0x13FFFF EEPROM non paged 0x000C00 .. 0x000FFF
0x140000 .. 0x3FFFFF External Space Not mapped
0x400000 .. 0x7FFFFF FLASH 0x??8000 .. 0x??BFFF
0x7F4000 .. 0x7F7FFF FLASH, Log non paged Not mapped
0x7FC000 .. 0x7FFFFF FLASH, Log non paged 0x00C000 .. 0x00FFFF
How to read this table:
For logical addresses, the lower 16 bits of the address do determine in which area the address is,
if this address is paged, then this entry also controls and which of the EPAGE, PPAGE or RPAGE
page register is controlling the bits 16 to 23 of the address.
For global addresses, the bits 16 to 23 have to be in the GPAGE register and the lower 16 bits
have to be used with the special G load or store instructions (e.g. GLDAA).
As example the logical address 0x123456 is invalid. Because its lower bits 0x3456 are in a
non paged area, so the page 0x12 does not exist.
The address 0xFE1020 however does exist. To access it, the RPAGE has to contain 0xFE and the
offset 0x1020 has to be used.
ORG $7000
MOVB #0xFE, 0x16 ; RPAGE
LDAA 0x1020 ; reads at the logical address 0xFE1020
Because the last two RAM pages are also accessible directly from 0x2000 to 0x3FFF, the
following shorter code does read the same memory location:
ORG $7000
LDAA 0x2020 ; reads at the logical address 0x2020
; which maps to the same memory as 0xFE1020
This memory location also has a global address. For logical 0xFE1020 the global address is 0x0FE020.
So the following code does once more access the same memory location:
ORG $7000
MOVB #0x0F, 0x10 ; GPAGE
GLDAA 0xE020 ; reads at the global address 0x0FE020
; which maps to the same memory as the logical addr. 0xFE1020
Therefore every memory location for the HCS12X has up to 3 different addresses.
Up to two logical and one global.
Notes.
- Not every address has a logical equivalent. The external space is only available in the global address space.
- The PPAGE must only be set if the code is outside of the 0x8000 to 0xBFFF range.
If not, the next code fetch will be from the new wrong PPAGE value.
- Inside of the paged area, the highest pages are allocated first. So all HCS12X's do have the FF pages
(if they have this memory type at all).
- For RPAGE, the value 0 is illegal. Otherwise the global addresses would overlap with the registers.
*/
/*lint -e10, -e106, -e30 */
#if __OPTION_ACTIVE__("-MapRAM")
#define __HCS12XE_RAMHM_SET__
#endif
/*lint +e10, +e106, +e30 */
/*--------------------------- pointer conversion operations -------------------------------*/
/*--------------------------- _CONV_GLOBAL_TO_LOGICAL --------------------------------
Convert 24 bit logical to 24 bit global pointer
("char*__far" to "char*__gpage")
Arguments :
- B : page part of global address
- X : 16 offset part of global address
Postcondition :
- B == page of returned logical address
- X == offset of returned logical address
- Y remains unchanged
- A remains unchanged
*/
/*--------------------------- Convert 24 bit global to 24 bit logical pointer ----------------------------------*/
/* B:X = Logical(B:X) */
#ifdef __cplusplus
extern "C"
#endif
#pragma NO_FRAME
#pragma NO_ENTRY
#pragma NO_EXIT
void NEAR _CONV_GLOBAL_TO_LOGICAL(void) {
asm {
CMPB #0x40 ;/* flash (0x400000..0x7FFFFF) or not? */
BLO Below400000
/* from 0x400000 to 0x7FFFFF */
CMPB #0x7F ;/* check for Unpaged areas 0x7FC000..0x7FFFFF and 0x7F4000..0x7F7FFF */
BNE PAGED_FLASH_AREA
#ifndef __HCS12XE_RAMHM_SET__
BITX #0x4000
BEQ PAGED_FLASH_AREA
#else
CPX #0xC000
BLO PAGED_FLASH_AREA
#endif
/* from 0x7F4000 to 0x7F7FFF or 0x7FC000 to 0x7FFFFF */
;/* Note: offset in X is already OK. */
CLRB ;/* logical page == 0 */
RTS
PAGED_FLASH_AREA: ;/* paged flash. Map to 0x8000..0xBFFF */
/* from 0x400000 to 0x7F3FFF or 0x7F8000 to 0x7FBFFF */
LSLX ; /* shift 24 bit address 2 bits to the left to get correct page in B */
ROLB
LSLX
ROLB
LSRX ; /* shift back to get offset from 0x8000 to 0xBFFF */
SEC
RORX
RTS ;/* done */
Below400000:
/* from 0x000000 to 0x3FFFFF */
#if 0 /* How should we handle mapping to External Space. There is no logical equivalent. This is an error case! */
CMPB #0x14 ;/* check if above 0x140000. If so, its in the external space */
BLO Below140000
ERROR !!!! ;/* this mapping is not possible! What should we do? */
RTS
Below140000:
/* from 0x000000 to 0x13FFFF */
#endif
CMPB #0x10 ;/* if >= 0x100000 it's EEPROM */
BLO Below100000
/* from 0x100000 to 0x13FFFF (or 0x3FFFFF) */
CMPB #0x13 ;/* check if its is in the non paged EEPROM area at 0x13FC00..0x13FFFF */
BLO Below13FC00
CPX #0xFC00
BLO Below13FC00
/* from 0x13FC00 to 0x13FFFF (or 0x3FFFFF) */
LEAX 0x1000,X ;/* same as SUBX #0xF000 // map from 0xFC00 to 0x0C00 */
CLRB
RTS
Below13FC00:
/* from 0x100000 to 0x13FBFF */
PSHA
TFR XH,A ;/* calculate logical page */
EXG A,B
LSRD
LSRD
PULA
ANDX #0x03FF
LEAX 0x0800,X ;/* same as ORX #0x0800 */
RTS
Below100000:
/* from 0x000000 to 0x0FFFFF */
TSTB
BNE RAM_AREA
CPX #0x1000
BLO Below001000
RAM_AREA:
/* from 0x001000 to 0x0FFFFF */
CMPB #0x0F
BNE PagedRAM_AREA
#ifndef __HCS12XE_RAMHM_SET__
CPX #0xE000
BLO PagedRAM_AREA
/* from 0x0FE000 to 0x0FFFFF */
SUBX #(0xE000-0x2000) ;/* map 0xE000 to 0x2000 */
#else
CPX #0xA000
BLO PagedRAM_AREA
/* from 0x0FA000 to 0x0FFFFF */
SUBX #(0xA000-0x2000) ;/* map 0xA000 to 0x2000 */
#endif
CLRB ;/* Page is 0 */
RTS
PagedRAM_AREA:
/* from 0x001000 to 0x0FDFFF */
PSHA
TFR XH, A ;/* calculate logical page */
EXG A,B
LSRD
LSRD
LSRD
LSRD
PULA
ANDX #0x0FFF
LEAX 0x1000,X ;/* same as ORX #0x1000 */
RTS
Below001000:
/* from 0x000000 to 0x000FFF */
#if 0
CMPA #0x08
BLO Below000800
/* from 0x000800 to 0x000FFF */
/* ??? DMA Regs? */
RTS
Below000800:
/* from 0x000000 to 0x0007FF */
#endif
CLRB
RTS
}
}
/*--------------------------- _CONV_GLOBAL_TO_NEAR --------------------------------
Convert 24 bit global to 16 bit logical pointer
("char*__far" to "char*")
Arguments :
- B : page part of global address
- X : 16 offset part of global address
Postcondition :
- B is undefined
- A remains unchanged
- X == offset of returned logical address
- Y remains unchanged
*/
/*--------------------------- Convert 24 bit global to 16 bit logical pointer ----------------------------------*/
/* X = Logical(B:X) */
#ifdef __cplusplus
extern "C"
#endif
#define _REUSE_CONV_GLOBAL_TO_LOGICAL 1
#pragma NO_FRAME
#pragma NO_ENTRY
#pragma NO_EXIT
void NEAR _CONV_GLOBAL_TO_NEAR(void){
#if _REUSE_CONV_GLOBAL_TO_LOGICAL /* do we want an optimized version? */
__asm JMP _CONV_GLOBAL_TO_LOGICAL; /* offset for NEAR is same as for LOGICAL. */
#else
asm {
CMPB #0x40 ;/* flash (0x400000..0x7FFFFF) or not? */
BLO Below400000
/* from 0x400000 to 0x7FFFFF */
#ifndef __HCS12XE_RAMHM_SET__
CMPB #0x7F ;/* check for Unpaged areas 0x7FC000..0x7FFFFF and 0x7F4000..0x7F7FFF */
BNE PAGED_FLASH_AREA
CPX #0x4000
BLO PAGED_FLASH_AREA
/* from 0x7F4000 to 0x7FFFFF */
#else
CMPB #0x7F ;/* check for Unpaged area 0x7FC000..0x7FFFFF */
BNE PAGED_FLASH_AREA
CPX #0xC000
BLO PAGED_FLASH_AREA
/* from 0x7FC000 to 0x7FFFFF */
#endif
;/* note non PAGED flash areas or paged area 0x7F8000..0x7FBFFF which are mapping all correctly */
RTS
PAGED_FLASH_AREA: ;/* paged flash. Map to 0x8000..0xBFFF */
/* from 0x400000 to 0x7F3FFF */
ANDX #0x3F00 ;/* cut to 0.. 0x3FFF */
LEAX 0x8000,X ;/* same as ORX #0x8000 ;// move to 0x8000..0xBFFF */
RTS ;/* done */
Below400000:
/* from 0x000000 to 0x3FFFFF */
#if 0 /* How should we handle mapping to External Space. There is no logical equivalent. This is an error case! */
CMPB #0x14 ;/* check if above 0x140000. If so, its in the external space */
BLO Below140000
ERROR !!!! ;/* this mapping is not possible! What should we do? */
RTS
Below140000:
/* from 0x000000 to 0x13FFFF */
#endif
CMPB #0x10 ;/* if >= 0x100000 it's EEPROM */
BLO Below100000
/* from 0x100000 to 0x13FFFF (or 0x3FFFFF) */
CMPB #0x13 ;/* check if its is in the non paged EEPROM area at 0x13FC00..0x13FFFF */
BNE Below13FC00
CPX #0xFC00
BLO Below13FC00
/* from 0x13FC00 to 0x13FFFF (or 0x3FFFFF) */
SUBX #0xF000 ;/* map from 0xFC00 to 0x0C00 */
RTS
Below13FC00:
/* from 0x100000 to 0x13FBFF */
ANDX #0x03FF
LEAX 0x800,X ;/* same as ORX #0x0800 */
RTS
Below100000:
/* from 0x000000 to 0x0FFFFF */
TBNE B,RAM_AREA
CPX #0x1000
BLO Below001000
RAM_AREA:
/* from 0x001000 to 0x0FFFFF */
CMPB #0x0F
BNE PagedRAM_AREA
#ifndef __HCS12XE_RAMHM_SET__
CPX #0xE000
BLO PagedRAM_AREA
/* from 0x0FE000 to 0x0FFFFF */
SUBX #(0xE000-0x2000) ;/* map 0xE000 to 0x2000 */
#else
CPX #0xA000
BLO PagedRAM_AREA
/* from 0x0FA000 to 0x0FFFFF */
SUBX #(0xA000-0x2000) ;/* map 0xA000 to 0x2000 */
#endif
RTS
PagedRAM_AREA:
/* from 0x001000 to 0x0FDFFF (0x001000 to 0x0F9FFF if HCS12XE RAM mapping is enabled) */
ANDX #0x0FFF
LEAX 0x1000,X ;/* same as ORX #0x1000 */
RTS
Below001000:
/* from 0x000000 to 0x000FFF */
RTS
}
#endif
}
/*--------------------------- _CONV_NEAR_TO_GLOBAL --------------------------------
Convert 16 bit logical to 24 bit global pointer
("char*__near" to "char*__far")
Arguments :
- X : 16 bit near pointer
Postcondition :
- B == page of returned global address
- X == offset of returned global address
- Y remains unchanged
- A is unspecified
*/
/*--------------------------- Convert 16 bit logical to 24 bit global pointer ----------------------------------*/
/* B:X = Global(X) */
#ifdef __cplusplus
extern "C"
#endif
#pragma NO_FRAME
#pragma NO_ENTRY
#pragma NO_EXIT
void NEAR _CONV_NEAR_TO_GLOBAL(void){
asm {
/* syntax: */
/* input 16 bit offset is bit15..bit0 */
/* ppage values: ppage7..ppage0 */
/* epage values: epage7..epage0 */
/* dpage values: dpage7..dpage0 */
/* rpage values: rpage7..rpage0 */
PSHX ;/* D contains bit15..bit0 */
TFR X,D ;/* D is cheaper to shift */
LSLD ;/* D contains 0 bit14..bit0, C contains bit15 */
BCC Below8000 ;/* bit15 == 0? */
/* from 0x8000 to 0xFFFF */
LSLD ;/* D contains 00 bit13..bit0, C contains bit14 */
BCC BelowC000
LDAB #0x7F
PULX
RTS ;/* returns 0b0111 1111 11 bit13...bit0 */
BelowC000: ;/* from 0x8000 to 0xBFFF */
TFR D,X
LDAB __PPAGE_ADR__
SEC
RORB
RORX
LSRB
RORX
LEAS 2,SP
RTS ;/* returns 0b01 ppage7..ppage0 bit13...bit0 */
Below8000:
LSLD ;/* D contains 00 bit13..bit0, C contains bit14 */
BCC Below4000
/* from 0x4000 to 0x7FFF */
PULX
#ifndef __HCS12XE_RAMHM_SET__
LDAB #0x7F
#else
LEAX (0xC000-0x4000),X
LDAB #0x0F
#endif
RTS ;/* returns 0b0111 1111 01 bit13...bit0 */
Below4000:
LSLD ;/* D contains 000 bit12..bit0, C contains bit13 */
BCC Below2000
/* from 0x2000 to 0x3FFF */
PULX
#ifndef __HCS12XE_RAMHM_SET__
LEAX (0xE000-0x2000),X
#else
LEAX (0xA000-0x2000),X
#endif
LDAB #0x0F
RTS ;/* returns 0b0000 1111 111 bit12...bit0 */
Below2000:
LSLD ;/* D contains 0000 bit11..bit0, C contains bit12 */
BCC Below1000
/* from 0x1000 to 0x1FFF */
LDAB __RPAGE_ADR__
LDAA #0x10
MUL
EORB 0,SP
EORB #0x10 ;/* clear 1 bit */
STAB 0,SP
TFR A,B
PULX
RTS
Below1000:
LSLD ;/* D contains 0000 0 bit10..bit0, C contains bit11 */
BCC Below0800
/* from 0x0800 to 0x0FFF */
LSLD ;/* D contains 0000 00 bit9..bit0, C contains bit10 */
BCC Below0C00
/* from 0x0C00 to 0x0FFF */
LDAB #0x13
PULX
LEAX 0xF000,X
RTS ;/* returns 0b0001 0011 1111 11 bit9...bit0 */
Below0C00:
/* from 0x0800 to 0x0BFF */
LDAB __EPAGE_ADR__
LDAA #0x04
MUL
EORB 0,SP
EORB #0x08
STAB 0,SP
TFR A,B
ORAB #0b00010000
PULX
RTS
Below0800:
PULX
CLRB
RTS
}
}
/*--------------------------- _CONV_STACK_NEAR_TO_GLOBAL --------------------------------
Convert 16 bit logical of address on the stack 24 bit global pointer
("char*__near" to "char*__far")
Arguments :
- X : 16 bit near pointer
Postcondition :
- B == page of returned global address
- X == offset of returned global address
- Y remains unchanged
- A is unspecified
*/
/*--------------------------- Convert 16 bit logical stack address to 24 bit global pointer ----------------------------------*/
/* B:X = Global(D) */
#ifdef __cplusplus
extern "C"
#endif
#pragma NO_FRAME
#pragma NO_ENTRY
#pragma NO_EXIT
void NEAR _CONV_STACK_NEAR_TO_GLOBAL(void){
asm {
/* syntax: */
/* input 16 bit offset is bit15..bit0 */
/* ppage values: ppage7..ppage0 */
/* epage values: epage7..epage0 */
/* dpage values: dpage7..dpage0 */
/* rpage values: rpage7..rpage0 */
/* stack must be between $1000 and $3FFF. */
/* actually placing the stack at $1000 implies that the RPAGE register is not set (and correctly initialized) */
CPX #0x2000
BLO PAGED_RAM
/* Map 0x2000 to 0x0FE000 (0x0FA000 for HCS12XE RAM mapping is enabled) */
LDAB #0x0F
#ifndef __HCS12XE_RAMHM_SET__
LEAX (0xE000-0x2000),X ;/* LEAX is one cycle faster than ADDX # */
#else
LEAX (0xA000-0x2000),X ;/* LEAX is one cycle faster than ADDX # */
#endif
RTS
PAGED_RAM:
PSHX
LDAB __RPAGE_ADR__
LDAA #0x20
MUL
EORB 0,SP
EORB #0x10 ;/* clear 1 bit */
STAB 0,SP
TFR A,B
PULX
RTS
}
}
/*--------------------------- _CONV_LOGICAL_TO_GLOBAL --------------------------------
Convert 24 bit global to 24 bit logical pointer
("char*__far" to "char*__gpage")
Arguments :
- B : page part of logical address
- X : 16 offset part of logical address
Postcondition :
- B == page of returned global address
- X == offset of returned global address
- Y remains unchanged
- A remains unchanged
*/
/*--------------------------- Convert 24 bit logical to 24 bit global pointer ----------------------------------*/
/* B:X = Logical(B:X) */
#ifdef __cplusplus
extern "C"
#endif
#pragma NO_FRAME
#pragma NO_ENTRY
#pragma NO_EXIT
void NEAR _CONV_LOGICAL_TO_GLOBAL(void) {
asm {
/* syntax: */
/* input 16 bit offset is bit15..bit0 */
/* ppage values: ppage7..ppage0 */
/* epage values: epage7..epage0 */
/* dpage values: dpage7..dpage0 */
/* rpage values: rpage7..rpage0 */
PSHA ;/* save A across this routine. */
PSHX ;/* D contains bit15..bit0 */
PSHB ;/* store page */
TFR X,D ;/* D is cheaper to shift */
LSLD ;/* D contains 0 bit14..bit0, C contains bit15 */
BCC Below8000 ;/* bit15 == 0? */
/* from 0x8000 to 0xFFFF */
LSLD ;/* D contains 00 bit13..bit0, C contains bit14 */
BCC BelowC000
PULB ;/* cleanup stack */
LDAB #0x7F
PULX
PULA
RTS ;/* returns 0b0111 1111 11 bit13...bit0 */
BelowC000: ;/* from 0x8000 to 0xBFFF */
TFR D,X
PULB ;/* cleanup stack */
SEC
RORB
RORX
LSRB
RORX
LEAS 2,SP
PULA
RTS ;/* returns 0b01 ppage7..ppage0 bit13...bit0 */
Below8000:
LSLD ;/* D contains 00 bit13..bit0, C contains bit14 */
BCC Below4000
;/* from 0x4000 to 0x7FFF */
PULB ;/* cleanup stack */
PULX
#ifndef __HCS12XE_RAMHM_SET__
LDAB #0x7F
#else
LEAX (0xC000-0x4000),X
LDAB #0x0F
#endif
PULA
RTS ;/* returns 0b0111 1111 01 bit13...bit0 */
Below4000:
LSLD ;/* D contains 000 bit12..bit0, C contains bit13 */
BCC Below2000
/* from 0x2000 to 0x3FFF */
PULB ;/* cleanup stack */
PULX
#ifndef __HCS12XE_RAMHM_SET__
LEAX (0xE000-0x2000),X
#else
LEAX (0xA000-0x2000),X
#endif
LDAB #0x0F
PULA
RTS ;/* returns 0b0000 1111 111 bit12...bit0 */
Below2000:
LSLD ;/* D contains 0000 bit11..bit0, C contains bit12 */
BCC Below1000
/* from 0x1000 to 0x1FFF */
PULB
LDAA #0x10
MUL
EORB 0,SP
EORB #0x10 ;/* clear 1 bit */
STAB 0,SP
TFR A,B
PULX
PULA
RTS
Below1000:
LSLD ;/* D contains 0000 0 bit10..bit0, C contains bit11 */
BCC Below0800
/* from 0x0800 to 0x0FFF */
LSLD ;/* D contains 0000 00 bit9..bit0, C contains bit10 */
BCC Below0C00
/* from 0x0C00 to 0x0FFF */
PULB ;/* cleanup stack */
LDAB #0x13
PULX
LEAX 0xF000,X
PULA
RTS ;/* returns 0b0001 0011 1111 11 bit9...bit0 */
Below0C00:
/* from 0x0800 to 0x0BFF */
PULB
LDAA #0x04
MUL
EORB 0,SP
EORB #0x08
STAB 0,SP
TFR A,B
ORAB #0b00010000
PULX
PULA
RTS
Below0800:
PULB
PULX
PULA
CLRB
RTS
}
}
/*--------------------------- _FAR_COPY_RC HCS12X Routines --------------------------------
copy larger far memory blocks
There are the following memory block copy routines:
_COPY : 16 bit logical copies.
Src and dest are both near. Note: implemented in rtshc12.c and not here.
_FAR_COPY_RC HC12/HCS12 struct copy routine.
Expects HC12/HCS12 logical 24 bit address.
Note: Does not exist for the HCS12X.
The HC12/HCS12 implementation is implemented above.
_FAR_COPY_GLOBAL_GLOBAL_RC:
_FAR_COPY_GLOBAL_LOGICAL_RC:
_FAR_COPY_LOGICAL_GLOBAL_RC:
_FAR_COPY_LOGICAL_LOGICAL_RC:
_FAR_COPY_NEAR_GLOBAL_RC:
_FAR_COPY_NEAR_LOGICAL_RC:
_FAR_COPY_GLOBAL_NEAR_RC:
_FAR_COPY_LOGICAL_NEAR_RC: HCS12X specific far copy routine. The name describes what the src/dest address format are.
All near src arguments are passed in X, all 24 bit src in X/B.
All near dest arguments are passed in Y, all 24 bit src in Y/A.
(Note: HC12 _FAR_COPY_RC is using X/A as src and Y/B as dest, so the register usage is not the same!)
Arguments :
- B:X : src address (for NEAR/_COPY: only X)
- A:Y : dest address (for NEAR/_COPY: only Y)
- number of bytes to be copied behind return address (for _COPY: in D register). The number of bytes is always > 0
Result :
- memory area copied
- no registers are saved, i.e. all registers may be destroyed
- for _COPY: D contains 0.
- for HCS12X _FAR_COPY_... routines: GPAGE state is unknown
*/
#ifdef __cplusplus
extern "C"
#endif
#pragma NO_ENTRY
#pragma NO_EXIT
#pragma NO_FRAME
void NEAR _FAR_COPY_GLOBAL_GLOBAL_RC(void) {
asm {
PSHD
PSHY
LDY 4,SP ;/* load return address */
LDD 2,Y+ ;/* load size */
STY 4,SP ;/* store return address */
PULY
PSHD
LDAB 3,SP
Loop:
STAB __GPAGE_ADR__
GLDAA 1,X+
MOVB 2,SP,__GPAGE_ADR__
GSTAA 1,Y+
DECW 0,SP
BNE Loop
LEAS 4,SP
_SRET ;/* debug info only: This is the last instr of a function with a special return */
RTS
}
}
#ifdef __cplusplus
extern "C"
#endif
#pragma NO_ENTRY
#pragma NO_EXIT
#pragma NO_FRAME
void NEAR _SET_PAGE_REG_HCS12X(void) {
/* Sets the page contained in A to the register controlling the logical addr contained in X. */
/* saves the old page before and returns it in A together with the page address just below the return address. */
/* X/Y both remain valid. */
asm {
PSHX
/* 0000..FFFF */
CPX #0x8000
BLO _LO8000
LDX #__PPAGE_ADR__
BRA Handle
_LO8000:
/* 0000..7FFF */
CPX #0x1000
BLO _LO1000
LDX #__RPAGE_ADR__
BRA Handle
_LO1000:
LDX #__EPAGE_ADR__
Handle:
LDAA 0,X ;/* load old page register content */
STAB 0,X ;/* set new page register */
STX 4,SP
PULX
RTS
}
}
#ifdef __cplusplus
extern "C"
#endif
#pragma NO_ENTRY
#pragma NO_EXIT
#pragma NO_FRAME
void NEAR _FAR_COPY_GLOBAL_LOGICAL_RC(void) {
asm {
STAB __GPAGE_ADR__
EXG X,Y
TFR A,B
PSHY ;/* space to store size */
PSHX ;/* allocate some space where _SET_PAGE_REG_HCS12X can return the page */
LDY 4,SP ;/* load return address */
LDX 2,Y+ ;/* load size */
STY 4,SP
LDY 2,SP ;/* restore dest pointer */
STX 2,SP ;/* store size */
LDX 0,SP ;/* reload src pointer */
__PIC_JSR(_SET_PAGE_REG_HCS12X)
Loop: GLDAB 1,Y+
STAB 1,X+
DECW 2,SP
BNE Loop
PULX ;/* reload page register address */
STAA 0,X ;/* restore old page content (necessary if it was PPAGE) */
PULX ;/* clean up stack */
_SRET ;/* debug info only: This is the last instr of a function with a special return */
RTS
}
}
#ifdef __cplusplus
extern "C"
#endif
#pragma NO_ENTRY
#pragma NO_EXIT
#pragma NO_FRAME
void NEAR _FAR_COPY_LOGICAL_GLOBAL_RC(void) {
asm {
STAA __GPAGE_ADR__
PSHY ;/* space to store size */
PSHX ;/* allocate some space where _SET_PAGE_REG_HCS12X can return the page */
LDY 4,SP ;/* load return address */
LDX 2,Y+ ;/* load size */
STY 4,SP
LDY 2,SP ;/* restore dest pointer */
STX 2,SP ;/* store size */
LDX 0,SP ;/* reload src pointer */
__PIC_JSR(_SET_PAGE_REG_HCS12X)
Loop: LDAB 1,X+
GSTAB 1,Y+
DECW 2,SP
BNE Loop
PULX
STAA 0,X ;/* restore old page content (necessary if it was PPAGE) */
PULX ;/* clean up stack */
_SRET ;/* debug info only: This is the last instr of a function with a special return */
RTS
}
}
#ifdef __cplusplus
extern "C"
#endif
#pragma NO_ENTRY
#pragma NO_EXIT
#pragma NO_FRAME
void NEAR _FAR_COPY_LOGICAL_LOGICAL_RC(void) {
asm {
PSHA
__PIC_JSR(_CONV_LOGICAL_TO_GLOBAL);
PULA
__PIC_JMP(_FAR_COPY_GLOBAL_LOGICAL_RC);
}
}
#ifdef __cplusplus
extern "C"
#endif
#pragma NO_ENTRY
#pragma NO_EXIT
#pragma NO_FRAME
void NEAR _FAR_COPY_NEAR_GLOBAL_RC(void) {
asm {
CLRB
__PIC_JMP(_FAR_COPY_LOGICAL_GLOBAL_RC);
}
}
#ifdef __cplusplus
extern "C"
#endif
#pragma NO_ENTRY
#pragma NO_EXIT
#pragma NO_FRAME
void NEAR _FAR_COPY_NEAR_LOGICAL_RC(void) {
asm {
PSHA
__PIC_JSR(_CONV_NEAR_TO_GLOBAL);
PULA
__PIC_JMP(_FAR_COPY_GLOBAL_LOGICAL_RC);
}
}
#ifdef __cplusplus
extern "C"
#endif
#pragma NO_ENTRY
#pragma NO_EXIT
#pragma NO_FRAME
void NEAR _FAR_COPY_GLOBAL_NEAR_RC(void) {
asm {
CLRA /* near to logical (we may have to use another runtime if this gets non trivial as well :-( */
__PIC_JMP(_FAR_COPY_GLOBAL_LOGICAL_RC);
}
}
#ifdef __cplusplus
extern "C"
#endif
#pragma NO_ENTRY
#pragma NO_EXIT
#pragma NO_FRAME
void NEAR _FAR_COPY_LOGICAL_NEAR_RC(void) {
asm {
EXG A,B
EXG X,Y
PSHA
__PIC_JSR(_CONV_NEAR_TO_GLOBAL);
PULA
EXG A,B
EXG X,Y
__PIC_JMP(_FAR_COPY_LOGICAL_GLOBAL_RC);
}
}
/* _FAR_COPY_LOGICAL_GLOBAL: is used by some old wizard generated projects. Not used by current setup anymore */
#ifdef __cplusplus
extern "C"
#endif
#pragma NO_ENTRY
#pragma NO_EXIT
#pragma NO_FRAME
void NEAR _FAR_COPY_LOGICAL_GLOBAL(void) {
asm {
STAA __GPAGE_ADR__
PSHX ;/* allocate some space where _SET_PAGE_REG_HCS12X can return the page */
__PIC_JSR(_SET_PAGE_REG_HCS12X)
Loop: LDAB 1,X+
GSTAB 1,Y+
DECW 4,SP
BNE Loop
PULX
STAA 0,X ;/* restore old page content (necessary if it was PPAGE) */
LDX 4,SP+ ;/* load return address and clean stack */
JMP 0,X
}
}
#endif /* __HCS12X__ */
/*----------------- end of code ------------------------------------------------*/
/*lint --e{766} , runtime.sgm is not a regular header file, it contains a conditionally compiled CODE_SEG pragma */
/*
* Note: This file is recreated by the project wizard whenever the MCU is
* changed and should not be edited by hand
*/
/* Include the derivative-specific header file */
#include <mc9s12hy64.h>
#pragma LINK_INFO DERIVATIVE "mc9s12hy64"
#define GLOBALS_VARIABLE
#include "../App_Headers/includes.h"
#include "../Library/TimeCtrl.h"
#include "../Library/FT_VehSpeedCalc.h"
void main(void) {
unsigned char i;
step_cycle = 0;
Api_Sys_Init();
App_State_Init();
App_Load_Data();
Format_CAN_Msg();
APP_Test_Init();
InitTimeCtrl();
//SetWheelInfo(309,68);
//CurVehSpeed = 0;
for(i = 0; i < TimeSNMax; i++){
EnableTimeCtrl(i);
}
//Api_SetTimer0(100,(ClockType *)&Clock);
for(;;) {
pSTB = 0;
__RESET_WATCHDOG();
Timer_2ms_Task();
APP_Button_Proc();
APP_ICM_Proc();
App_Can_Proc();
Api_LCD_Display();
}
}
[Environment Variables]
GENPATH={Project}Sources;{Compiler}lib\hc12c\src;{Compiler}lib\hc12c\include;{Compiler}lib\hc12c\lib;{Compiler}lib\xgatec\src;{Compiler}lib\xgatec\include;{Compiler}lib\xgatec\lib
LIBPATH={Compiler}lib\hc12c\include;{Compiler}lib\xgatec\include
OBJPATH={Project}bin
TEXTPATH={Project}bin
ABSPATH={Project}bin
[HI-WAVE]
Target=TBDML
Layout=C_layout.hwl
LoadDialogOptions=AUTOERASEANDFLASH RUNANDSTOPAFTERLOAD="main"
CPU=HC12
MainFrame=2,3,-1,-1,-1,-1,437,191,1367,927
TOOLBAR=57600 57601 32795 0 57635 57634 57637 0 57671 57669 0 32777 32776 32782 32780 32781 32778 0 32806
AEFWarningDialog=FALSE
Configuration=TBDML.hwc
Statusbar=1
ShowToolbar=1
Smallborder=0
Hideheadline=0
Hidetitle=0
[TBDML HCS12_GDI_SETTINGS]
CMDFILE0=CMDFILE STARTUP ON ".\cmd\TBDML_startup.cmd"
CMDFILE1=CMDFILE RESET ON ".\cmd\TBDML_reset.cmd"
CMDFILE2=CMDFILE PRELOAD ON ".\cmd\TBDML_preload.cmd"
CMDFILE3=CMDFILE POSTLOAD ON ".\cmd\TBDML_postload.cmd"
CMDFILE4=CMDFILE VPPON ON ".\cmd\TBDML_vppon.cmd"
CMDFILE5=CMDFILE VPPOFF ON ".\cmd\TBDML_vppoff.cmd"
CMDFILE6=CMDFILE UNSECURE ON ".\cmd\TBDML_erase_unsecure_hcs12p.cmd"
MCUID=0x02F2
CHIPSECURE=CHIPSECURE SETUP 0xFF0F 0x3 0x2
DBG0=DBG GENERAL DISARM_ON PROTECT_OFF ANALYZE_ON STEPATRUN_ON
DBG1=DBG PREDEFINED SELECT 0
DBG2=DBG PREDEFINED DBGENGINE TRACE ENABLE RECORDAFTER PUREPC
NV_PARAMETER_FILE=D:\New Folder\prog\FPP\mcu02F2.fpp
NV_SAVE_WSP=0
NV_AUTO_ID=1
COMDEVICE=SETCOMM COMPORT LPT "TBDML #1"
ISRDISABLEDSTEP=0
[TBDML]
COMSETTINGS=SETCOMM DRIVER NOPROTOCOL NOPERIODICAL
NV_PARAMETER_FILE=
NV_SAVE_WSP=0
NV_AUTO_ID=1
[Recent Applications File List]
File0=D:\TYW1̨\Test_Bench\bin\Project.abs
File1=C:\Users\ǿ\Desktop\TYW̨\Test_Bench\bin\Project.abs
File2=C:\Users\ǿ\Desktop\fs04___test_bench___little_can\Test_Bench\bin\Project.abs
File3=D:\LD01_02-ƿ3ϵ\̨\20210705\bin\Project.abs
LoadFlags0=AUTOERASEANDFLASH RUNANDSTOPAFTERLOAD="main"
LoadFlags1=AUTOERASEANDFLASH RUNANDSTOPAFTERLOAD="main"
LoadFlags2=AUTOERASEANDFLASH RUNANDSTOPAFTERLOAD="main"
LoadFlags3=AUTOERASEANDFLASH RUNANDSTOPAFTERLOAD="main"
[Recent Layout File List]
File0=C_layout.hwl
File1=
File2=
File3=
[Recent HI-WAVE FindProcedure Search]
Search0=main
Search1=App_Can_Proc
Search2=APP_ICM_Proc
#include "UDS_TP.h"
#include "UDS_Service.h"
/*
typedef struct
{
unsigned char ID;
unsigned char Switch;
unsigned int DID;
} s_ServiceSwitch;
s_UDS_ServiceBuffer Rx_Buffer;
s_UDS_ServiceBuffer Tx_Buffer;
unsigned char pRxTransfer;
unsigned char pTxTransfer;
unsigned char CF_SN = 0;
s_ServiceSwitch ServiceSwitch;
unsigned char Service27_Seed[8];
unsigned char Service27_Key[8];
void SetRxTransferStatus(e_TransferStatus sts, unsigned int UDS_Len)
{
Rx_Buffer.TransferStatus = sts;
if (sts == TransferStart)
{
Rx_Buffer.DataLen = UDS_Len - 1;
}
pRxTransfer = 0;
}
void SetTxTransferStatus(e_TransferStatus sts)
{
Tx_Buffer.TransferStatus = sts;
pTxTransfer = 0;
}
unsigned char GetRxTransferDataNumber(void)
{
return pRxTransfer;
}
void TransferServiceRxInfo(unsigned char *Data, unsigned char len)
{
unsigned char i;
if (Rx_Buffer.TransferStatus == TransferEnd)
{
return;
}
if (pRxTransfer == 0)
{
Rx_Buffer.ServiceID = Data[0];
for (i = 1; i < len; i++)
{
Rx_Buffer.Data[i - 1] = Data[i];
}
pRxTransfer += len - 1;
}
else
{
for (i = 0; i < len; i++)
{
Rx_Buffer.Data[pRxTransfer + i] = Data[i];
}
pRxTransfer += len;
}
}
e_TxType TransferServiceTxInfo(s_UDS_Msg_Buffer *buffer)
{
unsigned char len, i;
e_TxType type;
if (buffer->AnalysisStatus)
{
return Tx_NoAct;
}
if (Tx_Buffer.ServiceID == 0xFF)
{
return Tx_NoAct;
}
buffer->AnalysisStatus = 1;
if (Tx_Buffer.TransferStatus == TransferEnd)
{
Tx_Buffer.TransferStatus = TransferStart;
pTxTransfer = 0;
len = Tx_Buffer.DataLen + 1;
if (len < 8)
{
buffer->DataMsg.SF_Format.N_PCItype = N_PCITYPE_SF;
buffer->DataMsg.SF_Format.SF_DL = len;
buffer->DataMsg.SF_Format.Data1 = Tx_Buffer.ServiceID;
for (i = 0; i < Tx_Buffer.DataLen; i++)
{
buffer->DataMsg.Data[i + 2] = Tx_Buffer.Data[i];
}
Tx_Buffer.TransferStatus = TransferEnd;
pTxTransfer = 0;
type = Tx_SF;
}
else
{
buffer->DataMsg.FF_Format.N_PCItype = N_PCITYPE_FF;
buffer->DataMsg.FF_Format.FF_DL_L = len;
buffer->DataMsg.FF_Format.FF_DL_H = len >> 8;
buffer->DataMsg.FF_Format.Data2 = Tx_Buffer.ServiceID;
for (i = 0; i < 5; i++)
{
buffer->DataMsg.Data[i + 3] = Tx_Buffer.Data[i];
}
pTxTransfer += 5;
CF_SN = 1;
type = Tx_FF;
}
}
else
{
buffer->DataMsg.CF_Format.N_PCItype = N_PCITYPE_CF;
buffer->DataMsg.CF_Format.SN = CF_SN;
CF_SN++;
if (CF_SN > 15)
{
CF_SN = 0;
}
if ((Tx_Buffer.DataLen - pTxTransfer) > 7)
{
for (i = 0; i < 7; i++)
{
buffer->DataMsg.Data[i + 1] = Tx_Buffer.Data[i + pTxTransfer];
}
type = Tx_CF;
pTxTransfer += 7;
}
else
{
for (i = 0; i < (Tx_Buffer.DataLen - pTxTransfer); i++)
{
buffer->DataMsg.Data[i + 1] = Tx_Buffer.Data[i + pTxTransfer];
}
Tx_Buffer.TransferStatus = TransferEnd;
pTxTransfer = 0;
type = Tx_End;
}
}
return type;
}
void ServiceID_DiagnosticSessionControlProc(unsigned char DID)
{
Tx_Buffer.ServiceID = ServiceID_DiagnosticSessionControl;
Tx_Buffer.DataLen = 1;
Tx_Buffer.Data[0] = DID;
}
void ServiceID_ECUResetProc(unsigned char DID)
{
Tx_Buffer.ServiceID = ServiceID_ECUReset;
Tx_Buffer.DataLen = 1;
Tx_Buffer.Data[0] = DID;
}
void ServiceID_SecurityAccessProc(unsigned char DID)
{
if (DID % 2)
{
Tx_Buffer.ServiceID = ServiceID_SecurityAccess;
Tx_Buffer.DataLen = 1;
Tx_Buffer.Data[0] = DID;
}
else
{
Tx_Buffer.ServiceID = ServiceID_SecurityAccess;
Tx_Buffer.DataLen = 9;
Tx_Buffer.Data[0] = DID;
Tx_Buffer.Data[1] = Service27_Key[0];
Tx_Buffer.Data[2] = Service27_Key[1];
Tx_Buffer.Data[3] = Service27_Key[2];
Tx_Buffer.Data[4] = Service27_Key[3];
Tx_Buffer.Data[5] = Service27_Key[4];
Tx_Buffer.Data[6] = Service27_Key[5];
Tx_Buffer.Data[7] = Service27_Key[6];
Tx_Buffer.Data[8] = Service27_Key[7];
}
}
void ServiceID_ReadDataByIdentifierProc(unsigned int DID)
{
Tx_Buffer.ServiceID = ServiceID_ReadDataByIdentifier;
Tx_Buffer.DataLen = 2;
Tx_Buffer.Data[0] = DID >> 8;
Tx_Buffer.Data[1] = DID;
}
void ServiceID_WriteDataByIdentifierProc(unsigned int DID)
{
Tx_Buffer.ServiceID = ServiceID_WriteDataByIdentifier;
Tx_Buffer.DataLen = 6;
Tx_Buffer.Data[0] = DID >> 8;
Tx_Buffer.Data[1] = DID;
Tx_Buffer.Data[2] = 0xFF;
Tx_Buffer.Data[3] = 0xFF;
Tx_Buffer.Data[4] = 0x57;
Tx_Buffer.Data[5] = 0x06;
}
void ServiceID_TesterPresentProc(void)
{
Tx_Buffer.ServiceID = ServiceID_TesterPresent;
Tx_Buffer.DataLen = 1;
Tx_Buffer.Data[0] = 0x00;
}
void UDS_SendSerivceMain(void)
{
if (ServiceSwitch.Switch)
{
ServiceSwitch.Switch = 0;
switch (ServiceSwitch.ID)
{
case ServiceID_DiagnosticSessionControl:
{
ServiceID_DiagnosticSessionControlProc(ServiceSwitch.DID);
}
break;
case ServiceID_ECUReset:
{
ServiceID_ECUResetProc(ServiceSwitch.DID);
}
break;
case ServiceID_SecurityAccess:
{
ServiceID_SecurityAccessProc(ServiceSwitch.DID);
}
break;
case ServiceID_ReadDataByIdentifier:
{
ServiceID_ReadDataByIdentifierProc(ServiceSwitch.DID);
}
break;
case ServiceID_WriteDataByIdentifier:
{
ServiceID_WriteDataByIdentifierProc(ServiceSwitch.DID);
}
break;
case ServiceID_TesterPresent:
{
ServiceID_TesterPresentProc();
}
break;
default:;
}
EnableUDSSend();
}
}
unsigned char UDS_Button = 0xFF;
void UDS_ServiceMain(void)
{
if (UDS_Button != 0xFF)
{
ServiceSwitch.ID = UDS_Button;
ServiceSwitch.Switch = 1;
UDS_Button = 0xFF;
}
if (GetCtrlTime(UDS_3E_Service) >= 3000)
{
ServiceSwitch.ID = ServiceID_TesterPresent;
ServiceSwitch.Switch = 1;
}
UDS_SendSerivceMain();
AnalysisUDSMessage();
if (CommunicateStatus == COMM_WaitServiceHandle)
{
CommunicateStatus = COMM_Free;
switch (Rx_Buffer.ServiceID - 0x40)
{
case ServiceID_SecurityAccess:
{
if (Rx_Buffer.Data[0] == 0x01)
{
memcpy((void *)Service27_Seed, (void *)&Rx_Buffer.Data[1], 8);
ASK_KeyGenerate(Service27_Seed, Service27_Key);
//ServiceID_SecurityAccessProc(0x02);
ClearCtrlTime(UDS_3E_Service);
//CommunicateStatus = COMM_Send_Frame;
}
}
break;
case ServiceID_WriteDataByIdentifier:
{
EOL_Complete_Ctrl(1);
}
break;
case 0x7F:
{
if ((Rx_Buffer.Data[0] == 0x2E) && (Rx_Buffer.Data[1] == 0x78))
{
;
}
else
{
EOL_Complete_Ctrl(0);
NextEOLStep();
}
}
break;
default:
{
;
}
}
if (GetWaitReqServiceID() == (Rx_Buffer.ServiceID - 0x40))
{
NextEOLStep();
}
}
TP_SendServiceMsg();
}
void SetServiceProc(unsigned char ServiceID, unsigned int ServiceDID)
{
ServiceSwitch.Switch = 1;
ServiceSwitch.ID = ServiceID;
ServiceSwitch.DID = ServiceDID;
}*/
\ No newline at end of file
#ifndef __UDS_SERVICE_H_
#define __UDS_SERVICE_H_
/*
#define ServiceID_DiagnosticSessionControl 0x10
#define ServiceID_ECUReset 0x11
#define ServiceID_SecurityAccess 0x27
#define ServiceID_ReadDataByIdentifier 0x22
#define ServiceID_WriteDataByIdentifier 0x2E
#define ServiceID_TesterPresent 0x3E
typedef enum
{
TransferEnd = 0,
TransferStart,
} e_TransferStatus;
typedef enum
{
Tx_NoAct = 0,
Tx_SF,
Tx_FF,
Tx_CF,
Tx_End,
} e_TxType;
typedef struct
{
unsigned char ServiceID;
e_TransferStatus TransferStatus;
unsigned int DataLen;
unsigned char Data[64];
} s_UDS_ServiceBuffer;
void SetRxTransferStatus(e_TransferStatus sts, unsigned int UDS_Len);
unsigned char GetRxTransferDataNumber(void);
void TransferServiceRxInfo(unsigned char *Data, unsigned char len);
void UDS_ServiceMain(void);
void SetServiceProc(unsigned char ServiceID, unsigned int ServiceDID);
e_TxType TransferServiceTxInfo(s_UDS_Msg_Buffer *buffer);
*/
#endif
#include "UDS_TP.h"
#include "UDS_Service.h"
/*
unsigned int TP_SendTime;
s_UDS_Msg_Buffer UDS_Rx_Buffer[2];
s_UDS_Msg_Buffer AnalysisBuffer;
s_UDS_Msg_Buffer UDS_Tx_Buffer;
e_CommunicateStatus CommunicateStatus;
unsigned int RxLength = 0;
void GetUDSMessage(unsigned char *CAN_BufAddr, unsigned char len)
{
unsigned char i;
if ((UDS_Rx_Buffer[0].AnalysisStatus == 0) && (UDS_Rx_Buffer[1].AnalysisStatus == 0))
{
for (i = 0; i < len; i++)
{
UDS_Rx_Buffer[0].DataMsg.Data[i] = CAN_BufAddr[i];
}
UDS_Rx_Buffer[0].AnalysisStatus = 1;
}
else if ((UDS_Rx_Buffer[0].AnalysisStatus == 1) && (UDS_Rx_Buffer[1].AnalysisStatus == 0))
{
for (i = 0; i < len; i++)
{
UDS_Rx_Buffer[1].DataMsg.Data[i] = CAN_BufAddr[i];
}
UDS_Rx_Buffer[1].AnalysisStatus = 1;
}
else if ((UDS_Rx_Buffer[0].AnalysisStatus == 0) && (UDS_Rx_Buffer[1].AnalysisStatus == 1))
{
UDS_Rx_Buffer[0] = UDS_Rx_Buffer[1];
for (i = 0; i < len; i++)
{
UDS_Rx_Buffer[1].DataMsg.Data[i] = CAN_BufAddr[i];
}
UDS_Rx_Buffer[1].AnalysisStatus = 1;
}
ClearCtrlTime(UDS_3E_Service);
}
unsigned char FillTxBuffer(unsigned char *Data, unsigned char len)
{
unsigned char i;
if (UDS_Tx_Buffer.AnalysisStatus)
{
return 0;
}
for (i = 0; i < 8; i++)
{
if (i < len)
{
UDS_Tx_Buffer.DataMsg.Data[i] = Data[i];
}
else
{
UDS_Tx_Buffer.DataMsg.Data[i] = 0x55;
}
}
UDS_Tx_Buffer.AnalysisStatus = 1;
return 1;
}
void ClearUDS_Msg_Buffer(s_UDS_Msg_Buffer *buffer)
{
unsigned char i;
for (i = 0; i < 8; i++)
{
buffer->DataMsg.Data[i] = 0xFF;
}
buffer->AnalysisStatus = 0;
}
void AnalysisUDSMessage(void)
{
unsigned char i;
unsigned int wTemp;
e_TxType rType;
if (AnalysisBuffer.AnalysisStatus == 0)
{
if (UDS_Rx_Buffer[0].AnalysisStatus == 1)
{
AnalysisBuffer = UDS_Rx_Buffer[0];
UDS_Rx_Buffer[0].AnalysisStatus = 0;
ClearUDS_Msg_Buffer(&UDS_Rx_Buffer[0]);
}
if ((UDS_Rx_Buffer[0].AnalysisStatus == 0) && (UDS_Rx_Buffer[1].AnalysisStatus == 1))
{
UDS_Rx_Buffer[0] = UDS_Rx_Buffer[1];
UDS_Rx_Buffer[1].AnalysisStatus = 0;
ClearUDS_Msg_Buffer(&UDS_Rx_Buffer[1]);
}
}
if ((UDS_Rx_Buffer[0].DataMsg.FC_Format.N_PCItype == N_PCITYPE_FC) || (UDS_Rx_Buffer[1].DataMsg.FC_Format.N_PCItype == N_PCITYPE_FC))
{
wTemp = 9999;
}
if (AnalysisBuffer.DataMsg.Data[0] == 0x30)
{
wTemp = 9999;
}
switch (CommunicateStatus)
{
case COMM_Free:
{
if (AnalysisBuffer.DataMsg.SF_Format.N_PCItype == N_PCITYPE_SF)
{
if ((AnalysisBuffer.DataMsg.SF_Format.SF_DL < 8) && (AnalysisBuffer.DataMsg.SF_Format.SF_DL != 0))
{
if (AnalysisBuffer.DataMsg.Data[1] != 0x7E)
{
CommunicateStatus = COMM_WaitServiceHandle;
SetRxTransferStatus(TransferStart, AnalysisBuffer.DataMsg.SF_Format.SF_DL);
TransferServiceRxInfo(&AnalysisBuffer.DataMsg.Data[1], AnalysisBuffer.DataMsg.SF_Format.SF_DL);
SetRxTransferStatus(TransferEnd, 0);
}
}
}
else if (AnalysisBuffer.DataMsg.FF_Format.N_PCItype == N_PCITYPE_FF)
{
RxLength = AnalysisBuffer.DataMsg.FF_Format.FF_DL_H;
RxLength = RxLength << 8;
RxLength = RxLength | AnalysisBuffer.DataMsg.FF_Format.FF_DL_L;
if (RxLength >= 8)
{
CommunicateStatus = COMM_Send_FC;
SetRxTransferStatus(TransferStart, RxLength);
TransferServiceRxInfo(&AnalysisBuffer.DataMsg.Data[2], 6);
}
}
}
break;
case COMM_Send_FC:
{
TP_SendFC();
CommunicateStatus = COMM_Wait_CF;
}
break;
case COMM_Wait_CF:
{
if (AnalysisBuffer.DataMsg.CF_Format.N_PCItype == N_PCITYPE_CF)
{
TransferServiceRxInfo(&AnalysisBuffer.DataMsg.Data[1], 7);
if (GetRxTransferDataNumber() > RxLength)
{
CommunicateStatus = COMM_WaitServiceHandle;
RxLength = 0;
SetRxTransferStatus(TransferEnd, 0);
}
}
}
break;
case COMM_Send_Frame:
{
rType = TransferServiceTxInfo(&UDS_Tx_Buffer);
if (rType == Tx_FF)
{
CommunicateStatus = COMM_Wait_FC;
}
else if ((rType == Tx_End) || (rType == Tx_SF))
{
CommunicateStatus = COMM_Free;
}
}
break;
case COMM_Wait_FC:
{
ClearCtrlTime(UDS_3E_Service);
EnableTimeCtrl(UDS_CF_Send);
if (GetCtrlTime(UDS_CF_Send) >= 100)
{
DisableTimeCtrl(UDS_CF_Send);
CommunicateStatus = COMM_Send_Frame;
}
if (AnalysisBuffer.DataMsg.FC_Format.N_PCItype == N_PCITYPE_FC)
{
CommunicateStatus = COMM_Send_Frame;
}
}
break;
default:;
}
AnalysisBuffer.AnalysisStatus = 0;
ClearUDS_Msg_Buffer(&AnalysisBuffer);
}
void TP_SendFC(void)
{
unsigned char data[8];
unsigned char ret;
data[0] = 0x30;
data[1] = 0x08;
data[2] = 0x14;
ret = FillTxBuffer(data, 3);
TP_SendTime = 10;
}
void EnableUDSSend(void)
{
CommunicateStatus = COMM_Send_Frame;
}
void TP_SendServiceMsg(void)
{
if (UDS_Tx_Buffer.AnalysisStatus)
{
UDS_Tx_Buffer.AnalysisStatus = 0;
CanFD_Send_StandMsg(CANFD0_Type, 0x7C6, BUF_8, TX_ISR_EN, (uint8_t *)&UDS_Tx_Buffer.DataMsg.Data, 8);
ClearUDS_Msg_Buffer(&UDS_Tx_Buffer);
ClearCtrlTime(UDS_3E_Service);
}
}*/
\ No newline at end of file
#ifndef __UDS_TP_H_
#define __UDS_TP_H_
/*
#define N_PCITYPE_SF 0
#define N_PCITYPE_FF 1
#define N_PCITYPE_CF 2
#define N_PCITYPE_FC 3
typedef enum
{
COMM_Free = 0,
COMM_Send_FC,
COMM_Wait_FC,
COMM_Wait_CF,
COMM_Send_Frame,
COMM_WaitServiceHandle,
} e_CommunicateStatus;
typedef union
{
struct
{
unsigned char SF_DL : 4;
unsigned char N_PCItype : 4;
unsigned char Data1 : 8;
unsigned char Data2 : 8;
unsigned char Data3 : 8;
unsigned char Data4 : 8;
unsigned char Data5 : 8;
unsigned char Data6 : 8;
unsigned char Data7 : 8;
} SF_Format;
struct
{
unsigned char FF_DL_H : 4;
unsigned char N_PCItype : 4;
unsigned char FF_DL_L : 8;
unsigned char Data2 : 8;
unsigned char Data3 : 8;
unsigned char Data4 : 8;
unsigned char Data5 : 8;
unsigned char Data6 : 8;
unsigned char Data7 : 8;
} FF_Format;
struct
{
unsigned char SN : 4;
unsigned char N_PCItype : 4;
unsigned char Data1 : 8;
unsigned char Data2 : 8;
unsigned char Data3 : 8;
unsigned char Data4 : 8;
unsigned char Data5 : 8;
unsigned char Data6 : 8;
unsigned char Data7 : 8;
} CF_Format;
struct
{
unsigned char FS : 4;
unsigned char N_PCItype : 4;
unsigned char BS : 8;
unsigned char STmin : 8;
unsigned char Data3 : 8;
unsigned char Data4 : 8;
unsigned char Data5 : 8;
unsigned char Data6 : 8;
unsigned char Data7 : 8;
} FC_Format;
unsigned char Data[8];
} u_UDS_Message_Format;
typedef struct
{
u_UDS_Message_Format DataMsg;
unsigned char AnalysisStatus;
} s_UDS_Msg_Buffer;
extern s_UDS_Msg_Buffer UDS_Tx_Buffer;
extern e_CommunicateStatus CommunicateStatus;
void GetUDSMessage(unsigned char *CAN_BufAddr, unsigned char len);
unsigned char FillTxBuffer(unsigned char *Data, unsigned char len);
void ClearUDS_Msg_Buffer(s_UDS_Msg_Buffer *buffer);
void AnalysisUDSMessage(void);
void TP_SendFC(void);
void EnableUDSSend(void);
void TP_SendServiceMsg(void);
*/
#endif
\ No newline at end of file
// ver 0.1 (09-Mar-08)
// HCS12P Core erasing + unsecuring command file:
// These commands mass erase the chip then program the security byte to 0xFE (unsecured state).
DEFINEVALUEDLG "Information required to unsecure the device" "FCLKDIV" 17 "To unsecure the device, the command script needs \nthe correct value for the FCLKDIV onchip register.\n\nDatasheet proposed values:\n\noscillator frequency\tFCLKDIV value (decimal)\n\n 16 \tMHz\t\t17\n 12 \tMHz\t\t13\n 8 \tMHz\t\t9\n 4 \tMHz\t\t5\n"
FLASH RELEASE
reset
wb 0x03c 0x00 //disable cop
wait 20
WB 0x100 FCLKDIV // clock divider
WB 0x106 0x30 // clear any error flags
WB 0x102 0x00 // CCOBIX = 0
WB 0x10A 0x08 // load erase all blocks command
WB 0x106 0x80 // launch command
WAIT 10
reset
WB 0x100 FCLKDIV // clock divider
WB 0x106 0x30 // clear any error flags
WB 0x102 0x00 // CCOBIX = 0
WB 0x10A 0x06 // load program command
WB 0x10B 0x03 // load GPAGE
WB 0x102 0x01 // CCOBIX = 1
WB 0x10A 0xFF // load addr hi
WB 0x10B 0x08 // load addr lo
WB 0x102 0x02 // CCOBIX = 2
WB 0x10A 0xFF // load data
WB 0x10B 0xFF // load data
WB 0x102 0x03 // CCOBIX = 3
WB 0x10A 0xFF // load data
WB 0x10B 0xFF // load data
WB 0x102 0x04 // CCOBIX = 4
WB 0x10A 0xFF // load data
WB 0x10B 0xFF // load data
WB 0x102 0x05 // CCOBIX = 5
WB 0x10A 0xFF // load data
WB 0x10B 0xFE // load data
WB 0x106 0x80 // launch command
WAIT 1
undef FCLKDIV // undefine variable
// After load the commands written below will be executed
// Before load the commands written below will be executed
// After reset the commands written below will be executed
// At startup the commands written below will be executed
// After programming the flash, the commands written below will be executed
// Before programming the flash, the commands written below will be executed
// ver 0.1 (09-Mar-08)
// HCS12P Core erasing + unsecuring command file:
// These commands mass erase the chip then program the security byte to 0xFE (unsecured state).
DEFINEVALUEDLG "Information required to unsecure the device" "FCLKDIV" 17 "To unsecure the device, the command script needs \nthe correct value for the FCLKDIV onchip register.\n\nDatasheet proposed values:\n\noscillator frequency\tFCLKDIV value (decimal)\n\n 16 \tMHz\t\t17\n 12 \tMHz\t\t13\n 8 \tMHz\t\t9\n 4 \tMHz\t\t5\n"
FLASH RELEASE
reset
wb 0x03c 0x00 //disable cop
wait 20
WB 0x100 FCLKDIV // clock divider
WB 0x106 0x30 // clear any error flags
WB 0x102 0x00 // CCOBIX = 0
WB 0x10A 0x08 // load erase all blocks command
WB 0x106 0x80 // launch command
WAIT 10
reset
WB 0x100 FCLKDIV // clock divider
WB 0x106 0x30 // clear any error flags
WB 0x102 0x00 // CCOBIX = 0
WB 0x10A 0x06 // load program command
WB 0x10B 0x03 // load GPAGE
WB 0x102 0x01 // CCOBIX = 1
WB 0x10A 0xFF // load addr hi
WB 0x10B 0x08 // load addr lo
WB 0x102 0x02 // CCOBIX = 2
WB 0x10A 0xFF // load data
WB 0x10B 0xFF // load data
WB 0x102 0x03 // CCOBIX = 3
WB 0x10A 0xFF // load data
WB 0x10B 0xFF // load data
WB 0x102 0x04 // CCOBIX = 4
WB 0x10A 0xFF // load data
WB 0x10B 0xFF // load data
WB 0x102 0x05 // CCOBIX = 5
WB 0x10A 0xFF // load data
WB 0x10B 0xFE // load data
WB 0x106 0x80 // launch command
WAIT 1
undef FCLKDIV // undefine variable
// After load the commands written below will be executed
// Before load the commands written below will be executed
// After reset the commands written below will be executed
// At startup the commands written below will be executed
// After programming the flash, the commands written below will be executed
// Before programming the flash, the commands written below will be executed
// ver 0.1 (09-Mar-08)
// HCS12P Core erasing + unsecuring command file:
// These commands mass erase the chip then program the security byte to 0xFE (unsecured state).
DEFINEVALUEDLG "Information required to unsecure the device" "FCLKDIV" 17 "To unsecure the device, the command script needs \nthe correct value for the FCLKDIV onchip register.\n\nDatasheet proposed values:\n\noscillator frequency\tFCLKDIV value (decimal)\n\n 16 \tMHz\t\t17\n 12 \tMHz\t\t13\n 8 \tMHz\t\t9\n 4 \tMHz\t\t5\n"
FLASH RELEASE
reset
wb 0x03c 0x00 //disable cop
wait 20
WB 0x100 FCLKDIV // clock divider
WB 0x106 0x30 // clear any error flags
WB 0x102 0x00 // CCOBIX = 0
WB 0x10A 0x08 // load erase all blocks command
WB 0x106 0x80 // launch command
WAIT 10
reset
WB 0x100 FCLKDIV // clock divider
WB 0x106 0x30 // clear any error flags
WB 0x102 0x00 // CCOBIX = 0
WB 0x10A 0x06 // load program command
WB 0x10B 0x03 // load GPAGE
WB 0x102 0x01 // CCOBIX = 1
WB 0x10A 0xFF // load addr hi
WB 0x10B 0x08 // load addr lo
WB 0x102 0x02 // CCOBIX = 2
WB 0x10A 0xFF // load data
WB 0x10B 0xFF // load data
WB 0x102 0x03 // CCOBIX = 3
WB 0x10A 0xFF // load data
WB 0x10B 0xFF // load data
WB 0x102 0x04 // CCOBIX = 4
WB 0x10A 0xFF // load data
WB 0x10B 0xFF // load data
WB 0x102 0x05 // CCOBIX = 5
WB 0x10A 0xFF // load data
WB 0x10B 0xFE // load data
WB 0x106 0x80 // launch command
WAIT 1
undef FCLKDIV // undefine variable
// After load the commands written below will be executed
// Before load the commands written below will be executed
// After reset the commands written below will be executed
// At startup the commands written below will be executed
// After programming the flash, the commands written below will be executed
// Before programming the flash, the commands written below will be executed
/* This is a linker parameter file for the MC9S12HY64 */
NAMES END /* CodeWarrior will pass all the needed files to the linker by command line. But here you may add your own files too. */
SEGMENTS /* Here all RAM/ROM areas of the device are listed. Used in PLACEMENT below. */
/* Register space */
/* IO_SEG = PAGED 0x0000 TO 0x03FF; intentionally not defined */
/* RAM */
RAM = READ_WRITE 0x3000 TO 0x3FFF;
/* D-Flash */
DFLASH = READ_ONLY 0x0C10 TO 0x013FF;
/* non-paged FLASHs */
ROM_1400 = READ_ONLY 0x1400 TO 0x2FFF;
ROM_4000 = READ_ONLY 0x4000 TO 0x7FFF;
ROM_C000 = READ_ONLY 0xC000 TO 0xFEFF;
/* VECTORS = READ_ONLY 0xFF00 TO 0xFFFF; intentionally not defined: used for VECTOR commands below */
OSVECTORS = READ_ONLY 0xFF80 TO 0xFFFF; /* OSEK interrupt vectors (use your vector.o) */
/* paged FLASH: 0x8000 TO 0xBFFF; addressed through PPAGE */
PAGE_0C = READ_ONLY 0x0C8000 TO 0x0C93FF;
PAGE_0C_B000 = READ_ONLY 0x0CB000 TO 0x0CBFFF;
PAGE_0E = READ_ONLY 0x0E8000 TO 0x0EBFFF;
/* PAGE_0D = READ_ONLY 0x0D8000 TO 0x0DBFFF; not used: equivalent to ROM_4000 */
/* PAGE_0F = READ_ONLY 0x0F8000 TO 0x0FBEFF; not used: equivalent to ROM_C000 */
END
PLACEMENT /* here all predefined and user segments are placed into the SEGMENTS defined above. */
_PRESTART, /* Used in HIWARE format: jump to _Startup at the code start */
STARTUP, /* startup data structures */
ROM_VAR, /* constant variables */
STRINGS, /* string literals */
VIRTUAL_TABLE_SEGMENT, /* C++ virtual table segment */
//.ostext, /* OSEK */
DEFAULT_ROM, NON_BANKED, /* runtime routines which must not be banked */
COPY /* copy down information: how to initialize variables */
/* in case you want to use ROM_4000 here as well, make sure
that all files (incl. library files) are compiled with the
option: -OnB=b */
INTO ROM_C000, ROM_1400, ROM_4000;
OTHER_ROM INTO PAGE_0C, PAGE_0C_B000, PAGE_0E ;
//.stackstart, /* eventually used for OSEK kernel awareness: Main-Stack Start */
SSTACK, /* allocate stack first to avoid overwriting variables on overflow */
//.stackend, /* eventually used for OSEK kernel awareness: Main-Stack End */
DEFAULT_RAM INTO RAM;
//.vectors INTO OSVECTORS; /* OSEK */
VECTORS_DATA INTO OSVECTORS;
END
ENTRIES /* keep the following unreferenced variables */
/* OSEK: always allocate the vector table and all dependent objects */
//_vectab OsBuildNumber _OsOrtiStackStart _OsOrtiStart
_vectab
END
STACKSIZE 0x100
//VECTOR 0 _Startup /* reset vector: this is the default entry point for a C/C++ application. */
//VECTOR 0 Entry /* reset vector: this is the default entry point for an Assembly application. */
//INIT Entry /* for assembly applications: that this is as well the initialization entry point */
/* logical s-record file */
OPENFILE "%ABS_FILE%.s19"
format=motorola
busWidth=1
origin=0
len=0x1000000
destination=0
SRECORD=Sx
SENDBYTE 1 "%ABS_FILE%"
CLOSE
/* physical s-record file */
OPENFILE "%ABS_FILE%.phy"
format = motorola
busWidth = 1
len = 0x4000
/* logical non banked flash at $4000 and $C000 to physical */
origin = 0x004000
destination = 0x0F8000
SENDBYTE 1 "%ABS_FILE%"
origin = 0x00C000
destination = 0x0FC000
SENDBYTE 1 "%ABS_FILE%"
/* physical FTS512K flash window to physical
origin = 0x008000
destination = 0x080000
SENDBYTE 1 "%ABS_FILE%"
*/
/* physical FTS256K parts flash window to physical
origin = 0x008000
destination = 0x0C0000
SENDBYTE 1 "%ABS_FILE%"
*/
/* physical FTS128K parts flash window to physical
origin = 0x008000
destination = 0x0E0000
SENDBYTE 1 "%ABS_FILE%"
*/
/* physical FTS64K parts flash window to physical
origin = 0x008000
destination = 0x0F0000
SENDBYTE 1 "%ABS_FILE%"
*/
/* physical FTS32K parts flash window to physical
origin = 0x008000
destination = 0x0F8000
SENDBYTE 1 "%ABS_FILE%"
*/
/* logical 512 kB banked flash to physical */
origin = 0x208000
destination = 0x080000
SENDBYTE 1 "%ABS_FILE%"
origin = 0x218000
destination = 0x084000
SENDBYTE 1 "%ABS_FILE%"
origin = 0x228000
destination = 0x088000
SENDBYTE 1 "%ABS_FILE%"
origin = 0x238000
destination = 0x08C000
SENDBYTE 1 "%ABS_FILE%"
origin = 0x248000
destination = 0x090000
SENDBYTE 1 "%ABS_FILE%"
origin = 0x258000
destination = 0x094000
SENDBYTE 1 "%ABS_FILE%"
origin = 0x268000
destination = 0x098000
SENDBYTE 1 "%ABS_FILE%"
origin = 0x278000
destination = 0x09C000
SENDBYTE 1 "%ABS_FILE%"
origin = 0x288000
destination = 0x0A0000
SENDBYTE 1 "%ABS_FILE%"
origin = 0x298000
destination = 0x0A4000
SENDBYTE 1 "%ABS_FILE%"
origin = 0x2A8000
destination = 0x0A8000
SENDBYTE 1 "%ABS_FILE%"
origin = 0x2B8000
destination = 0x0AC000
SENDBYTE 1 "%ABS_FILE%"
origin = 0x2C8000
destination = 0x0B0000
SENDBYTE 1 "%ABS_FILE%"
origin = 0x2D8000
destination = 0x0B4000
SENDBYTE 1 "%ABS_FILE%"
origin = 0x2E8000
destination = 0x0B8000
SENDBYTE 1 "%ABS_FILE%"
origin = 0x2F8000
destination = 0x0BC000
SENDBYTE 1 "%ABS_FILE%"
origin = 0x308000
destination = 0x0C0000
SENDBYTE 1 "%ABS_FILE%"
origin = 0x318000
destination = 0x0C4000
SENDBYTE 1 "%ABS_FILE%"
origin = 0x328000
destination = 0x0C8000
SENDBYTE 1 "%ABS_FILE%"
origin = 0x338000
destination = 0x0CC000
SENDBYTE 1 "%ABS_FILE%"
origin = 0x348000
destination = 0x0D0000
SENDBYTE 1 "%ABS_FILE%"
origin = 0x358000
destination = 0x0D4000
SENDBYTE 1 "%ABS_FILE%"
origin = 0x368000
destination = 0x0D8000
SENDBYTE 1 "%ABS_FILE%"
origin = 0x378000
destination = 0x0DC000
SENDBYTE 1 "%ABS_FILE%"
origin = 0x388000
destination = 0x0E0000
SENDBYTE 1 "%ABS_FILE%"
origin = 0x398000
destination = 0x0E4000
SENDBYTE 1 "%ABS_FILE%"
origin = 0x3A8000
destination = 0x0E8000
SENDBYTE 1 "%ABS_FILE%"
origin = 0x3B8000
destination = 0x0EC000
SENDBYTE 1 "%ABS_FILE%"
origin = 0x3C8000
destination = 0x0F0000
SENDBYTE 1 "%ABS_FILE%"
origin = 0x3D8000
destination = 0x0F4000
SENDBYTE 1 "%ABS_FILE%"
origin = 0x3E8000
destination = 0x0F8000
SENDBYTE 1 "%ABS_FILE%"
origin = 0x3F8000
destination = 0x0FC000
SENDBYTE 1 "%ABS_FILE%"
CLOSE
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment