/********************************** (C) COPYRIGHT ******************************* * File Name : SLEEP.c * Author : WCH * Version : V1.1 * Date : 2019/11/05 * Description : 睡眠配置及其初始化 *******************************************************************************/ /******************************************************************************/ /* 头文件包含 */ #include "CH57x_common.h" #include "HAL.h" /******************************************************************************* * @fn CH57X_LowPower * * @brief 启动睡眠 * * input parameters * * @param time-唤醒的时间点(RTC绝对值) * * output parameters * * @param * * @return None. */ u32 CH57X_LowPower( u32 time ) { #if (defined (HAL_SLEEP)) && (HAL_SLEEP == TRUE) u32 tmp,irq_status; SYS_DisableAllIrq( &irq_status ); tmp = RTC_GetCycle32k(); if( (time < tmp) || ((time - tmp) < 30) ){ // 检测睡眠的最短时间 SYS_RecoverIrq( irq_status ); return 2; } RTC_SetTignTime( time ); SYS_RecoverIrq( irq_status ); #if( DEBUG == Debug_UART1 ) while((R8_UART1_LSR&RB_LSR_TX_ALL_EMP)== 0 ) __nop();// 使用其他串口输出打印信息需要修改这行代码 #endif // LOW POWER-sleep模式 if( !RTCTigFlag ){ LowPower_Sleep(RB_PWR_RAM2K|RB_PWR_RAM14K|RB_PWR_EXTEND ); SetSysClock( CLK_SOURCE_HSI_32MHz ); DelayUs(1500); SetSysClock( CLK_SOURCE_HSE_32MHz ); } else{ return 3; } #endif return 0; } /******************************************************************************* * @fn HAL_SleepInit * * @brief 配置睡眠唤醒的方式-RTC唤醒,触发模式 * * input parameters * * @param None. * * output parameters * * @param * * @return None. */ void HAL_SleepInit( void ) { #if (defined (HAL_SLEEP)) && (HAL_SLEEP == TRUE) R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1; R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2; R8_SLP_WAKE_CTRL |= RB_SLP_RTC_WAKE; // RTC唤醒 R8_RTC_MODE_CTRL |= RB_RTC_TRIG_EN; // 触发模式 R8_SAFE_ACCESS_SIG = 0; // NVIC_EnableIRQ(RTC_IRQn); #endif }