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模式下嘀嗒定时器配置睡眠不保持,唤醒后嘀嗒定时器停止,需要使用得重新初始化嘀嗒定时器。