CH592/CH582/CH585低功耗模式下边沿唤醒

前言:在某些数据场景中使用,需要进行双边沿唤醒。在592/582上没有对应的接口函数需要自己在代码上进行处理,手动进行唤醒边沿的切换。

CH585已经可以通过接口函数实现边沿唤醒。

CH592 CH582双边沿唤醒具体实现是在中断函数中切换唤醒源的配置。

代码实现:

GPIO初始化配置:

void gpio_wakeup_edge_test(void)
{
    GPIOA_ModeCfg( GPIO_Pin_5, GPIO_ModeIN_Floating );

    GPIOA_ITModeCfg( GPIO_Pin_5, GPIO_ITMode_FallEdge );        // 下降沿唤醒
    if(GPIOA_ReadPortPin(GPIO_Pin_5)) {  //toggle gpio int edge
        GPIOA_ResetBits(GPIO_Pin_5);
        PRINT("h\r\n");
    }
    else {
        GPIOA_SetBits(GPIO_Pin_5);
        PRINT("L\r\n");
    }

    PFIC_EnableIRQ( GPIO_A_IRQn );
    PWR_PeriphWakeUpCfg( ENABLE, RB_SLP_GPIO_WAKE, Long_Delay );
}

中断服务函数配置:

__attribute__((interrupt("WCH-Interrupt-fast")))
__attribute__((section(".highcode")))
void GPIOA_IRQHandler( void )
{


    if(R16_PA_INT_IF & GPIO_Pin_5) // check enable gpio it flag
    {
        R16_PA_INT_IF = GPIO_Pin_5; //clear it flag
        if(GPIOA_ReadPortPin(GPIO_Pin_5)) {  //toggle gpio int edge
            GPIOA_ResetBits(GPIO_Pin_5);

            DelayUs(100);// wait hse for uart printf test
            PRINT("h\r\n");
        }
        else {
            GPIOA_SetBits(GPIO_Pin_5);

            DelayUs(100);// wait hse for uart printf test
            PRINT("L\r\n");
        }
    }
}

attention:将PWR.C中的修改休眠函数LowPower_Sleep,将WFI修改为WFE。

 现象:(测试条件为另一单片机固定时间输出高低电平对另一单片机进行唤醒)

 

 

仅是个人学习分享,如有错漏请指正

posted @ 2025-02-28 19:39  小舟从此逝_1  阅读(438)  评论(0)    收藏  举报