CH582 RTC定时唤醒+嘀嗒定时器使用

#include "CH58x_common.h"

/*********************************************************************
 * @fn      DebugInit
 *
 * @brief   调试初始化
 *
 * @return  none
 */
void DebugInit(void)
{
    GPIOA_SetBits(GPIO_Pin_9);
    GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA);
    UART1_DefInit();
}

/*********************************************************************
 * @fn      main
 *
 * @brief   主函数
 *
 * @return  none
 */
int main()
{
    SetSysClock(CLK_SOURCE_PLL_60MHz);

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

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

//    UART2_DefInit();
//    GPIOA_SetBits(GPIO_Pin_7);
//    GPIOA_ModeCfg(GPIO_Pin_7, GPIO_ModeOut_PP_5mA);
//    GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);
//    GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);
////    GPIOA_SetBits(GPIO_Pin_7|GPIO_Pin_6);
//    GPIOA_ModeCfg(GPIO_Pin_7|GPIO_Pin_6, GPIO_ModeIN_PD);

    RTC_InitTime(2021,9,8,15,25,0);//初始化RTC
    RTC_TMRFunCfg(Period_2_S);//设置RTC定时触发
    RTC_TRIGFunCfg(32768);
    PFIC_EnableIRQ(RTC_IRQn);//开启RTC中断
//    PFIC_DisableIRQ(RTC_IRQn);
//    sys_safe_access_enable();
//    R8_RTC_MODE_CTRL &= ~(RB_RTC_TRIG_EN|RB_RTC_TMR_EN);
//    sys_safe_access_disable();
         //PWR_UnitModCfg(DISABLE,0x1);
    PWR_PeriphWakeUpCfg( ENABLE, RB_SLP_RTC_WAKE, Long_Delay );//开启RTC唤醒使能
    printf("Init RTC OK\r\n");

    SysTick_Config(FREQ_SYS);


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

#if 0
    PRINT("IDLE mode sleep \n");
    DelayMs(1);
    LowPower_Idle();
    PRINT("wake.. \n");
    DelayMs(500);
#endif

#if 0
    PRINT("Halt mode sleep \n");
    DelayMs(2);
    LowPower_Halt();
    HSECFG_Current(HSE_RCur_100); // 降为额定电流(低功耗函数中提升了HSE偏置电流)
    DelayMs(2);
    PRINT("wake.. \n");
    DelayMs(500);
#endif


#if 0
    PRINT("shut down mode sleep \n");
    DelayMs(2);
    LowPower_Shutdown(0); //全部断电,唤醒后复位
    /*
     此模式唤醒后会执行复位,所以下面代码不会运行,
     注意要确保系统睡下去再唤醒才是唤醒复位,否则有可能变成IDLE等级唤醒
     */
    HSECFG_Current(HSE_RCur_100); // 降为额定电流(低功耗函数中提升了HSE偏置电流)
    PRINT("wake.. \n");
    DelayMs(500);

    PowerMonitor(ENABLE,HALevel_2V5);
    PFIC_EnableIRQ(NMI_IRQn);
    PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_BAT_WAKE, Long_Delay);
#endif

//    PFIC_EnableIRQ(WDOG_BAT_IRQn);
//    PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_BAT_WAKE, Long_Delay);
    while(1)
    {
#if 1
    PRINT("sleep mode sleep \n");
    DelayMs(2);
    // 注意当主频为80M时,Sleep睡眠唤醒中断不可调用flash内代码。
    LowPower_Sleep(RB_PWR_RAM2K|RB_PWR_RAM30K); //只保留30+2K SRAM 供电
    HSECFG_Current(HSE_RCur_100);                 // 降为额定电流(低功耗函数中提升了HSE偏置电流)
    DelayMs(5);
    PRINT("wake.. \n");
    DelayMs(500);
#endif

//      PRINT("pong.. \n");
    }
}

/*********************************************************************
 * @fn      GPIOA_IRQHandler
 *
 * @brief   GPIOA中断函数
 *
 * @return  none
 */
__INTERRUPT
__HIGH_CODE
void GPIOA_IRQHandler(void)
{
    PRINT("GPIOA=%x. \n",R16_PA_INT_IF);
    GPIOA_ClearITFlagBit(GPIO_Pin_0 | GPIO_Pin_5|GPIO_Pin_13);
}

__INTERRUPT
__HIGH_CODE
void NMI_Handler(void)
{
  SetSysClock(CLK_SOURCE_PLL_60MHz);
  DelayMs(5);
  PRINT("R8_BAT_STATUS=%x. \n",R8_BAT_STATUS);
  while(R8_BAT_STATUS&RB_BAT_STAT_LOWER)
  {
    PRINT("BAT low.. \n");
  }
  PRINT("BAT normal.. \n");
}

__INTERRUPT
__HIGH_CODE
void WDOG_BAT_IRQHandler(void)
{
    SetSysClock(CLK_SOURCE_PLL_60MHz);
    DelayMs(5);
    PRINT("WDOG_BAT_IRQHandler\n");
    while(R8_BAT_STATUS&RB_BAT_STAT_LOW)
     {
       PRINT("WDOG_BAT low.. \n");
     }
}

__attribute__((interrupt("WCH-Interrupt-fast"))) //RTC中断
__attribute__((section(".highcode")))
void RTC_IRQHandler(void)
{
  UINT16 py; UINT16 pmon; UINT16 pd; UINT16 ph; UINT16 pm; UINT16 ps;
  SetSysClock(CLK_SOURCE_PLL_60MHz);
  RTC_GetTime(&py,&pmon,&pd,&ph,&pm,&ps);
    if (RTC_GetITFlag(RTC_TMR_EVENT)) {
//        printf("%d年%d月%d日%d时%d分%d秒\r\n",py,pmon,pd,ph,pm,ps);
        PRINT("RTC唤醒\n");
        RTC_ClearITFlag(RTC_TMR_EVENT);
    }
    if (RTC_GetITFlag(RTC_TRIG_EVENT)) {
//        printf("%d年%d月%d日%d时%d分%d秒\r\n",py,pmon,pd,ph,pm,ps);
        RTC_TRIGFunCfg(32768);
        RTC_ClearITFlag(RTC_TRIG_EVENT);
    }
}

__INTERRUPT
__HIGH_CODE
void SysTick_Handler()          /***嘀嗒定时器中断函数***/
{
  SetSysClock(CLK_SOURCE_PLL_60MHz);
  UINT16 py; UINT16 pmon; UINT16 pd; UINT16 ph; UINT16 pm; UINT16 ps;
  RTC_GetTime(&py,&pmon,&pd,&ph,&pm,&ps);
  printf("%d年%d月%d日%d时%d分%d秒\r\n",py,pmon,pd,ph,pm,ps);
    SysTick->SR = 0;                    //清除中断标志
}

CH582 演示 RTC定时/触发唤醒sleep(例子用了2s一次定时唤醒)。

演示582 嘀嗒定时器配置,1s一次。

在582中,sleep模式下嘀嗒定时器配置睡眠不保持,唤醒后嘀嗒定时器停止,需要使用得重新初始化嘀嗒定时器。

 

posted @ 2024-07-17 10:24  debugdabiaoge  阅读(119)  评论(0编辑  收藏  举报