diff --git a/PS.H b/PS.H new file mode 100644 index 0000000..fc8ce79 --- /dev/null +++ b/PS.H @@ -0,0 +1,202 @@ +//**************************************************************************** +// @Module Power Saving Modes +// @Filename PS.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 PS module. +// +//---------------------------------------------------------------------------- +// @Date 2025/1/21 08:53:36 +// +//**************************************************************************** + +// USER CODE BEGIN (PS_Header,1) + +// USER CODE END + + + +#ifndef _PS_H_ +#define _PS_H_ + +//**************************************************************************** +// @Project Includes +//**************************************************************************** + +// USER CODE BEGIN (PS_Header,2) + +// USER CODE END + + +//**************************************************************************** +// @Macros +//**************************************************************************** + +// USER CODE BEGIN (PS_Header,3) + +// USER CODE END + + +//**************************************************************************** +// @Defines +//**************************************************************************** + +// USER CODE BEGIN (PS_Header,4) + +// USER CODE END + + +//**************************************************************************** +// @Typedefs +//**************************************************************************** + +// USER CODE BEGIN (PS_Header,5) + +// USER CODE END + + +//**************************************************************************** +// @Imported Global Variables +//**************************************************************************** + +// USER CODE BEGIN (PS_Header,6) + +// USER CODE END + + +//**************************************************************************** +// @Global Variables +//**************************************************************************** + +// USER CODE BEGIN (PS_Header,7) + +// USER CODE END + + +//**************************************************************************** +// @Prototypes Of Global Functions +//**************************************************************************** + +void PS_vInit(void); +void PS_vSetPowerDown(void); +void PS_vSetSlowDown(void); +void PS_vResetSlowDown(void); + +// USER CODE BEGIN (PS_Header,8) + +// USER CODE END + + +//**************************************************************************** +// @Macro void PS_vSetIdle() +// +//---------------------------------------------------------------------------- +// @Description This macro enters the idle mode by setting bit IDLE in SFR +// PCON. The instruction will stop the CPU immediately. Thus +// any following code will not be executed before the +// controller has been restarted by an interrupt. +// +//---------------------------------------------------------------------------- +// @Returnvalue None +// +//---------------------------------------------------------------------------- +// @Parameters None +// +//---------------------------------------------------------------------------- +// @Date 2025/1/21 +// +//**************************************************************************** + +#define PS_vSetIdle() PCON |= 0x01 + + +//**************************************************************************** +// @Macro PS_vDisableModule(ModuleName) +// +//---------------------------------------------------------------------------- +// @Description This macro disables a specific peripheral module which is +// passed in a parameter.Switch the page to 1 using the +// statementSFR_PAGE(_su1, SST1); before calling this +// Disable macro.After that again switch back the page to 0 +// with the macro SFR_PAGE(_su1, RST1);.The following +// constants are available for 'ModuleName': +// ADC, T2, CCU, SSC, MDU, CAN, CDC, T21, UART1 +// +//---------------------------------------------------------------------------- +// @Returnvalue None +// +//---------------------------------------------------------------------------- +// @Parameters ModuleName: +// Name of the Module +// +//---------------------------------------------------------------------------- +// @Date 2025/1/21 +// +//**************************************************************************** + +#define PS_vDisableModule(Module) PS_vDisableModule_(Module) + +#define PS_vDisableModule_(Module) PS_vDisableModule_##Module + +#define PS_vDisableModule_ADC PMCON1 |= 0x01 +#define PS_vDisableModule_T2 PMCON1 |= 0x08 +#define PS_vDisableModule_CCU PMCON1 |= 0x04 +#define PS_vDisableModule_SSC PMCON1 |= 0x02 +#define PS_vDisableModule_MDU PMCON1 |= 0x10 +#define PS_vDisableModule_CAN PMCON1 |= 0x20 +#define PS_vDisableModule_CDC PMCON1 |= 0x40 +#define PS_vDisableModule_T21 PMCON2 |= 0x01 +#define PS_vDisableModule_UART1 PMCON2 |= 0x02 + + +//**************************************************************************** +// @Macro PS_vEnableModule(ModuleName) +// +//---------------------------------------------------------------------------- +// @Description This macro enables a specific peripheral module which is +// passed in a parameter. Switch the page to 1 using the +// statement SFR_PAGE(_su1, SST1); before calling this +// Enable macro.After that again switch back the page to 0 +// with the macro SFR_PAGE(_su1, RST1);.The following +// constants are available for 'ModuleName': +// ADC, T2, CCU, SSC, MDU, CAN, CDC, T21, UART1 +// +//---------------------------------------------------------------------------- +// @Returnvalue None +// +//---------------------------------------------------------------------------- +// @Parameters ModuleName: +// Name of the Module +// +//---------------------------------------------------------------------------- +// @Date 2025/1/21 +// +//**************************************************************************** + +#define PS_vEnableModule(Module) PS_vEnableModule_(Module) + +#define PS_vEnableModule_(Module) PS_vEnableModule_##Module + +#define PS_vEnableModule_ADC PMCON1 &= ~(ubyte)0x01 +#define PS_vEnableModule_T2 PMCON1 &= ~(ubyte)0x08 +#define PS_vEnableModule_CCU PMCON1 &= ~(ubyte)0x04 +#define PS_vEnableModule_SSC PMCON1 &= ~(ubyte)0x02 +#define PS_vEnableModule_MDU PMCON1 &= ~(ubyte)0x10 +#define PS_vEnableModule_CAN PMCON1 &= ~(ubyte)0x20 +#define PS_vEnableModule_CDC PMCON1 &= ~(ubyte)0x40 +#define PS_vEnableModule_T21 PMCON2 &= ~(ubyte)0x01 +#define PS_vEnableModule_UART1 PMCON2 &= ~(ubyte)0x02 + + +// USER CODE BEGIN (PS_Header,9) + +// USER CODE END + +#endif // ifndef _PS_H_ diff --git a/RTC.c b/RTC.c new file mode 100644 index 0000000..380954c --- /dev/null +++ b/RTC.c @@ -0,0 +1,415 @@ +#include "MAIN.H" +#include +#include "RTC.H" + +unsigned char bySta = 0; + +// 静态月份天数表(平年,索引1~12对应1月~12月) +ubyte days_in_month[12] = { + 31, // 1月 + 28, // 2月(平年) + 31, // 3月 + 30, // 4月 + 31, // 5月 + 30, // 6月 + 31, // 7月 + 31, // 8月 + 30, // 9月 + 31, // 10月 + 30, // 11月 + 31 // 12月 +}; + + +void SDAOut(bit c) +{ + SFR_PAGE(_pp0, noSST); // switch to page 0 + P0_DIR = P0_DIR | 0x08;//修改P0.3为输出 + P0_3 = c; + +} + +void SCLOut(bit c) +{ + P0_2 = c; +} + +void iic_start(void) +{ + SDAOut(1); + _nop_(); + SCLOut(1); + somenop; + SDAOut(0); + somenop; + SCLOut(0); +} + +void iic_stop(void) +{ + SDAOut(0); + _nop_(); + SCLOut(1); + somenop; + SDAOut(1); +} + +void iic_ack(bit ackbit) +{ + if(ackbit) + SDAOut(0); + else + SDAOut(1); + somenop; + SCLOut(1); + somenop; + SCLOut(0); + SDAOut(1); + somenop; +} + +bit iic_waitack(void) +{ + SDAOut(1); + somenop; + SCLOut(1); + + SFR_PAGE(_pp0, noSST); // switch to page 0 + P0_DIR = P0_DIR & 0xF7;//修改P4.3为输入 + + somenop; + if(P0_3) + { + SCLOut(0); + iic_stop(); + return 0; + } + else + { + SCLOut(0); + return 1; + } +} + +void iic_sendbyte(unsigned char byt) +{ + unsigned char i; + for(i=0;i<8;i++) + { + if(byt&0x80) + SDAOut(1); + else + SDAOut(0); + somenop; + SCLOut(1); + byt <<= 1; + somenop; + SCLOut(0); + } +} + + +unsigned char iic_recbyte(void) +{ + unsigned char da; + unsigned char i; + + SFR_PAGE(_pp0, noSST); // switch to page 0 + P0_DIR = P0_DIR & 0xF7;//修改P4.3为输入 + + for(i=0;i<8;i++) + { + SCLOut(1); + somenop; + da <<= 1; + +// P1_IOCR01 = 0x0020; // load port control register 1 + if(P0_3) + da |= 0x01; + SCLOut(0); + somenop; + } + return da; +} + +// 十进制转 BCD 码 +unsigned char DecToBcd(unsigned char dec) +{ + return ((dec / 10) << 4) | (dec % 10); +} + +// BCD 码转十进制 +unsigned char BcdToDec(unsigned char bcd) +{ + return ((bcd >> 4) * 10) + (bcd & 0x0F); +} + + + +// BM8563 写寄存器函数 +void BM8563_WriteReg(unsigned char reg, unsigned char rdata) +{ + iic_start(); + iic_sendbyte(BM8563_ADDR); // 发送 BM8563 的 I2C 地址,写操作 + iic_waitack(); + iic_sendbyte(reg); // 发送寄存器地址 + iic_waitack(); + iic_sendbyte(rdata); // 发送数据 + iic_waitack(); + iic_stop(); +} + + +// BM8563 读寄存器函数 +unsigned char BM8563_ReadReg(unsigned char reg) +{ + unsigned char rdata; + iic_start(); + iic_sendbyte(BM8563_ADDR); // 发送 BM8563 的 I2C 地址,写操作 + iic_waitack(); + iic_sendbyte(reg); // 发送寄存器地址 + iic_waitack(); + iic_start(); + iic_sendbyte(BM8563_ADDR | 0x01); // 发送 BM8563 的 I2C 地址,读操作 + iic_waitack(); + rdata = iic_recbyte(); + iic_ack(0); + iic_stop(); + return rdata; +} + +// 判断闰年 +ubyte leapYear(uword year) { + return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0; +} + + +/** + * @brief 获取指定年份和月份的天数(自动处理闰年) + * @param year: 年份(四位数,如2024) + * @param month: 月份(1-12) + * @retval 该月天数(若参数非法返回0) + */ +ubyte getMonthDays(uword year, ubyte month) { + // 静态月份天数表(平年,索引1~12对应1月~12月) + ubyte days_in_month[13] = { + 0, 31, 28, 31, 30, 31, 30, + 31, 31, 30, 31, 30, 31 + }; + + // 参数校验 + if (month < 1 || month > 12) return 0; + + // 处理闰年2月 + if (month == 2 && leapYear(year)) { + return 29; + } + + // 返回常规天数 + return days_in_month[month]; +} + + +/** + * @brief 检查报警标志AF是否置位(Bit3) + * @retval true-报警已触发,false-无报警 + */ +bool bm8563CheckAlarmFlag(void) { + ubyte reg_val = BM8563_ReadReg(BM8563_CSR2); + return (reg_val & BM8563_AF_BIT) != 0; // 检查Bit3 +} + +/** + * @brief 清除报警标志AF(Bit3) + * @note 保留其他位(如Bit1 AIE标志)状态 + */ +void bm8563ClearAlarmFlag(void) { + ubyte reg_val = BM8563_ReadReg(BM8563_CSR2); + reg_val &= ~BM8563_AF_BIT; // 仅清除Bit3 + BM8563_WriteReg(BM8563_CSR2, reg_val); +} + + + +/** + * @brief 设置BM8563当前时间(整合世纪位到月份寄存器) + * @param pTime: 时间结构体指针(年份需为完整四位数,如1984、2024) + * @retval 无 + */ +void bm8563SetTime(UnTimeOutput *pTime) { + + ubyte century_bit = 0; // 完整四位数年份 + ubyte reg_sec = 0; + ubyte month_bcd = 0; + if (pTime == NULL) return; + + // --- 世纪位计算 --- + // 根据年份设置世纪标志(0:20世纪及之后,1:19世纪) +// uint8_t century_bit = (pTime->bit_data.year >= 2000) ? 0 : 1; // 完整四位数年份 + + // --- 寄存器写入(带掩码)--- + // 秒(地址0x02):保留Bit7(CH时钟停止位) + reg_sec = BM8563_ReadReg(BM8563_SEC) & 0x80; + BM8563_WriteReg(BM8563_SEC, reg_sec | (DecToBcd(pTime->bit_data.second) & 0x7F)); + + // 分(地址0x03) + BM8563_WriteReg(BM8563_MIN, DecToBcd(pTime->bit_data.minute) & 0x7F); + + // 小时(地址0x04):24小时制 + BM8563_WriteReg(BM8563_HOUR, DecToBcd(pTime->bit_data.hour) & 0x3F); + + // 日(地址0x05):屏蔽闹钟使能位 + BM8563_WriteReg(BM8563_DAY, DecToBcd(pTime->bit_data.day) & 0x3F); + + // 周(地址0x06):值范围1-7 + BM8563_WriteReg(BM8563_WEEK, pTime->bit_data.week & 0x07); + + // 月(地址0x07):世纪位写入Bit7,月份占低5位 + month_bcd = DecToBcd(pTime->bit_data.month); + BM8563_WriteReg(BM8563_MONTH, (century_bit << 7) | (month_bcd & 0x1F)); + + // 年(地址0x08):存储后两位(如2024→0x24) + BM8563_WriteReg(BM8563_YEAR, DecToBcd(pTime->bit_data.year)); +} + + +/** + * @brief 读取BM8563当前时间到联合体 + * @param pTime: UnTimeOutput联合体指针(用于存储读取到的时间数据) + * @retval 无 + */ +void bm8563GetTime(UnTimeOutput *pTime) { + if (pTime == NULL) { + return; // 错误处理可扩展 + } + + // 读取秒(地址0x02) + pTime->bit_data.second = BcdToDec(BM8563_ReadReg(BM8563_SEC) & 0x7F); // 屏蔽无效位 + + // 读取分钟(地址0x03) + pTime->bit_data.minute = BcdToDec(BM8563_ReadReg(BM8563_MIN) & 0x7F); + + // 读取小时(地址0x04) + pTime->bit_data.hour = BcdToDec(BM8563_ReadReg(BM8563_HOUR) & 0x3F); // 24小时制需屏蔽Bit6-7 + + // 读取日(地址0x05) + pTime->bit_data.day = BcdToDec(BM8563_ReadReg(BM8563_DAY) & 0x3F); // 屏蔽控制位 + + // 读取周(地址0x06,BM8563周值为0x01-0x07,无需BCD转换) + pTime->bit_data.week = BM8563_ReadReg(BM8563_WEEK) & 0x07; // 仅保留低3位 + + // 读取月(地址0x07) + pTime->bit_data.month = BcdToDec(BM8563_ReadReg(BM8563_MONTH) & 0x1F); // 屏蔽Bit5-7 + + // 读取年(地址0x08,假设为2000+年) + pTime->bit_data.year = BcdToDec(BM8563_ReadReg(BM8563_YEAR)); +} + + + + +/** + * @brief 设置BM8563闹钟(字段为0时禁用对应报警) + * @param pTime: UnTimeOutput联合体指针,包含闹钟时间参数 + * @retval 无 + */ +ubyte bm8563SetAlarm(UnTimeOutput *pTime) { + + UnTimeOutput un_temp_output = {0};//接收设定时间 + ubyte carry_hour = 0; + ubyte carry_day = 0; + ubyte month_days = 0; +//------------------------------------------------- + // 检查指针有效性 + if( (pTime == NULL) || ( (0 == pTime->bit_data.minute) && (0 == pTime->bit_data.hour) && (0 == pTime->bit_data.day) ) )//数据都为0或者指针都为0 + { + // 可选:添加错误处理(如日志输出) + return 1; + } + + bm8563GetTime(¤ttime); + + // 分钟溢出处理(0-59) + un_temp_output.bit_data.minute = currenttime.bit_data.minute + pTime->bit_data.minute; + if (un_temp_output.bit_data.minute >= 60) { + un_temp_output.bit_data.minute -= 60; + carry_hour = 1; // 向小时进位 + } + + // 小时溢出处理(0-23) + un_temp_output.bit_data.hour = currenttime.bit_data.hour + pTime->bit_data.hour + carry_hour; + if (un_temp_output.bit_data.hour >= 24) { + un_temp_output.bit_data.hour -= 24; + carry_day = 1; // 向天进位 + } + + // 天溢出处理(需考虑月份最大天数) + un_temp_output.bit_data.day = currenttime.bit_data.day + pTime->bit_data.day + carry_day; + //2月考虑平年和闰年 + month_days = getMonthDays( (currenttime.bit_data.year+2000),currenttime.bit_data.month); + + // 天溢出处理(需考虑月份最大天数) + if (un_temp_output.bit_data.day > month_days) + { + un_temp_output.bit_data.day -= month_days; + //最大限制,如果超过1个月,就少一天,BM8563最大只支持这么大 + if(un_temp_output.bit_data.day == currenttime.bit_data.day) + { + un_temp_output.bit_data.day = (currenttime.bit_data.day - 1); + } + } + + un_temp_output.bit_data.week = 0;//不需要周报警 + +// 报警分钟设置(地址0x09) + BM8563_WriteReg(BM8563_ALARM_MIN, DecToBcd(un_temp_output.bit_data.minute) & 0x7F); // AE_M=0(启用) +// 报警小时设置(地址0x0A) + BM8563_WriteReg(BM8563_ALARM_HOUR, DecToBcd(un_temp_output.bit_data.hour) & 0x7F); // AE_H=0(启用) +// 日报警/周报警互斥设置 + BM8563_WriteReg(BM8563_ALARM_DAY, DecToBcd(un_temp_output.bit_data.day) & 0x7F); // AE_D=0(启用日) + BM8563_WriteReg(BM8563_ALARM_WEEK, 0x80); // AE_W=1(禁用周) +// 使能闹钟中断(地址0x01,AIE=1,AF=0) + BM8563_WriteReg(BM8563_CSR2, 0x02); + + return 0; +} + + + + + + + + + + + + +//// 配置 BM8563 的闹钟,实现间隔 4 小时的唤醒 +//void BM8563_Set4HourAlarm() +//{ +// unsigned char alarmMin = BcdToDec( BM8563_ReadReg(BM8563_MIN) ); +// unsigned char alarmMinBcd = 0; +////------------------------------------------------------------ +// alarmMin = (alarmMin + 2) % 60;//计算 4 小时后的小时数 +// alarmMinBcd = DecToBcd(alarmMin); + +// BM8563_WriteReg(BM8563_ALARM_MIN,alarmMinBcd&0x7F);// 闹钟分钟设置 +// BM8563_WriteReg(BM8563_ALARM_HOUR, 0x80); // 无效 +// BM8563_WriteReg(BM8563_ALARM_DAY , 0x80); // 无效 +// BM8563_WriteReg(BM8563_ALARM_WEEK, 0x80); // 无效 +// +// // 配置闹钟控制寄存器,使能闹钟中断 +// BM8563_WriteReg(BM8563_CSR2, 0x02); +//} + + + + + + + + + + + diff --git a/RTC.h b/RTC.h new file mode 100644 index 0000000..a3d5eba --- /dev/null +++ b/RTC.h @@ -0,0 +1,101 @@ +#ifndef _RTC_H_ +#define _RTC_H_ + +//#define _nop_() udelay(1); +#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();} + + +typedef enum { + STATE_INIT = 0, // 初始化状态(首次运行) + STATE_ON, // ON状态(唤醒工作模式) + STATE_OFF, // OFF状态(准备休眠) + STATE_OFF2, // OFF2状态(休眠监控) + STATE_ON2 // ON2状态(工作模式) +} SystemState; + + + + +typedef struct { + ubyte year; // 年(建议存储后两位,如2025→25) + ubyte month; // 月(1-12) + ubyte day; // 日(1-31) + ubyte hour; // 小时(0-23) + ubyte week; // 周 (0-6) + ubyte minute; // 分钟(0-59) + ubyte second; // 秒 (0-59) + ubyte resver; +} DateTimeInfo; // 类型名使用大驼峰法(帕斯卡命名法) + +typedef union _UnTimeOutput +{ + DateTimeInfo bit_data; // 使用定义的结构体变量名 + ubyte arr[sizeof(DateTimeInfo)]; // 通过结构体类型确定大小 +} UnTimeOutput; + + + +extern unsigned char bySta; +extern UnTimeOutput currenttime; +extern UnTimeOutput un_time_output1;//接收设定时间 + + + +// 假设 BM8563 的 I2C 地址 +#define BM8563_ADDR 0xA2 + +// 假设 BM8563 寄存器地址 +#define BM8563_CSR2 0x01 +#define BM8563_SEC 0x02 +#define BM8563_MIN 0x03 +#define BM8563_HOUR 0x04 +#define BM8563_DAY 0x05 +#define BM8563_WEEK 0x06 +#define BM8563_MONTH 0x07 +#define BM8563_YEAR 0x08 +#define BM8563_ALARM_MIN 0x09 +#define BM8563_ALARM_HOUR 0x0A +#define BM8563_ALARM_DAY 0x0B +#define BM8563_ALARM_WEEK 0x0C +#define BM8563_CONTROL 0x0E // 定时器控制寄存器 +#define BM8563_STATUS 0x01 +#define BM8563_TIMER_VALUE 0x0F // 定时器计数寄存器 + +#define BM8563_AF_BIT 0x08 // AF标志位(Bit3) + + +ubyte leapYear(uword year); +void BM8563_InitTime(); +void BM8563_Set4HourCountdown(); +unsigned char BM8563_ReadReg(unsigned char reg); +void BM8563_WriteReg(unsigned char reg, unsigned char rdata); +void BM8563_Set4HourAlarm(); +void bm8563GetTime(UnTimeOutput *pTime); +ubyte bm8563SetAlarm(UnTimeOutput *pTime); +void bm8563SetTime(UnTimeOutput *pTime); +bool bm8563CheckAlarmFlag(void); +void bm8563ClearAlarmFlag(void); + +void iic_start(void); +void iic_stop(void); +void iic_ack(bit ackbit); +void iic_sendbyte(unsigned char byt); +void wrbyte_24c02(unsigned int add,unsigned char dat); + +bit iic_waitack(void); +unsigned char i2c_recbyte(void); +unsigned char rdbyte_24c02(unsigned int add); +unsigned char wrEE_CRC_Bak(unsigned char add,unsigned char *eeData,unsigned char len,unsigned char addbak); +unsigned char rdEE_CRC_Bak(unsigned char add,unsigned char *eeData,unsigned char len,unsigned char addbak); + + + + + + + + + + + +#endif \ No newline at end of file diff --git a/SHARED_INT.C b/SHARED_INT.C new file mode 100644 index 0000000..7cdf152 --- /dev/null +++ b/SHARED_INT.C @@ -0,0 +1,313 @@ +//**************************************************************************** +// @Module Shared Interrupt Routines +// @Filename SHARED_INT.C +// @Project CL2.0.dav +//---------------------------------------------------------------------------- +// @Controller Infineon XC886CLM-8FF +// +// @Compiler Keil +// +// @Codegenerator 1.3 +// +// @Description This file contains the Shared interrupt routines. +// +//---------------------------------------------------------------------------- +// @Date 2025/6/24 15:47:34 +// +//**************************************************************************** + +// USER CODE BEGIN (SHARED_INT_General,1) + +// USER CODE END + + + +//**************************************************************************** +// @Project Includes +//**************************************************************************** + +#include "SHARED_INT.H" +#include "CAN.H" +// USER CODE BEGIN (SHARED_INT_General,2) + +// USER CODE END + + +//**************************************************************************** +// @Macros +//**************************************************************************** + +// USER CODE BEGIN (SHARED_INT_General,3) + +// USER CODE END + + +//**************************************************************************** +// @Defines +//**************************************************************************** + +// USER CODE BEGIN (SHARED_INT_General,4) + +// USER CODE END + + +//**************************************************************************** +// @Typedefs +//**************************************************************************** + +// USER CODE BEGIN (SHARED_INT_General,5) + +// USER CODE END + + +//**************************************************************************** +// @Imported Global Variables +//**************************************************************************** + +// USER CODE BEGIN (SHARED_INT_General,6) + +// USER CODE END + + +//**************************************************************************** +// @Global Variables +//**************************************************************************** + +// USER CODE BEGIN (SHARED_INT_General,7) + +// USER CODE END + + +//**************************************************************************** +// @External Prototypes +//**************************************************************************** + + +// USER CODE BEGIN (SHARED_INT_General,8) + +// USER CODE END + + +//**************************************************************************** +// @Prototypes Of Local Functions +//**************************************************************************** + +// USER CODE BEGIN (SHARED_INT_General,9) + +// USER CODE END + + +//**************************************************************************** +// @Function void SHINT_vInit(void) +// +//---------------------------------------------------------------------------- +// @Description This function initializes the shared interrupts. +// +//---------------------------------------------------------------------------- +// @Returnvalue None +// +//---------------------------------------------------------------------------- +// @Parameters None +// +//---------------------------------------------------------------------------- +// @Date 2025/6/24 +// +//**************************************************************************** + +// USER CODE BEGIN (SHINT_Init,1) + +// USER CODE END + +void SHINT_vInit(void) +{ + // USER CODE BEGIN (SHINT_Init,2) + + // USER CODE END + + /// ----------------------------------------------------------------------- + /// Configuration of the Shared Interrupts: + /// ----------------------------------------------------------------------- + /// - Timer 2 Interrupt is Selected + /// - MultiCAN Node 0 Interrupt is Selected + + + IEN0 |= 0x20; // load interrupt enable register 0 + + + + IEN1 |= 0x00; // load interrupt enable register 1 + + + // USER CODE BEGIN (SHINT_Init,3) + + // USER CODE END + + +} // End of function SHINT_vInit + + +//**************************************************************************** +// @Function void SHINT_viXINTR5Isr(void) +// +//---------------------------------------------------------------------------- +// @Description This is the service routine for the shared interrupt node +// XINTR5. XINTR5 ISR Node is shared by Timer 2, UART +// Fractional Divider(BRG Interrupt),MultiCAN Node 0 and LIN. +// Depending on the selected module interrupt it is called. +// T2 - Depending on the selected operating mode it is called +// when TF2 is set by an overflow or underflow of the timer 2 +// register or when EXF2 is set by a negative transition on +// T2EX. +// UART - It is called after the BRG timer overflows and sets +// the NDOV bit. +// CAN - It is called for the Service Request Node 0 of the +// MultiCAN module. +// Please note that you have to add application specific code +// to this function. +// +//---------------------------------------------------------------------------- +// @Returnvalue none +// +//---------------------------------------------------------------------------- +// @Parameters None +// +//---------------------------------------------------------------------------- +// @Date 2025/6/24 +// +//**************************************************************************** + +// You have two choices for interrupt type select in Project Settings Page +// under Global Settings Section. +// If you select CHOICE 1 then ISR will be generated with push and pop. +// If you select CHOICE 2 then ISR will be generated without push and pop. +// Default choice is CHOICE 2. +// Current selection is CHOICE 2 + +// USER CODE BEGIN (SHINT_XINTR5Isr,1) + +// USER CODE END + +void SHINT_viXINTR5Isr(void) interrupt XINTR5INT +{ +ubyte ubNSRL; +ubyte ubNSRH; +ubyte ubResetLEC = 0x3F; + + // USER CODE BEGIN (SHINT_XINTR5Isr,2) + + // USER CODE END + + CAN_pushAMRegs(); // push the CAN Access Mediator Registers + + SFR_PAGE(_su0, SST0); // switch to page 0 + + // Timer 2 interrupt handling section... + + if (TF2) + { + // a timer 2 overflow has occured + + TF2 = 0; + + // USER CODE BEGIN (SHINT_XINTR5Isr,3) +RTCProcess(); + // USER CODE END + + } + + // MultiCAN Node 0 (SRN0) interrupt handling section... + + + // Check Interrupt Request Register 2 Interrupt Flag 0 + if (((IRCON2 & 0x01) != 0)) + { + + IRCON2 &= ~(ubyte)0x01; // clear CANSRC0 + + // --------------------------------------------------------------------- + // Interrupts of CAN node 0 + // --------------------------------------------------------------------- + + CAN_vWriteCANAddress(CAN_NSR0); + CAN_vReadEN(); + ubNSRL = CAN_DATA0; + ubNSRH = CAN_DATA1; + + // USER CODE BEGIN (SRN0_NODE0,1) + + // USER CODE END + // --------------------------------------------------------------------- + // CAN node 0 Alert Interrupt + // --------------------------------------------------------------------- + if (ubNSRL & 0x20) // if ALERT + { + + /// Note: The ALERT bit is set upon the occurrence of one ofthe + /// following events. User need to handle these in user defined + /// section. + + // BOFF : ubNSRL & 0x80 + // Bus OFF + if(ubNSRL & 0x80) { + can_error_cnt = 0x80; + ubNSRL &= ~0x80; // 清除标志 + + } + // EWRN : ubNSRL & 0x40 + if(ubNSRL & 0x40) { + can_error_cnt = 0x40; + ubNSRL &= ~0x40; // 清除标志 + } + // One of the error counters REC or TEC reached the + // warning limit of 96. + // LLE : ubNSRH & 0x01 + // A list length error has been detected during message + // acceptance filtering. The number of elements in the list + // that belongs to this CAN node differs from the list SIZE + // given in the list termination pointer + // LOE : ubNSRH & 0x02 + // A list object error has been detected during message + // acceptance filtering. A message object with wrong LIST + // index entry in the Message Object Control Register has + // been detected + + // USER CODE BEGIN (SRN0_NODE_0_ALIE,2) + + // USER CODE END + } + + + // USER CODE BEGIN (SRN0_NODE0,8) + + // USER CODE END + + //// 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 + // transmission and Write is Enabled. + + // USER CODE BEGIN (SHINT_XINTR5Isr,6) + + // USER CODE END + + } + + + // USER CODE BEGIN (SHINT_XINTR5Isr,7) + + // USER CODE END + + SFR_PAGE(_su0, RST0); // restore the old SCU page + + CAN_popAMRegs(); // restore the CAN Access Mediator Registers +} // End of function SHINT_viXINTR5Isr + + +// USER CODE BEGIN (SHARED_INT_General,10) + +// USER CODE END + + diff --git a/SHARED_INT.H b/SHARED_INT.H new file mode 100644 index 0000000..5daa27a --- /dev/null +++ b/SHARED_INT.H @@ -0,0 +1,121 @@ +//**************************************************************************** +// @Module Shared Interrupt Routines +// @Filename SHARED_INT.H +// @Project CL2.0.dav +//---------------------------------------------------------------------------- +// @Controller Infineon XC886CLM-8FF +// +// @Compiler Keil +// +// @Codegenerator 1.3 +// +// @Description This is the include header file for shared interrupts. +// +//---------------------------------------------------------------------------- +// @Date 2025/1/18 20:45:29 +// +//**************************************************************************** + +// USER CODE BEGIN (SHARED_Header,1) + +// USER CODE END + + + +#ifndef _SHARED_INT_H_ +#define _SHARED_INT_H_ + +//**************************************************************************** +// @Project Includes +//**************************************************************************** + +// USER CODE BEGIN (SHARED_INT_Header,2) + +// USER CODE END + + +//**************************************************************************** +// @Macros +//**************************************************************************** + +// USER CODE BEGIN (SHARED_INT_Header,3) + +// USER CODE END + + +//**************************************************************************** +// @Defines +//**************************************************************************** + +// USER CODE BEGIN (SHARED_INT_Header,4) + +// USER CODE END + +//**************************************************************************** +// @Prototypes Of Global Functions +//**************************************************************************** + +void SHINT_vInit(void); + + +// USER CODE BEGIN (SHARED_INT_Header,5) + +// USER CODE END + + +//**************************************************************************** +// @Typedefs +//**************************************************************************** + +// USER CODE BEGIN (SHARED_INT_Header,6) + +// USER CODE END + + +//**************************************************************************** +// @Imported Global Variables +//**************************************************************************** + +// USER CODE BEGIN (SHARED_INT_Header,7) + +// USER CODE END + + +//**************************************************************************** +// @Global Variables +//**************************************************************************** + +// USER CODE BEGIN (SHARED_INT_Header,8) + +// USER CODE END + + +//**************************************************************************** +// @Interrupt Vectors +//**************************************************************************** + +#define XINTR5INT 5 + +// USER CODE BEGIN (SHARED_INT_Header,9) + +// USER CODE END + + +//**************************************************************************** +// @Project Includes +//**************************************************************************** + + + + + + +#include "MAIN.H" + + +// USER CODE BEGIN (SHARED_INT_Header,10) + +// USER CODE END + + +#endif // ifndef _SHARED_INT_H_