CH572/CH573/CH582 RTC

   CH572sleep+rtc代码参考:

针对CH572RTC,建议使用TRIG模式。芯片上电获取时钟值,然后填入该值至TRIG。如果使用TMR模式,则会固定填入32768等整数倍,误差相对会放大。

查看代码
#include "CH57x_common.h"
volatile uint32_t lsiFrq = 0;

void DebugInit(void)
{
    GPIOA_SetBits(1<<10);
    GPIOA_ModeCfg(1<<10, GPIO_ModeOut_PP_5mA); // TXD-配置推挽输出,注意先让IO口输出高电平
    UART_Remap(ENABLE, UART_TX_REMAP_PA10, UART_RX_REMAP_PA11);
    UART_DefInit();
}

int main()
{
    // 关闭两线调试
    R16_PIN_ALTERNATE &= ~RB_PIN_DEBUG_EN;
    HSECFG_Capacitance(HSECap_18p);
    SetSysClock(CLK_SOURCE_HSE_PLL_100MHz);
    GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);

    /* 配置串口调试 */
    DebugInit();
    UART_BaudRateCfg(921600);
    PRINT("Start @ChipID=%02x\n", R8_CHIP_ID);
    DelayMs(200);

#if 1
    /* 配置唤醒源为 GPIO - PA5 */
    GPIOA_ModeCfg(GPIO_Pin_5, GPIO_ModeIN_PU);
    GPIOA_ITModeCfg(GPIO_Pin_5, GPIO_ITMode_FallEdge); // 下降沿唤醒
    PFIC_EnableIRQ(GPIO_A_IRQn);
    PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Fsys_Delay_4096);
#endif

#if 1
    sys_safe_access_enable();
    R8_LSI_CONFIG |= RB_CLK_LSI_PON;
    sys_safe_access_disable();

    lsiFrq = RTC_InitClock( Count_1024 );
    PRINT("lsiFrq = %d\n",lsiFrq);

    RTC_InitTime(2026,4,10,1,50,0);
    // RTC_TMRFunCfg(Period_32768);
    RTC_TRIGFunCfg(lsiFrq);         //CH572建议用TRIG模式,更准
    PFIC_EnableIRQ(RTC_IRQn);
    PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_RTC_WAKE, Fsys_Delay_4096);
#endif

    PRINT("sleep mode sleep \n");
    DelayMs(2);
    while(1){
        LowPower_Sleep( RB_PWR_RAM12K | RB_PWR_EXTEND);
    }
}

__INTERRUPT
__HIGH_CODE
void RTC_IRQHandler(void)
{
    SetSysClock(CLK_SOURCE_HSE_PLL_100MHz);
    mDelaymS(5);
    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)) {
        PRINT("TRIG:%d年%d月%d日%d时%d分%d秒\r\n",py,pmon,pd,ph,pm,ps);
        RTC_ClearITFlag(RTC_TRIG_EVENT);
        RTC_TRIGFunCfg(lsiFrq*1);    //触发模式需要再次触发
    }
    if (RTC_GetITFlag(RTC_TMR_EVENT)) {
        PRINT("TMR:%d年%d月%d日%d时%d分%d秒\r\n",py,pmon,pd,ph,pm,ps);
        RTC_ClearITFlag(RTC_TMR_EVENT);
    }
}

__INTERRUPT
__HIGH_CODE
void GPIOA_IRQHandler(void)
{
    GPIOA_ClearITFlagBit(GPIO_Pin_5);
}

CH573sleep+rtc代码参考:

查看代码
#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);    //触发模式需要再次触发
    }
}

CH582 shutdown+rtc唤醒:

注意,shutdown唤醒后会直接复位,不会进入中断。

查看代码
#include "CH58x_common.h"

void DebugInit(void)
{
    GPIOA_SetBits(GPIO_Pin_9);
    GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA);
    UART1_DefInit();
}

int main()
{
    UINT16 py; UINT16 pmon; UINT16 pd; UINT16 ph; UINT16 pm; UINT16 ps;

    uint8_t status = 0;
    SetSysClock(CLK_SOURCE_PLL_60MHz);

    GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);
    GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);

    /* 配置串口调试 */
    DebugInit();
    PRINT("Start @ChipID=%02x\n", R8_CHIP_ID);
    DelayMs(200);

#if 1
    /* 配置唤醒源为 GPIO - PA5 */
    GPIOA_ModeCfg(GPIO_Pin_5, GPIO_ModeIN_PU);
    GPIOA_ITModeCfg(GPIO_Pin_5, GPIO_ITMode_FallEdge); // 下降沿唤醒
    PFIC_EnableIRQ(GPIO_A_IRQn);
    PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay);
#endif

#if 1
    status = R8_RESET_STATUS;
    if(((status & 0x07) == 0x01 )|| ((status & 0x07) == 0x03 )){
        RTC_InitTime(2024,1,1,0,0,0);
        printf("Init RTC OK\r\n");
    }
    if((status & 0x07) == 0x05 ){
        printf("Shutdown_RESET_FLAG\n");
    }

//    RTC_TRIGFunCfg(32768*2);
    RTC_TMRFunCfg(Period_1_S);
    PFIC_EnableIRQ(RTC_IRQn);
    PWR_PeriphWakeUpCfg( ENABLE, RB_SLP_RTC_WAKE, Long_Delay );
    RTC_GetTime(&py,&pmon,&pd,&ph,&pm,&ps);
    printf("TRIG  %d年%d月%d日%d时%d分%d秒\r\n",py,pmon,pd,ph,pm,ps);
#endif

#if 1
    PRINT("shut down mode sleep \n");
    DelayMs(2);
    LowPower_Shutdown(0); //全部断电,唤醒后复位
    HSECFG_Current(HSE_RCur_100); // 降为额定电流(低功耗函数中提升了HSE偏置电流)
    mDelaymS(5);
#endif

    while(1);
}

__INTERRUPT
__HIGH_CODE
void GPIOA_IRQHandler(void)
{
    GPIOA_ClearITFlagBit(GPIO_Pin_6 | GPIO_Pin_5);
}

__INTERRUPT
__HIGH_CODE
void RTC_IRQHandler(void)
{
    RTC_ClearITFlag(RTC_TRIG_EVENT);
    RTC_ClearITFlag(RTC_TMR_EVENT);
}

 

posted @ 2024-07-30 09:49  SweetTea_lllpc  阅读(1004)  评论(0)    收藏  举报