ch592无法用RTC_TRIGFunCfg触发唤醒

ch592f无法用RTC_TRIGFunCfg触发唤醒,但是可以用RTC_TMRFunCfg定时唤醒

用ch592的rtc和休眠例子,也是一样,无法rtc触发唤醒


另外串口只能读取不超过7个字节。超过7个字节,只能一个一个字节读取。有没有办法一次读取超过7个字节,比如13个字节

①使用触发中断唤醒时,进入中断服务函数再触发一次:

RTC_ClearITFlag(RTC_TRIG_EVENT); 

②可以使用串口中断的方式接收数据,fifo是8字节,所以可配置的触发接收最大是7字节,无法一次性接收到13个字节。

可以手动修改,写一个缓冲区,接收触发的数据后,再移位接收超时的数据,这样就可以完整的接收到数据。

将触发for循环的接收数据-1(for(i = 0; i != (trigB-1); i++)),少接收一个数据,则每次都会进入超时。



触发模式的 rtc还是无法启动

在中断中是类似这样写么

void RTC_IRQHandler(void)
{
  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_TRIGFunCfg(32768*1);
        RTC_ClearITFlag(RTC_TRIG_EVENT);
    }    if (RTC_GetITFlag(RTC_TMR_EVENT)) {
        printf("%d年%d月%d日%d时%d分%d秒\r\n",py,pmon,pd,ph,pm,ps);
        RTC_ClearITFlag(RTC_TMR_EVENT);
    }
}

如是这样,试了。还是无法启动


有参考的代码没


#include "CH59x_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);
    PWR_DCDCCfg(ENABLE);
    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
    LClk32K_Select(Clk32K_LSE);//启用外部32K
    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_TRIGFunCfg(65535);
    PFIC_EnableIRQ(RTC_IRQn);
    PWR_PeriphWakeUpCfg( ENABLE, RB_SLP_RTC_WAKE, Long_Delay );
    printf("Init RTC OK\r\n");
#endif
#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
    while(1){
//        PRINT("sleep mode sleep \n");
        DelayMs(2);
        // 注意当主频为80M时,Sleep睡眠唤醒中断不可调用flash内代码。
        LowPower_Sleep(RB_PWR_RAM24K | RB_PWR_RAM2K | RB_XT_PRE_EN); //只保留24+2K SRAM 供电
        HSECFG_Current(HSE_RCur_100);                 // 降为额定电流(低功耗函数中提升了HSE偏置电流)
//        PRINT("wake.. \n");
    }
#endif

//    while(1);
}
__INTERRUPT
__HIGH_CODE
void GPIOA_IRQHandler(void)
{
    printf("GPIO...\n");
    GPIOA_ClearITFlagBit(GPIO_Pin_6 | GPIO_Pin_5);
}
__attribute__((interrupt("WCH-Interrupt-fast")))
__attribute__((section(".highcode")))
void RTC_IRQHandler(void)
{
    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(65535);
    }
}

可以参考看下,如果有问题,可以发送邮件至邮箱lpc@wch.cn,我直接提供代码看下。

参考博客:

CH573芯片Sleep说明(RTC程序说明) - SweetTea_lllpc - 博客园 (cnblogs.com)


rtc触发模式和rf 2.4g是不是有冲突?去掉2.4g相关。rtc正常运行

rtc定时模式在rf  2.4g可以正常使用


问题解决了,放在2.4g初始化后面


只有登录才能回复,可以选择微信账号登录