首页 > 其他分享 >CH582 RTC定时唤醒+嘀嗒定时器使用

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

时间:2024-07-17 10:31:51浏览次数:11  
标签:BAT 定时器 RTC Pin GPIOA GPIO PRINT CH582

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

 

标签:BAT,定时器,RTC,Pin,GPIOA,GPIO,PRINT,CH582
From: https://www.cnblogs.com/debugdabiaoge/p/18306764

相关文章

  • 从0到1打造一个 WebRTC 应用
    ......
  • webrtc-streamer实时播放监控
    公司要做web端监控实时播放,经过调研,webrtc-streamer的方式对前后端项目侵入最少,且没有延迟卡钝的现象。一、准备工作一个摄像头,摄像头对应的rtsp流链接,一台电脑,一个vue项目。二、Webrtc-streamer安装及启动教程 1、下载安装包下载地址:https://github.com/m......
  • 【嵌入式DIY实例-ESP8266篇】-LCD ST7789显示DS1307 RTC时间数据
    LCDST7789显示DS1307RTC时间数据文章目录LCDST7789显示DS1307RTC时间数据1、硬件准备与接线2、代码实现本文将介绍如何使用ESP8266NodeMCU板和DS1307RTC集成电路构建简单的实时时钟和日历(RTCC),其中时间和日期打印在ST7789TFT显示模块上。S......
  • 【80C51单片机】定时器/计数器的理解
    目录定时器/计数器1.定时器怎么定时简单理解(加1经过了多少时间)什么是时钟周期什么是机器周期2.如何设置定时基本结构相关寄存器1.TMOD寄存器2.TCON寄存器代码示例定时器/计数器80C51单片机的定时器和计数器(TimersandCounters)是其重要的外围设备,用于测量时间......
  • stm32 HAL库 笔记 定时器(1) 中断实验
    单片机中的定时器主要用于控制时间,比如延时、定时等等。而计数器则主要用于统计事件或脉冲信号的数量。通过控制定时器和计数器的中断、清零等操作,我们可以完成各种复杂的定时、计数等操作,实现更加智能化的控制系统。单片机的定时器一般由计数器、预分频器、中断控制器、基准......
  • HAL库源码移植与使用之高级定时器REP寄存器
    高级定时器的溢出中断信号与更新要想输出,要经过一个重复计数寄存器,该寄存器由REP控制并由TIMX_RCR控制计数值它的原理是计数器每次上溢或下溢而输出中断信号和更新都能使重复计数器值减1,减到0时,再发生一次溢出就会产生更新事件所以如果设置RCR为N,更新事件将在N+1次溢出时发......
  • STM32系统嘀嗒Systick定时器
    目录STM32系统嘀嗒Systick定时器基本概念基本应用时钟分析时钟选择(1) 内部时钟(2) 外部时钟原理分析控制方式STM32系统嘀嗒Systick定时器基本概念定时器是STM32中常用的外设,一般定时器的基本功能就是定时,而在CortexM3/M4内核中也包含一个简单的定时器,就是系统嘀嗒定时器(Sy......
  • Windows定时器-timeSetEvent
     接口:MMRESULTtimeSetEvent(UINTuDelay,//以毫秒指定事件的周期UINTuResolution,//以毫秒指定延时的精度,缺省值为1msLPTIMECALLBACKlpTimeProc,//指向回调函数的指针WORDdwUser,//用户定义的回调数据,传递给回调函数......
  • WebRTC群发消息API接口选型指南!怎么用?
    WebRTC群发消息API接口安全性如何?API接口怎么优化?WebRTC技术在现代实时通信中占据了重要地位。对于需要实现群发消息功能的应用程序来说,选择合适的WebRTC群发消息API接口是至关重要的。AokSend将详细介绍WebRTC群发消息API接口的选型指南。WebRTC群发消息API接口:稳定可靠一......
  • WebRTC入门
    效果展示基础概念WebRTC指的是基于web的实时视频通话,其实就相当于A->B发直播画面,同时B->A发送直播画面,这样就是视频聊天了WebRTC的视频通话是A和B两两之间进行的WebRTC通话双方通过一个公共的中心服务器找到对方,就像聊天室一样WebRTC的连接过程一般是A通过websocket连接......