From 1ee6286c26b4b54b91a938261f2ec8ed7e30d98c Mon Sep 17 00:00:00 2001 From: liumin Date: Sat, 5 Jul 2025 07:59:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E8=87=B3?= =?UTF-8?q?=20/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- User.c.bak | 330 +++++++++++++++++++++++++++++++++++++++++++++++++++++ WDT.C | 206 +++++++++++++++++++++++++++++++++ WDT.H | 130 +++++++++++++++++++++ user.H | 120 +++++++++++++++++++ user.H.bak | 57 +++++++++ 5 files changed, 843 insertions(+) create mode 100644 User.c.bak create mode 100644 WDT.C create mode 100644 WDT.H create mode 100644 user.H create mode 100644 user.H.bak diff --git a/User.c.bak b/User.c.bak new file mode 100644 index 0000000..22b39dd --- /dev/null +++ b/User.c.bak @@ -0,0 +1,330 @@ +#include "MAIN.H" +//can信息 +UnInfCan UnInfCan_1 = {0}; +UnSwSample UnSwSample_1 = {0}; +UnSwOut UnSwOut_1 = {0}; + +//CAN发送周期 +uword CntCan_1 = 0; +bit FlgCan_1 = 0; +//第一次采集到有效数据指示 +bit FlgOneTime = 0; + +uword RgCanPerid = 1000; + +//PWM 20181227 +ubyte PwmH[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; +//----------------------------------------------------------------------- +//RTC定时器 +//----------------------------------------------------------------------- +void RTCProcess(void) +{ +//************************************************************************ +//////CAN发送周期 + if(FlgCan_1){CntCan_1++;if(CntCan_1 >= RgCanPerid){FlgCan_1=0; CntCan_1=0;}}else{CntCan_1=0;} + +//************************************************************************ +} + +//输出PWM 20181227 +/* +ubyte *pStt, 状态机变量 +bit Cmd, 状态机输入,1,根据PwmH的值来决定输出,0,输出0 +bit Out, 状态机输出 +ubyte *pCnt, 定时计数器 +ubyte *pPwmH 状态机参数,PWM的高电平时间 +*/ +bit funcPwmOut(ubyte *pStt,bit Cmd,ubyte *pCnt,ubyte *pPwmH) +{ +ubyte PwmL = 0; +bit Out = 0; +//------------------------------------------------------------------------------------------------ + if((*pPwmH) > dfPwmH)(*pPwmH) = dfPwmH; //限制最大值 + PwmL = dfPwmH - (*pPwmH);//计算PWM低电平 + + if((1 == Cmd) ) + { + if(0 == (*pPwmH)) //高电平为0,表示PWM无效,由Cmd来控制,Cmd为1输出1,Cmd为0,输出0 + { + Out = 1; + (*pStt) = 0; + } + else + { + switch((*pStt)) + { + case 0: + (*pCnt) = 0; + (*pStt) = 1; + Out = 1; + break; + case 1: + if((*pCnt) >= (*pPwmH)) + { + (*pCnt) = 0; + (*pStt) = 2; + Out = 0; + } + else + { + (*pCnt)++; + (*pStt) = 1; + Out = 1; + } + break; + case 2: + if((*pCnt) >= PwmL) + { + (*pCnt) = 0; + (*pStt) = 1; + Out = 1; + } + else + { + (*pCnt)++; + (*pStt) = 2; + Out = 0; + } + break; + //----------------------------------------------------- + default:; + }//switch + }//else + }//if + else + { + Out = 0; + (*pStt) = 0; + } + return Out; +} + + +//根据接收的CAN缓冲区数据驱动相应LED指示灯。 +void LedDr(void) +{ +static ubyte RgSTT[16] = {0}; +static ubyte CntTime[16] = {0}; +//------------------------------------------------------------------------------------------------ + + dfOut_01 = funcPwmOut(&RgSTT[0 ],dfCmd_01,&CntTime[0 ],&PwmH[0 ]); + dfOut_02 = funcPwmOut(&RgSTT[1 ],dfCmd_02,&CntTime[1 ],&PwmH[1 ]); + dfOut_03 = funcPwmOut(&RgSTT[2 ],dfCmd_03,&CntTime[2 ],&PwmH[2 ]); + dfOut_04 = funcPwmOut(&RgSTT[3 ],dfCmd_04,&CntTime[3 ],&PwmH[3 ]); + dfOut_05 = funcPwmOut(&RgSTT[4 ],dfCmd_05,&CntTime[4 ],&PwmH[4 ]); + dfOut_06 = funcPwmOut(&RgSTT[5 ],dfCmd_06,&CntTime[5 ],&PwmH[5 ]); + dfOut_07 = funcPwmOut(&RgSTT[6 ],dfCmd_07,&CntTime[6 ],&PwmH[6 ]); + dfOut_08 = funcPwmOut(&RgSTT[7 ],dfCmd_08,&CntTime[7 ],&PwmH[7 ]); + dfOut_09 = funcPwmOut(&RgSTT[8 ],dfCmd_09,&CntTime[8 ],&PwmH[8 ]); + dfOut_10 = funcPwmOut(&RgSTT[9 ],dfCmd_10,&CntTime[9 ],&PwmH[9 ]); + dfOut_11 = funcPwmOut(&RgSTT[10],dfCmd_11,&CntTime[10],&PwmH[10]); + dfOut_12 = funcPwmOut(&RgSTT[11],dfCmd_12,&CntTime[11],&PwmH[11]); + dfOut_13 = funcPwmOut(&RgSTT[12],dfCmd_13,&CntTime[12],&PwmH[12]); + dfOut_14 = funcPwmOut(&RgSTT[13],dfCmd_14,&CntTime[13],&PwmH[13]); + dfOut_15 = funcPwmOut(&RgSTT[14],dfCmd_15,&CntTime[14],&PwmH[14]); + dfOut_16 = funcPwmOut(&RgSTT[15],dfCmd_16,&CntTime[15],&PwmH[15]); + +} + + +//can错误处理 +void CanErrorProcess(void) +{ + ubyte ubNSRL; + ubyte ubNSRH; + ubyte ubResetLEC = 0x3F; +//------------------------------------------- + EA = 0; + + CAN_pushAMRegs(); // push the CAN Access Mediator Registers + SFR_PAGE(_su0, SST0); // switch to page 0 + + CAN_vWriteCANAddress(CAN_NSR0); + CAN_vReadEN(); + ubNSRL = CAN_DATA0; + ubNSRH = CAN_DATA1; + if (ubNSRL & 0x20) // if ALERT + { + CAN_vInit(); + } + if (ubNSRL & 0x07) // if LEC + { + ubResetLEC = 0x38; + } + //// Reset LEC, TXOK, RXOK, ALERT, EWRN, BOFF, LLE, LOE (if set) + CAN_vWriteCANAddress(CAN_NSR0); // Addressing CAN_NSR0 + CAN_DATA0 = ~(ubNSRL & ubResetLEC); // load CAN_NSR0 status register[7-0] + CAN_DATA1 = ~(ubNSRH); // load CAN_NSR0 status register[15-8] + CAN_vWriteEN(D0_VALID+D1_VALID); // Data0 and Data1 are Valid for + + SFR_PAGE(_su0, RST0); // restore the old SCU page + CAN_popAMRegs(); // restore the CAN Access Mediator Registers + + EA = 1; +} + + +////效验算法 +//void Password(void) +//{ +// ubyte i; +////--------------------------------- +// for(i=0;i<5;i++) +// { +// UnInfCan_1.ArrData.Arr[0][4] ^= UnInfCan_1.ArrData.Arr[0][3];//CAN 第0个字节 +// UnInfCan_1.ArrData.Arr[0][4] ^= UnInfCan_1.ArrData.Arr[0][2];//CAN 第1个字节 +// UnInfCan_1.ArrData.Arr[0][4] ^= UnInfCan_1.ArrData.Arr[0][1];//CAN 第2个字节 +// UnInfCan_1.ArrData.Arr[0][4] ^= UnInfCan_1.ArrData.Arr[0][0];//CAN 第3个字节 +// UnInfCan_1.ArrData.Arr[0][4] ^= UnInfCan_1.ArrData.Arr[0][7];//CAN 第4个字节 +// UnInfCan_1.ArrData.Arr[0][4] ^= UnInfCan_1.ArrData.Arr[0][6];//CAN 第5个字节 +// UnInfCan_1.ArrData.Arr[0][4] ^= UnInfCan_1.ArrData.Arr[0][5];//CAN 第6个字节 +// } +//} + + +void CanTransmit(void) +{ +// ulong i; +//----------------- -------- + CAN_waitTransmit(DF_SwTx);//发送前等待上一帧发送完毕,这样不会丢帧 +// Password(); + + CAN_vLoadData(DF_SwTx, (ulong *)(&UnInfCan_1.ArrData.Arr[0][0])); // 装载数据 + CAN_vTransmit(DF_SwTx); +} + + +//CAN发送一帧 +void CanTX(void) +{ +//----------------------------------- + if(1 == SwOut09)UnInfCan_1.ArrData.Arr[0][3] |= (~0x01);else UnInfCan_1.ArrData.Arr[0][3] &= 0x01; //KGF1 //20200303修改为与接收到的数据一致,反馈与接收到时数据为一致 + if(1 == SwOut10)UnInfCan_1.ArrData.Arr[0][3] |= (~0x02);else UnInfCan_1.ArrData.Arr[0][3] &= 0x02; //KGF2 + if(1 == SwOut04)UnInfCan_1.ArrData.Arr[0][3] |= (~0x04);else UnInfCan_1.ArrData.Arr[0][3] &= 0x04; //KGF3 + if(1 == SwOut03)UnInfCan_1.ArrData.Arr[0][3] |= (~0x08);else UnInfCan_1.ArrData.Arr[0][3] &= 0x08; //KGF4 + if(1 == SwOut06)UnInfCan_1.ArrData.Arr[0][3] |= (~0x10);else UnInfCan_1.ArrData.Arr[0][3] &= 0x10; //KGF5 + if(1 == SwOut05)UnInfCan_1.ArrData.Arr[0][3] |= (~0x20);else UnInfCan_1.ArrData.Arr[0][3] &= 0x20; //KGF6 + if(1 == SwOut15)UnInfCan_1.ArrData.Arr[0][3] |= (~0x40);else UnInfCan_1.ArrData.Arr[0][3] &= 0x40; //KGF7 + if(1 == SwOut16)UnInfCan_1.ArrData.Arr[0][3] |= (~0x80);else UnInfCan_1.ArrData.Arr[0][3] &= 0x80; //KGF8 + if(1 == SwOut13)UnInfCan_1.ArrData.Arr[0][2] |= (~0x01);else UnInfCan_1.ArrData.Arr[0][2] &= 0x01; //KGF9 + if(1 == SwOut14)UnInfCan_1.ArrData.Arr[0][2] |= (~0x02);else UnInfCan_1.ArrData.Arr[0][2] &= 0x02; //KGF10 + if(1 == SwOut08)UnInfCan_1.ArrData.Arr[0][2] |= (~0x04);else UnInfCan_1.ArrData.Arr[0][2] &= 0x04; //KGF11 + if(1 == SwOut07)UnInfCan_1.ArrData.Arr[0][2] |= (~0x08);else UnInfCan_1.ArrData.Arr[0][2] &= 0x08; //KGF12 + if(1 == SwOut02)UnInfCan_1.ArrData.Arr[0][2] |= (~0x10);else UnInfCan_1.ArrData.Arr[0][2] &= 0x10; //KGF13 + if(1 == SwOut01)UnInfCan_1.ArrData.Arr[0][2] |= (~0x20);else UnInfCan_1.ArrData.Arr[0][2] &= 0x20; //KGF14 + if(1 == SwOut11)UnInfCan_1.ArrData.Arr[0][2] |= (~0x40);else UnInfCan_1.ArrData.Arr[0][2] &= 0x40; //KGF15 + if(1 == SwOut12)UnInfCan_1.ArrData.Arr[0][2] |= (~0x80);else UnInfCan_1.ArrData.Arr[0][2] &= 0x80; //KGF16 + + if(1 == SwIn01 )UnInfCan_1.ArrData.Arr[0][1] &= (~0x01);else UnInfCan_1.ArrData.Arr[0][1] |= 0x01; //Dia01 20200225修改为0数据变为1,1数据变为0,这样大CPU方便处理 + if(1 == SwIn02 )UnInfCan_1.ArrData.Arr[0][1] &= (~0x02);else UnInfCan_1.ArrData.Arr[0][1] |= 0x02; //Dia02 + if(1 == SwIn03 )UnInfCan_1.ArrData.Arr[0][1] &= (~0x04);else UnInfCan_1.ArrData.Arr[0][1] |= 0x04; //Dia03 + if(1 == SwIn04 )UnInfCan_1.ArrData.Arr[0][1] &= (~0x08);else UnInfCan_1.ArrData.Arr[0][1] |= 0x08; //Dia04 + if(1 == SwIn05 )UnInfCan_1.ArrData.Arr[0][1] &= (~0x10);else UnInfCan_1.ArrData.Arr[0][1] |= 0x10; //Dia05 + if(1 == SwIn06 )UnInfCan_1.ArrData.Arr[0][1] &= (~0x20);else UnInfCan_1.ArrData.Arr[0][1] |= 0x20; //Dia06 + if(1 == SwIn07 )UnInfCan_1.ArrData.Arr[0][1] &= (~0x40);else UnInfCan_1.ArrData.Arr[0][1] |= 0x40; //Dia07 + if(1 == SwIn08 )UnInfCan_1.ArrData.Arr[0][1] &= (~0x80);else UnInfCan_1.ArrData.Arr[0][1] |= 0x80; //Dia08 + + UnInfCan_1.ArrData.Arr[0][0] = 0; + UnInfCan_1.ArrData.Arr[0][7] = 0; + UnInfCan_1.ArrData.Arr[0][6] = 0; + UnInfCan_1.ArrData.Arr[0][5] = (ubyte)(RgCanPerid>>8); + UnInfCan_1.ArrData.Arr[0][4] = (ubyte)(RgCanPerid); + + CanTransmit(); +} + +//CAN发送接收 +void CanRXTX(void) +{ + stCAN_SWObj StrCanRx = {0}; + uword tmp = 0; + ubyte i = 0,j = 0; +//------------------------------------ + if(CAN_ubNewData(DF_SwRx)) + { + CAN_vGetMsgObj(DF_SwRx, &StrCanRx); + + UnInfCan_1.ArrData.ArrRX[0][3] = StrCanRx.ulDATAL.ubDB[0]; + UnInfCan_1.ArrData.ArrRX[0][2] = StrCanRx.ulDATAL.ubDB[1]; + UnInfCan_1.ArrData.ArrRX[0][1] = StrCanRx.ulDATAL.ubDB[2]; + UnInfCan_1.ArrData.ArrRX[0][0] = StrCanRx.ulDATAL.ubDB[3]; + UnInfCan_1.ArrData.ArrRX[0][7] = StrCanRx.ulDATAH.ubDB[0]; + UnInfCan_1.ArrData.ArrRX[0][6] = StrCanRx.ulDATAH.ubDB[1]; + UnInfCan_1.ArrData.ArrRX[0][5] = StrCanRx.ulDATAH.ubDB[2]; + UnInfCan_1.ArrData.ArrRX[0][4] = StrCanRx.ulDATAH.ubDB[3]; + + CAN_vReleaseObj(DF_SwRx); + + //CAN发送周期 50-5000ms + tmp = (uword)UnInfCan_1.ArrData.ArrRX[0][6]; + tmp = (tmp << 8); + tmp |= ((uword)UnInfCan_1.ArrData.ArrRX[0][7]); + if(tmp >= 50)RgCanPerid = tmp; + if(tmp >= 5000)RgCanPerid = 5000; + +// UnInfCan_1.ArrData.Arr[0][3] = UnInfCan_1.ArrData.ArrRX[0][0]; +// UnInfCan_1.ArrData.Arr[0][2] = UnInfCan_1.ArrData.ArrRX[0][1]; +// UnInfCan_1.ArrData.Arr[0][1] = UnInfCan_1.ArrData.ArrRX[0][2]; 20200225注释不更新诊断数据 +// UnInfCan_1.ArrData.Arr[0][0] = UnInfCan_1.ArrData.ArrRX[0][3]; +// UnInfCan_1.ArrData.Arr[0][7] = UnInfCan_1.ArrData.ArrRX[0][4]; +// UnInfCan_1.ArrData.Arr[0][6] = UnInfCan_1.ArrData.ArrRX[0][5]; +// UnInfCan_1.ArrData.Arr[0][5] = (ubyte)(RgCanPerid>>8); +// UnInfCan_1.ArrData.Arr[0][4] = (ubyte)(RgCanPerid); +// CanTransmit(); 20200730不发送干扰数据运行 + } + + if(CAN_ubNewData(DF_SwRxPwm)) + { + CAN_vGetMsgObj(DF_SwRxPwm, &StrCanRx); + + UnInfCan_1.ArrData.ArrRX[1][2] = StrCanRx.ulDATAL.ubDB[0]; + UnInfCan_1.ArrData.ArrRX[1][3] = StrCanRx.ulDATAL.ubDB[1]; + UnInfCan_1.ArrData.ArrRX[1][0] = StrCanRx.ulDATAL.ubDB[2]; + UnInfCan_1.ArrData.ArrRX[1][1] = StrCanRx.ulDATAL.ubDB[3]; + UnInfCan_1.ArrData.ArrRX[1][6] = StrCanRx.ulDATAH.ubDB[0]; + UnInfCan_1.ArrData.ArrRX[1][7] = StrCanRx.ulDATAH.ubDB[1]; + UnInfCan_1.ArrData.ArrRX[1][4] = StrCanRx.ulDATAH.ubDB[2]; + UnInfCan_1.ArrData.ArrRX[1][5] = StrCanRx.ulDATAH.ubDB[3]; + + CAN_vReleaseObj(DF_SwRxPwm); + //接收的数据保存到PWM数据结构中20181227 + PwmH[0 ] = (ubyte)UnInfCan_1.BitData.Pwm_01; + PwmH[1 ] = (ubyte)UnInfCan_1.BitData.Pwm_02; + PwmH[2 ] = (ubyte)UnInfCan_1.BitData.Pwm_03; + PwmH[3 ] = (ubyte)UnInfCan_1.BitData.Pwm_04; + PwmH[4 ] = (ubyte)UnInfCan_1.BitData.Pwm_05; + PwmH[5 ] = (ubyte)UnInfCan_1.BitData.Pwm_06; + PwmH[6 ] = (ubyte)UnInfCan_1.BitData.Pwm_07; + PwmH[7 ] = (ubyte)UnInfCan_1.BitData.Pwm_08; + PwmH[8 ] = (ubyte)UnInfCan_1.BitData.Pwm_09; + PwmH[9 ] = (ubyte)UnInfCan_1.BitData.Pwm_10; + PwmH[10] = (ubyte)UnInfCan_1.BitData.Pwm_11; + PwmH[11] = (ubyte)UnInfCan_1.BitData.Pwm_12; + PwmH[12] = (ubyte)UnInfCan_1.BitData.Pwm_13; + PwmH[13] = (ubyte)UnInfCan_1.BitData.Pwm_14; + PwmH[14] = (ubyte)UnInfCan_1.BitData.Pwm_15; + PwmH[15] = (ubyte)UnInfCan_1.BitData.Pwm_16; + + +// UnInfCan_1.ArrData.Arr[0][3] = UnInfCan_1.ArrData.ArrRX[1][0]; +// UnInfCan_1.ArrData.Arr[0][2] = UnInfCan_1.ArrData.ArrRX[1][1]; +// UnInfCan_1.ArrData.Arr[0][1] = UnInfCan_1.ArrData.ArrRX[1][2]; 20200225注释不更新诊断数据 +// UnInfCan_1.ArrData.Arr[0][0] = UnInfCan_1.ArrData.ArrRX[1][3]; +// UnInfCan_1.ArrData.Arr[0][7] = UnInfCan_1.ArrData.ArrRX[1][4]; +// UnInfCan_1.ArrData.Arr[0][6] = UnInfCan_1.ArrData.ArrRX[1][5]; +// UnInfCan_1.ArrData.Arr[0][5] = UnInfCan_1.ArrData.ArrRX[1][6]; +// UnInfCan_1.ArrData.Arr[0][4] = UnInfCan_1.ArrData.ArrRX[1][7]; +// CanTransmit(); + + } + //接收一帧,调用一次点灯程序。 + LedDr(); + +//100ms发送一帧 + if(!FlgCan_1) + { + FlgCan_1 = 1; + CanTX(); + } + +} diff --git a/WDT.C b/WDT.C new file mode 100644 index 0000000..2508eb8 --- /dev/null +++ b/WDT.C @@ -0,0 +1,206 @@ +//**************************************************************************** +// @Module Watch Dog Timer +// @Filename WDT.C +// @Project CL2.0.dav +//---------------------------------------------------------------------------- +// @Controller Infineon XC886CLM-8FF +// +// @Compiler Keil +// +// @Codegenerator 1.3 +// +// @Description: This file contains functions that use the WDT module. +// +//---------------------------------------------------------------------------- +// @Date 2025/1/18 20:45:32 +// +//**************************************************************************** + +// USER CODE BEGIN (WDT_General,1) + +// USER CODE END + + + +//**************************************************************************** +// @Project Includes +//**************************************************************************** + +#include "MAIN.H" + +// USER CODE BEGIN (WDT_General,2) + +// USER CODE END + + +//**************************************************************************** +// @Macros +//**************************************************************************** + +// USER CODE BEGIN (WDT_General,3) + +// USER CODE END + + +//**************************************************************************** +// @Defines +//**************************************************************************** + +// USER CODE BEGIN (WDT_General,4) + +// USER CODE END + + +//**************************************************************************** +// @Typedefs +//**************************************************************************** + +// USER CODE BEGIN (WDT_General,5) + +// USER CODE END + + +//**************************************************************************** +// @Imported Global Variables +//**************************************************************************** + +// USER CODE BEGIN (WDT_General,6) + +// USER CODE END + + +//**************************************************************************** +// @Global Variables +//**************************************************************************** + +// USER CODE BEGIN (WDT_General,7) + +// USER CODE END + + +//**************************************************************************** +// @External Prototypes +//**************************************************************************** + +// USER CODE BEGIN (WDT_General,8) + +// USER CODE END + + +//**************************************************************************** +// @Prototypes Of Local Functions +//**************************************************************************** + +// USER CODE BEGIN (WDT_General,9) + +// USER CODE END + + +//**************************************************************************** +// @Function void WDT_vInit(void) +// +//---------------------------------------------------------------------------- +// @Description This is the initialization function of the 'Watch Dog +// Timer' function library. It is assumed that the SFRs used +// by this library are in their reset state. +// +// The watchdog timer is used. +// The following SFR fields will be initialized: +// WDTREL - WDT reload value +// WDTIN - WDT input frequency selection +// Then the watchdog timer will be refreshed. +// Note: The user has to take care that RMAP bit in SYSCON0 is +// to be set while using the registers of Watch dog timer. +// Registers are WDTCON,WDTWINB,WDTREL,WDTH,WDTL +// +//---------------------------------------------------------------------------- +// @Returnvalue None +// +//---------------------------------------------------------------------------- +// @Parameters None +// +//---------------------------------------------------------------------------- +// @Date 2025/1/18 +// +//**************************************************************************** + +// USER CODE BEGIN (WDT_Init,1) + +// USER CODE END + +void WDT_vInit(void) +{ + // USER CODE BEGIN (WDT_Init,2) + + // USER CODE END + + /// the watchdog timer is used and it is enabled in INIT function,user has + /// to take care of WDT refresh + /// the RMAP bit of SYSCON0 is set + /// the input frequency is fSYS/128 + /// the watchdog timer reload value is 0xDB + /// the watchdog timeout period is 50 ms + + SFR_PAGE(_su1, noSST); // switch to page1 without saving + + MAIN_vUnlockProtecReg(); // open access to protected register + SFR_PAGE(_su0, noSST); // switch to page0 with out saving + + SYSCON0 |= 0x01; // set RMAP + WDTREL = 0xDB; //Watch dog timer reload register + WDTCON |= 0x04; // set WDTEN + WDTCON |= 0x03; // set WDTRS,set WDTIN + SYSCON0 &= ~(ubyte)0x01; // clear RMAP + SFR_PAGE(_su1, noSST); // switch to page1 without saving + + MAIN_vlockProtecReg(); // close access to protected register + SFR_PAGE(_su0, noSST); // switch to page0 with out saving + + // USER CODE BEGIN (WDT_Init,3) + + // USER CODE END + + + +} // End of function WDT_vInit + + +//**************************************************************************** +// @Function void WDT_vDisable(void) +// +//---------------------------------------------------------------------------- +// @Description This function disables the WDT. +// pls refer to the Note on WDT_vInit function Description +// +//---------------------------------------------------------------------------- +// @Returnvalue None +// +//---------------------------------------------------------------------------- +// @Parameters None +// +//---------------------------------------------------------------------------- +// @Date 2025/1/18 +// +//**************************************************************************** + +void WDT_vDisable(void) +{ + SFR_PAGE(_su1, noSST); // switch to page1 without saving + + MAIN_vUnlockProtecReg(); // open access to protected register + SFR_PAGE(_su0, noSST); // switch to page0 with out saving + + SET_RMAP(); + WDTCON &= ~(ubyte)0x04; // clear WDTEN + RESET_RMAP(); + SFR_PAGE(_su1, noSST); // switch to page1 without saving + + MAIN_vlockProtecReg(); // close access to protected register + SFR_PAGE(_su0, noSST); // switch to page0 with out saving +} // End of function WDT_vDisable + + +// USER CODE BEGIN (WDT_General,10) + +// USER CODE END + diff --git a/WDT.H b/WDT.H new file mode 100644 index 0000000..8baf9f5 --- /dev/null +++ b/WDT.H @@ -0,0 +1,130 @@ +//**************************************************************************** +// @Module Watch Dog Timer +// @Filename WDT.H +// @Project CL2.0.dav +//---------------------------------------------------------------------------- +// @Controller Infineon XC886CLM-8FF +// +// @Compiler Keil +// +// @Codegenerator 1.3 +// +// @Description: This file contains all function prototypes and macros for +// the WDT module. +// +//---------------------------------------------------------------------------- +// @Date 2025/1/18 20:45:32 +// +//**************************************************************************** + +// USER CODE BEGIN (WDT_Header,1) + +// USER CODE END + + + +#ifndef _WDT_H_ +#define _WDT_H_ + +//**************************************************************************** +// @Project Includes +//**************************************************************************** + +// USER CODE BEGIN (WDT_Header,2) + +// USER CODE END + + +//**************************************************************************** +// @Macros +//**************************************************************************** + +// USER CODE BEGIN (WDT_Header,3) + +// USER CODE END + + +//**************************************************************************** +// @Defines +//**************************************************************************** + +// USER CODE BEGIN (WDT_Header,4) + +// USER CODE END + + +//**************************************************************************** +// @Typedefs +//**************************************************************************** + +// USER CODE BEGIN (WDT_Header,5) + +// USER CODE END + + +//**************************************************************************** +// @Imported Global Variables +//**************************************************************************** + +// USER CODE BEGIN (WDT_Header,6) + +// USER CODE END + + +//**************************************************************************** +// @Global Variables +//**************************************************************************** + +// USER CODE BEGIN (WDT_Header,7) + +// USER CODE END + + +//**************************************************************************** +// @Prototypes Of Global Functions +//**************************************************************************** + +void WDT_vInit(void); +void WDT_vDisable(void); + +// USER CODE BEGIN (WDT_Header,8) + +// USER CODE END + + +//**************************************************************************** +// @Macro WDT_vRefresh() +// +//---------------------------------------------------------------------------- +// @Description This macro refreshes the watchdog timer to the reload +// value. The interrupts are disabled during execution of the +// instructions that set bit WDTRS. +// Note: The user has to take care that this macro is called +// before expiry of the watchdog timer. +// pls refer to the Note on WDT_vInit function Description +// +//---------------------------------------------------------------------------- +// @Returnvalue None +// +//---------------------------------------------------------------------------- +// @Parameters None +// +//---------------------------------------------------------------------------- +// @Date 2025/1/18 +// +//**************************************************************************** + +#define WDT_vRefresh() { EA = 0; SET_RMAP(); WDTCON |= 0x02; \ + RESET_RMAP(); EA = 1; } + + +//**************************************************************************** +// @Interrupt Vectors +//**************************************************************************** + + +// USER CODE BEGIN (WDT_Header,9) + +// USER CODE END + +#endif // ifndef _WDT_H_ diff --git a/user.H b/user.H new file mode 100644 index 0000000..e7be7d9 --- /dev/null +++ b/user.H @@ -0,0 +1,120 @@ +#ifndef _user_H_ +#define _user_H_ + +#define DF_SwTx 6 +#define DF_SwRx 7 +#define DF_RXTIME 11 +#define DF_SwTxKGF1 8 +#define DF_SwTxKGF2 10 +#define DF_SwTxTemp 12 +#define DF_SwRxKGF2 13 + + + +#define dfPwmH 10 //PWM的高电平时间,10,10ms左右,具体需要测试20181227 + + +#define WAKE_UP_PIN P1_4 //高压开关引脚 +#define KGF_PIN P0_0 //唤醒引脚 +#define CAN_PIN P1_6 //唤醒引脚 +#define STOP_PIN P1_2 //急停开关引脚 + +#define BATTERY_PIN P3_6 //电池控制脚 + + +#define ON 0 //按下 +#define OFF 1 //松开 + +#define FAULT 0 +#define NORMAL 1 + + +// 定义电源状态枚举 +typedef enum { + POWER_STANDBY, + POWER_WORKING, + POWER_EMERGENCY, + POWER_PRE_CHARGE, + POWER_NEUTRAL, + POWER_SLEEP +} PowerState; + + + +// 输出到开关阀模块 +typedef struct _StrInfCanKGFOutput +{ + //----------主机发送命令字0x11000002 -------------------------------------------- + unsigned int KGF01 : 1; // 通道1 + unsigned int KGF02 : 1; // 通道2 + unsigned int KGF03 : 1; // 通道3 + unsigned int KGF04 : 1; // 通道4 + unsigned int KGF05 : 1; // 通道5 + unsigned int KGF06 : 1; // 通道6 + unsigned int KGF07 : 1; // 通道7 + unsigned int KGF08 : 1; // 通道8 + unsigned int KGF09 : 1; // 通道9 + unsigned int KGF10 : 1; // 通道10 + unsigned int KGF11 : 1; // 通道11 + unsigned int KGF12 : 1; // 通道12 + unsigned int KGF13 : 1; // 通道13 + unsigned int KGF14 : 1; // 通道14 + unsigned int KGF15 : 1; // 通道15 + unsigned int KGF16 : 1; // 通道16 + + unsigned int can_rx2 : 8; // 保留 + unsigned int can_rx3 : 8; // 保留 + unsigned int can_rx4 : 8; // 保留 + unsigned int can_rx5 : 8; // 保留 + unsigned int can_period_h : 8; // 发送周期高位 + unsigned int can_period_l : 8; // 发送周期低位 + + //----------发送0x11000003 --------------------------------------------------- + unsigned int pwm_01 : 4; // PWM通道1 + unsigned int pwm_02 : 4; // PWM通道2 + unsigned int pwm_03 : 4; // PWM通道3 + unsigned int pwm_04 : 4; // PWM通道4 + unsigned int pwm_05 : 4; // PWM通道5 + unsigned int pwm_06 : 4; // PWM通道6 + unsigned int pwm_07 : 4; // PWM通道7 + unsigned int pwm_08 : 4; // PWM通道8 + unsigned int pwm_09 : 4; // PWM通道9 + unsigned int pwm_10 : 4; // PWM通道10 + unsigned int pwm_11 : 4; // PWM通道11 + unsigned int pwm_12 : 4; // PWM通道12 + unsigned int pwm_13 : 4; // PWM通道13 + unsigned int pwm_14 : 4; // PWM通道14 + unsigned int pwm_15 : 4; // PWM通道15 + unsigned int pwm_16 : 4; // PWM通道16 +} StrInfCanKGFOutput; + +typedef union _UnInfCanKGFOutput +{ + StrInfCanKGFOutput bit_data; // 使用定义的结构体变量名 + ubyte arr[sizeof(StrInfCanKGFOutput)]; // 通过结构体类型确定大小 +} UnInfCanKGFOutput; + + + + + + +//---外部要使用变量声明--------------------------------------------------------------------- +extern UnSwOut UnSwOut_1; +extern UnInfCan UnInfCan_1; +extern uword CntCan_1; +extern bit FlgCan_1; +extern ubyte can_error_cnt; +extern ubyte can_error_flg; + + +extern UnInfCanKGFOutput un_inf_can_kgf_output1;//kgf输出 + +void CanRXTX(void); +void SwSample(void); +void LedDr(void); +void RTCProcess(void); +void CanErrorProcess(void); +void CanTransmit(void); +void canSendTo(ubyte index, ubyte *buff); +#endif \ No newline at end of file diff --git a/user.H.bak b/user.H.bak new file mode 100644 index 0000000..6a13b4d --- /dev/null +++ b/user.H.bak @@ -0,0 +1,57 @@ +#ifndef _user_H_ +#define _user_H_ + +#define DF_SwTx 6 +#define DF_SwRx 7 + +#define dfCmd01 UnInfCan_1.BitData.D21 //KGF1 +#define dfCmd02 UnInfCan_1.BitData.D22 //KGF2 +#define dfCmd03 UnInfCan_1.BitData.D23 //KGF3 +#define dfCmd04 UnInfCan_1.BitData.D24 //KGF4 +#define dfCmd05 UnInfCan_1.BitData.D25 //KGF5 +#define dfCmd06 UnInfCan_1.BitData.D26 //KGF6 +#define dfCmd07 UnInfCan_1.BitData.D27 //KGF7 +#define dfCmd08 UnInfCan_1.BitData.D28 //KGF8 +#define dfCmd09 UnInfCan_1.BitData.D29 //KGF9 +#define dfCmd10 UnInfCan_1.BitData.D30 //KGF10 +#define dfCmd11 UnInfCan_1.BitData.D31 //KGF11 +#define dfCmd12 UnInfCan_1.BitData.D32 //KGF12 +#define dfCmd13 UnInfCan_1.BitData.D33 //KGF13 +#define dfCmd14 UnInfCan_1.BitData.D34 //KGF14 +#define dfCmd15 UnInfCan_1.BitData.D35 //KGF15 +#define dfCmd16 UnInfCan_1.BitData.D36 //KGF16 + +#define dfOut01 SwOut09 //KGF1 +#define dfOut02 SwOut10 //KGF2 +#define dfOut03 SwOut04 //KGF3 +#define dfOut04 SwOut03 //KGF4 +#define dfOut05 SwOut06 //KGF5 +#define dfOut06 SwOut05 //KGF6 +#define dfOut07 SwOut15 //KGF7 +#define dfOut08 SwOut16 //KGF8 +#define dfOut09 SwOut13 //KGF9 +#define dfOut10 SwOut14 //KGF10 +#define dfOut11 SwOut08 //KGF11 +#define dfOut12 SwOut07 //KGF12 +#define dfOut13 SwOut02 //KGF13 +#define dfOut14 SwOut01 //KGF14 +#define dfOut15 SwOut11 //KGF15 +#define dfOut16 SwOut12 //KGF16 + + + + +//---外部要使用变量声明--------------------------------------------------------------------- +extern UnSwOut UnSwOut_1; +extern UnInfCan UnInfCan_1; +extern uword CntCan_1; +extern bit FlgCan_1; + +void CanRXTX(void); +void SwSample(void); +void LedDr(void); +void RTCProcess(void); +void CanErrorProcess(void); +void CanTransmit(void); + +#endif \ No newline at end of file