CH573RTC
代码参考:
#include "CH57x_common.h"
void DebugInit(void)
{
GPIOA_SetBits(GPIO_Pin_9);
GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA);
UART1_DefInit();
}
int main()
{
SetSysClock(CLK_SOURCE_PLL_60MHz);
GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PD);
GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PD);
DebugInit();
PRINT("Start @ChipID=%02x\n", R8_CHIP_ID);
DelayMs(200);
LClk32K_Select(Clk32K_LSI);
R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
R8_CK32K_CONFIG &= ~RB_CLK_XT32K_PON;
R8_SAFE_ACCESS_SIG = 0;
{
RTC_InitTime(2024,1,1,0,0,0);
// RTC_TMRFunCfg(Period_1_S); //两种唤醒方式:定时功能、触发功能。这里是使用的定时唤醒,相应参数库已经封装好,可根据需求调用。注意清除对应的标志。
RTC_TRIGFunCfg(32768*2);//两种唤醒方式:定时功能、触发功能。这里是使用的触发唤醒,单位是32768,代表1S。注意清除对应的标志。注意:使用触发需要在中断里面再触发一次。
PFIC_EnableIRQ(RTC_IRQn); //开启RTC使能
PWR_PeriphWakeUpCfg( ENABLE, RB_SLP_RTC_WAKE, Edge_LongDelay );
}
/* 配置唤醒源为 GPIO - PA5 */
GPIOA_ModeCfg(GPIO_Pin_10, GPIO_ModeIN_PU);
GPIOA_ITModeCfg(GPIO_Pin_10, GPIO_ITMode_FallEdge); // 下降沿唤醒
PFIC_EnableIRQ(GPIO_A_IRQn);
PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Edge_LongDelay);
PRINT("sleep mode sleep \n");
DelayMs(2);
while(1){
LowPower_Sleep(RB_PWR_RAM16K | RB_PWR_RAM2K | RB_PWR_EXTEND | RB_PWR_XROM); //只保留14+2K SRAM 供电
HSECFG_Current(HSE_RCur_100);
DelayMs(2);
}
}
__attribute__((interrupt("WCH-Interrupt-fast")))
__attribute__((section(".highcode")))
void GPIOA_IRQHandler(void)
{
printf("GPIO IRQ\n");
GPIOA_ClearITFlagBit(GPIO_Pin_10);
}
__attribute__((interrupt("WCH-Interrupt-fast")))
__attribute__((section(".highcode")))
void RTC_IRQHandler(void)
{
SetSysClock(CLK_SOURCE_PLL_60MHz);
mDelaymS(3);
UINT16 py; UINT16 pmon; UINT16 pd; UINT16 ph; UINT16 pm; UINT16 ps;
RTC_GetTime(&py,&pmon,&pd,&ph,&pm,&ps);
if (RTC_GetITFlag(RTC_TRIG_EVENT)) {
printf("%d年%d月%d日%d时%d分%d秒\r\n",py,pmon,pd,ph,pm,ps);
RTC_ClearITFlag(RTC_TRIG_EVENT);
RTC_TRIGFunCfg(32768*2); //触发模式需要再次触发
}
}