上传文件至 /
This commit is contained in:
202
PS.H
Normal file
202
PS.H
Normal file
@@ -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_
|
||||||
415
RTC.c
Normal file
415
RTC.c
Normal file
@@ -0,0 +1,415 @@
|
|||||||
|
#include "MAIN.H"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "RTC.H"
|
||||||
|
|
||||||
|
unsigned char bySta = 0;
|
||||||
|
|
||||||
|
// <20><>̬<EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD>꣬<EFBFBD><EAA3AC><EFBFBD><EFBFBD>1~12<31><32>Ӧ1<D3A6><31>~12<31>£<EFBFBD>
|
||||||
|
ubyte days_in_month[12] = {
|
||||||
|
31, // 1<><31>
|
||||||
|
28, // 2<>£<EFBFBD>ƽ<EFBFBD>꣩
|
||||||
|
31, // 3<><33>
|
||||||
|
30, // 4<><34>
|
||||||
|
31, // 5<><35>
|
||||||
|
30, // 6<><36>
|
||||||
|
31, // 7<><37>
|
||||||
|
31, // 8<><38>
|
||||||
|
30, // 9<><39>
|
||||||
|
31, // 10<31><30>
|
||||||
|
30, // 11<31><31>
|
||||||
|
31 // 12<31><32>
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void SDAOut(bit c)
|
||||||
|
{
|
||||||
|
SFR_PAGE(_pp0, noSST); // switch to page 0
|
||||||
|
P0_DIR = P0_DIR | 0x08;//<2F><EFBFBD>P0.3Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
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;//<2F><EFBFBD>P4.3Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
|
||||||
|
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;//<2F><EFBFBD>P4.3Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ʮ<><CAAE><EFBFBD><EFBFBD>ת BCD <20><>
|
||||||
|
unsigned char DecToBcd(unsigned char dec)
|
||||||
|
{
|
||||||
|
return ((dec / 10) << 4) | (dec % 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
// BCD <20><>תʮ<D7AA><CAAE><EFBFBD><EFBFBD>
|
||||||
|
unsigned char BcdToDec(unsigned char bcd)
|
||||||
|
{
|
||||||
|
return ((bcd >> 4) * 10) + (bcd & 0x0F);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// BM8563 д<>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
void BM8563_WriteReg(unsigned char reg, unsigned char rdata)
|
||||||
|
{
|
||||||
|
iic_start();
|
||||||
|
iic_sendbyte(BM8563_ADDR); // <20><><EFBFBD><EFBFBD> BM8563 <20><> I2C <20><>ַ<EFBFBD><D6B7>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
|
||||||
|
iic_waitack();
|
||||||
|
iic_sendbyte(reg); // <20><><EFBFBD>ͼĴ<CDBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||||
|
iic_waitack();
|
||||||
|
iic_sendbyte(rdata); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
iic_waitack();
|
||||||
|
iic_stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// BM8563 <20><><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
unsigned char BM8563_ReadReg(unsigned char reg)
|
||||||
|
{
|
||||||
|
unsigned char rdata;
|
||||||
|
iic_start();
|
||||||
|
iic_sendbyte(BM8563_ADDR); // <20><><EFBFBD><EFBFBD> BM8563 <20><> I2C <20><>ַ<EFBFBD><D6B7>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
|
||||||
|
iic_waitack();
|
||||||
|
iic_sendbyte(reg); // <20><><EFBFBD>ͼĴ<CDBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||||
|
iic_waitack();
|
||||||
|
iic_start();
|
||||||
|
iic_sendbyte(BM8563_ADDR | 0x01); // <20><><EFBFBD><EFBFBD> BM8563 <20><> I2C <20><>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
iic_waitack();
|
||||||
|
rdata = iic_recbyte();
|
||||||
|
iic_ack(0);
|
||||||
|
iic_stop();
|
||||||
|
return rdata;
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
ubyte leapYear(uword year) {
|
||||||
|
return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief <20><>ȡָ<C8A1><D6B8><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA>·ݵ<C2B7><DDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>꣩
|
||||||
|
* @param year: <20><><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2024<32><34>
|
||||||
|
* @param month: <20>·ݣ<C2B7>1-12<31><32>
|
||||||
|
* @retval <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>
|
||||||
|
*/
|
||||||
|
ubyte getMonthDays(uword year, ubyte month) {
|
||||||
|
// <20><>̬<EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD>꣬<EFBFBD><EAA3AC><EFBFBD><EFBFBD>1~12<31><32>Ӧ1<D3A6><31>~12<31>£<EFBFBD>
|
||||||
|
ubyte days_in_month[13] = {
|
||||||
|
0, 31, 28, 31, 30, 31, 30,
|
||||||
|
31, 31, 30, 31, 30, 31
|
||||||
|
};
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD>У<EFBFBD><D0A3>
|
||||||
|
if (month < 1 || month > 12) return 0;
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><32>
|
||||||
|
if (month == 2 && leapYear(year)) {
|
||||||
|
return 29;
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20><><EFBFBD>س<EFBFBD><D8B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
return days_in_month[month];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief <20><><EFBFBD>鱨<EFBFBD><E9B1A8><EFBFBD><EFBFBD>־AF<41>Ƿ<EFBFBD><C7B7><EFBFBD>λ<EFBFBD><CEBB>Bit3<74><33>
|
||||||
|
* @retval true-<2D><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD><D1B4><EFBFBD><EFBFBD><EFBFBD>false-<2D>ޱ<EFBFBD><DEB1><EFBFBD>
|
||||||
|
*/
|
||||||
|
bool bm8563CheckAlarmFlag(void) {
|
||||||
|
ubyte reg_val = BM8563_ReadReg(BM8563_CSR2);
|
||||||
|
return (reg_val & BM8563_AF_BIT) != 0; // <20><><EFBFBD><EFBFBD>Bit3
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־AF<41><46>Bit3<74><33>
|
||||||
|
* @note <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Bit1 AIE<49><45>־<EFBFBD><D6BE>״̬
|
||||||
|
*/
|
||||||
|
void bm8563ClearAlarmFlag(void) {
|
||||||
|
ubyte reg_val = BM8563_ReadReg(BM8563_CSR2);
|
||||||
|
reg_val &= ~BM8563_AF_BIT; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Bit3
|
||||||
|
BM8563_WriteReg(BM8563_CSR2, reg_val);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief <20><><EFBFBD><EFBFBD>BM8563<36><33>ǰʱ<C7B0>䣨<EFBFBD><E4A3A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>·ݼĴ<DDBC><C4B4><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
* @param pTime: ʱ<><CAB1><EFBFBD>ṹ<EFBFBD><E1B9B9>ָ<EFBFBD>루<EFBFBD><EBA3A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1984<38><34>2024<32><34>
|
||||||
|
* @retval <20><>
|
||||||
|
*/
|
||||||
|
void bm8563SetTime(UnTimeOutput *pTime) {
|
||||||
|
|
||||||
|
ubyte century_bit = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
ubyte reg_sec = 0;
|
||||||
|
ubyte month_bcd = 0;
|
||||||
|
if (pTime == NULL) return;
|
||||||
|
|
||||||
|
// --- <20><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD> ---
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD>־<EFBFBD><D6BE>0:20<32><30><EFBFBD>ͼ<EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD>1:19<31><39><EFBFBD>ͣ<EFBFBD>
|
||||||
|
// uint8_t century_bit = (pTime->bit_data.year >= 2000) ? 0 : 1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
|
||||||
|
// --- <20>Ĵ<EFBFBD><C4B4><EFBFBD>д<EFBFBD>루<EFBFBD><EBA3A8><EFBFBD><EFBFBD><EFBFBD>룩---
|
||||||
|
// <20>루<EFBFBD><EBA3A8>ַ0x02<30><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Bit7<74><37>CHʱ<48><CAB1>ֹͣλ<D6B9><CEBB>
|
||||||
|
reg_sec = BM8563_ReadReg(BM8563_SEC) & 0x80;
|
||||||
|
BM8563_WriteReg(BM8563_SEC, reg_sec | (DecToBcd(pTime->bit_data.second) & 0x7F));
|
||||||
|
|
||||||
|
// <20>֣<EFBFBD><D6A3><EFBFBD>ַ0x03<30><33>
|
||||||
|
BM8563_WriteReg(BM8563_MIN, DecToBcd(pTime->bit_data.minute) & 0x7F);
|
||||||
|
|
||||||
|
// Сʱ<D0A1><CAB1><EFBFBD><EFBFBD>ַ0x04<30><34><EFBFBD><EFBFBD>24Сʱ<D0A1><CAB1>
|
||||||
|
BM8563_WriteReg(BM8563_HOUR, DecToBcd(pTime->bit_data.hour) & 0x3F);
|
||||||
|
|
||||||
|
// <20>գ<EFBFBD><D5A3><EFBFBD>ַ0x05<30><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>λ
|
||||||
|
BM8563_WriteReg(BM8563_DAY, DecToBcd(pTime->bit_data.day) & 0x3F);
|
||||||
|
|
||||||
|
// <20>ܣ<EFBFBD><DCA3><EFBFBD>ַ0x06<30><36><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>Χ1-7
|
||||||
|
BM8563_WriteReg(BM8563_WEEK, pTime->bit_data.week & 0x07);
|
||||||
|
|
||||||
|
// <20>£<EFBFBD><C2A3><EFBFBD>ַ0x07<30><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λд<CEBB><D0B4>Bit7<74><37><EFBFBD>·<EFBFBD>ռ<EFBFBD><D5BC>5λ
|
||||||
|
month_bcd = DecToBcd(pTime->bit_data.month);
|
||||||
|
BM8563_WriteReg(BM8563_MONTH, (century_bit << 7) | (month_bcd & 0x1F));
|
||||||
|
|
||||||
|
// <20>꣨<EFBFBD><EAA3A8>ַ0x08<30><38><EFBFBD><EFBFBD><EFBFBD>洢<EFBFBD><E6B4A2><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>2024<32><34>0x24<32><34>
|
||||||
|
BM8563_WriteReg(BM8563_YEAR, DecToBcd(pTime->bit_data.year));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief <20><>ȡBM8563<36><33>ǰʱ<C7B0>䵽<EFBFBD><E4B5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
* @param pTime: UnTimeOutput<75><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>루<EFBFBD><EBA3A8><EFBFBD>ڴ洢<DAB4><E6B4A2>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>
|
||||||
|
* @retval <20><>
|
||||||
|
*/
|
||||||
|
void bm8563GetTime(UnTimeOutput *pTime) {
|
||||||
|
if (pTime == NULL) {
|
||||||
|
return; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20><>ȡ<EFBFBD>루<EFBFBD><EBA3A8>ַ0x02<30><32>
|
||||||
|
pTime->bit_data.second = BcdToDec(BM8563_ReadReg(BM8563_SEC) & 0x7F); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Чλ
|
||||||
|
|
||||||
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD>ַ0x03<30><33>
|
||||||
|
pTime->bit_data.minute = BcdToDec(BM8563_ReadReg(BM8563_MIN) & 0x7F);
|
||||||
|
|
||||||
|
// <20><>ȡСʱ<D0A1><CAB1><EFBFBD><EFBFBD>ַ0x04<30><34>
|
||||||
|
pTime->bit_data.hour = BcdToDec(BM8563_ReadReg(BM8563_HOUR) & 0x3F); // 24Сʱ<D0A1><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Bit6-7
|
||||||
|
|
||||||
|
// <20><>ȡ<EFBFBD>գ<EFBFBD><D5A3><EFBFBD>ַ0x05<30><35>
|
||||||
|
pTime->bit_data.day = BcdToDec(BM8563_ReadReg(BM8563_DAY) & 0x3F); // <20><><EFBFBD>ο<EFBFBD><CEBF><EFBFBD>λ
|
||||||
|
|
||||||
|
// <20><>ȡ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD>ַ0x06<30><36>BM8563<36><33>ֵΪ0x01-0x07<30><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BCDת<44><D7AA><EFBFBD><EFBFBD>
|
||||||
|
pTime->bit_data.week = BM8563_ReadReg(BM8563_WEEK) & 0x07; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3λ
|
||||||
|
|
||||||
|
// <20><>ȡ<EFBFBD>£<EFBFBD><C2A3><EFBFBD>ַ0x07<30><37>
|
||||||
|
pTime->bit_data.month = BcdToDec(BM8563_ReadReg(BM8563_MONTH) & 0x1F); // <20><><EFBFBD><EFBFBD>Bit5-7
|
||||||
|
|
||||||
|
// <20><>ȡ<EFBFBD>꣨<EFBFBD><EAA3A8>ַ0x08<30><38><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ2000+<2B>꣩
|
||||||
|
pTime->bit_data.year = BcdToDec(BM8563_ReadReg(BM8563_YEAR));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief <20><><EFBFBD><EFBFBD>BM8563<36><33><EFBFBD>ӣ<EFBFBD><D3A3>ֶ<EFBFBD>Ϊ0ʱ<30><CAB1><EFBFBD>ö<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
* @param pTime: UnTimeOutput<75><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>룬<EFBFBD><EBA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
* @retval <20><>
|
||||||
|
*/
|
||||||
|
ubyte bm8563SetAlarm(UnTimeOutput *pTime) {
|
||||||
|
|
||||||
|
UnTimeOutput un_temp_output = {0};//<2F><><EFBFBD><EFBFBD><EFBFBD>趨ʱ<E8B6A8><CAB1>
|
||||||
|
ubyte carry_hour = 0;
|
||||||
|
ubyte carry_day = 0;
|
||||||
|
ubyte month_days = 0;
|
||||||
|
//-------------------------------------------------
|
||||||
|
// <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
|
||||||
|
if( (pTime == NULL) || ( (0 == pTime->bit_data.minute) && (0 == pTime->bit_data.hour) && (0 == pTime->bit_data.day) ) )//<2F><><EFBFBD>ݶ<EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD>ָ<EFBFBD>붼Ϊ0
|
||||||
|
{
|
||||||
|
// <20><>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
bm8563GetTime(¤ttime);
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0-59<35><39>
|
||||||
|
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; // <20><>Сʱ<D0A1><CAB1>λ
|
||||||
|
}
|
||||||
|
|
||||||
|
// Сʱ<D0A1><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0-23<32><33>
|
||||||
|
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; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>迼<EFBFBD><E8BFBC><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
un_temp_output.bit_data.day = currenttime.bit_data.day + pTime->bit_data.day + carry_day;
|
||||||
|
//2<>¿<EFBFBD><C2BF><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
month_days = getMonthDays( (currenttime.bit_data.year+2000),currenttime.bit_data.month);
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>迼<EFBFBD><E8BFBC><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
if (un_temp_output.bit_data.day > month_days)
|
||||||
|
{
|
||||||
|
un_temp_output.bit_data.day -= month_days;
|
||||||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>죬BM8563<36><33><EFBFBD><EFBFBD>ֻ֧<D6BB><D6A7><EFBFBD><EFBFBD>ô<EFBFBD><C3B4>
|
||||||
|
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;//<2F><><EFBFBD><EFBFBD>Ҫ<EFBFBD>ܱ<EFBFBD><DCB1><EFBFBD>
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD>ַ0x09<30><39>
|
||||||
|
BM8563_WriteReg(BM8563_ALARM_MIN, DecToBcd(un_temp_output.bit_data.minute) & 0x7F); // AE_M=0<><30><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>
|
||||||
|
// <20><><EFBFBD><EFBFBD>Сʱ<D0A1><CAB1><EFBFBD>ã<EFBFBD><C3A3><EFBFBD>ַ0x0A<30><41>
|
||||||
|
BM8563_WriteReg(BM8563_ALARM_HOUR, DecToBcd(un_temp_output.bit_data.hour) & 0x7F); // AE_H=0<><30><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>
|
||||||
|
// <20>ձ<EFBFBD><D5B1><EFBFBD>/<2F>ܱ<EFBFBD><DCB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
BM8563_WriteReg(BM8563_ALARM_DAY, DecToBcd(un_temp_output.bit_data.day) & 0x7F); // AE_D=0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>գ<EFBFBD>
|
||||||
|
BM8563_WriteReg(BM8563_ALARM_WEEK, 0x80); // AE_W=1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD>
|
||||||
|
// ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD>ַ0x01<30><31>AIE=1<><31>AF=0<><30>
|
||||||
|
BM8563_WriteReg(BM8563_CSR2, 0x02);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//// <20><><EFBFBD><EFBFBD> BM8563 <20><><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD>ʵ<EFBFBD>ּ<EFBFBD><D6BC><EFBFBD> 4 Сʱ<D0A1>Ļ<EFBFBD><C4BB><EFBFBD>
|
||||||
|
//void BM8563_Set4HourAlarm()
|
||||||
|
//{
|
||||||
|
// unsigned char alarmMin = BcdToDec( BM8563_ReadReg(BM8563_MIN) );
|
||||||
|
// unsigned char alarmMinBcd = 0;
|
||||||
|
////------------------------------------------------------------
|
||||||
|
// alarmMin = (alarmMin + 2) % 60;//<2F><><EFBFBD><EFBFBD> 4 Сʱ<D0A1><CAB1><EFBFBD><EFBFBD>Сʱ<D0A1><CAB1>
|
||||||
|
// alarmMinBcd = DecToBcd(alarmMin);
|
||||||
|
|
||||||
|
// BM8563_WriteReg(BM8563_ALARM_MIN,alarmMinBcd&0x7F);// <20><><EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
// BM8563_WriteReg(BM8563_ALARM_HOUR, 0x80); // <20><>Ч
|
||||||
|
// BM8563_WriteReg(BM8563_ALARM_DAY , 0x80); // <20><>Ч
|
||||||
|
// BM8563_WriteReg(BM8563_ALARM_WEEK, 0x80); // <20><>Ч
|
||||||
|
//
|
||||||
|
// // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD><D3BF>ƼĴ<C6BC><C4B4><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
||||||
|
// BM8563_WriteReg(BM8563_CSR2, 0x02);
|
||||||
|
//}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
101
RTC.h
Normal file
101
RTC.h
Normal file
@@ -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, // <20><>ʼ<EFBFBD><CABC>״̬<D7B4><CCAC><EFBFBD>״<EFBFBD><D7B4><EFBFBD><EFBFBD>У<EFBFBD>
|
||||||
|
STATE_ON, // ON״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD>ģʽ<C4A3><CABD>
|
||||||
|
STATE_OFF, // OFF״̬<D7B4><CCAC><EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD>ߣ<EFBFBD>
|
||||||
|
STATE_OFF2, // OFF2״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><DFBC>أ<EFBFBD>
|
||||||
|
STATE_ON2 // ON2״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>
|
||||||
|
} SystemState;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ubyte year; // <20>꣨<EFBFBD><EAA3A8><EFBFBD><EFBFBD><EFBFBD>洢<EFBFBD><E6B4A2><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>2025<32><35>25<32><35>
|
||||||
|
ubyte month; // <20>£<EFBFBD>1-12<31><32>
|
||||||
|
ubyte day; // <20>գ<EFBFBD>1-31<33><31>
|
||||||
|
ubyte hour; // Сʱ<D0A1><CAB1>0-23<32><33>
|
||||||
|
ubyte week; // <20><> <20><>0-6<><36>
|
||||||
|
ubyte minute; // <20><><EFBFBD>ӣ<EFBFBD>0-59<35><39>
|
||||||
|
ubyte second; // <20><> <20><>0-59<35><39>
|
||||||
|
ubyte resver;
|
||||||
|
} DateTimeInfo; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ô<EFBFBD><C3B4>շ巨<D5B7><E5B7A8><EFBFBD><EFBFBD>˹<EFBFBD><CBB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
|
||||||
|
typedef union _UnTimeOutput
|
||||||
|
{
|
||||||
|
DateTimeInfo bit_data; // ʹ<>ö<EFBFBD><C3B6><EFBFBD><EFBFBD>Ľṹ<C4BD><E1B9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
ubyte arr[sizeof(DateTimeInfo)]; // ͨ<><CDA8><EFBFBD>ṹ<EFBFBD><E1B9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD>С
|
||||||
|
} UnTimeOutput;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern unsigned char bySta;
|
||||||
|
extern UnTimeOutput currenttime;
|
||||||
|
extern UnTimeOutput un_time_output1;//<2F><><EFBFBD><EFBFBD><EFBFBD>趨ʱ<E8B6A8><CAB1>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD> BM8563 <20><> I2C <20><>ַ
|
||||||
|
#define BM8563_ADDR 0xA2
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD> BM8563 <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||||
|
#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 // <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ƼĴ<C6BC><C4B4><EFBFBD>
|
||||||
|
#define BM8563_STATUS 0x01
|
||||||
|
#define BM8563_TIMER_VALUE 0x0F // <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||||||
|
|
||||||
|
#define BM8563_AF_BIT 0x08 // AF<41><46>־λ<D6BE><CEBB>Bit3<74><33>
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
313
SHARED_INT.C
Normal file
313
SHARED_INT.C
Normal file
@@ -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; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
|
||||||
|
|
||||||
|
}
|
||||||
|
// EWRN : ubNSRL & 0x40
|
||||||
|
if(ubNSRL & 0x40) {
|
||||||
|
can_error_cnt = 0x40;
|
||||||
|
ubNSRL &= ~0x40; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
|
||||||
|
}
|
||||||
|
// 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
|
||||||
|
|
||||||
|
|
||||||
121
SHARED_INT.H
Normal file
121
SHARED_INT.H
Normal file
@@ -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_
|
||||||
Reference in New Issue
Block a user