CH582 睡眠测试问题

int main()

{

    PWR_DCDCCfg(ENABLE);


    uint8_t i;

    SetSysClock(CLK_SOURCE_PLL_60MHz);


    GPIOA_ModeCfg( GPIO_Pin_All, GPIO_ModeIN_PU );

    GPIOB_ModeCfg( GPIO_Pin_All, GPIO_ModeIN_PD );


    WS2812x_Power_Set(ENABLE);


    Key_init();


    /* 配置串口调试 */

    DebugInit();

    PRINT("Start @ChipID=%02X\n", R8_CHIP_ID);

    PRINT( "Time=%s-%s\n",__TIME__,__DATE__ );


    SysTick_Config(GetSysClock() / 1000 * SYSTICK_INTERVAL);

    SysTick->SR = 0;                    //清除中断标志

    PFIC_DisableIRQ(SysTick_IRQn);


    RTC_Init();

    WX281X_Init();


    while(1)

    {

        if(SysTick->SR)

        {

            SysTick->SR = 0;


            KeyValue = key_read();

            if(KEY_Event_Click == KeyValue)

            {

                PlayMode++;

                if(PlayMode == 5)PlayMode = 1 ;

                switch(PlayMode)

                {

                    case 2 :Function_state_1 = 0 ;PlayFunction_1();break ;

                    case 1 :Function_state_4 = 0 ;PlayFunction_4(0,64,8);break ;

                    case 3 :Function_state_3 = 0 ;PlayFunction_3(&StrBuff[0],0,0,80);break ;

                    case 4 :Function_state_4 = 0 ;PlayFunction_4(0,64,8);break ;

                }

            }

            else if(KEY_Event_Press == KeyValue)

            {

                ARGB_FillRGB(0, 0, 0);


                PRINT( "sleep mode sleep \n" );

                DelayMs( 10 );

                WS2812x_Power_Set(DISABLE);


                while(!GPIOB_ReadPortPin(GPIO_Pin_0));


                LowPower_Sleep(RB_PWR_RAM30K | RB_PWR_RAM2K); //只保留30+2K SRAM 供电

                //LowPower_Halt();


                HSECFG_Current( HSE_RCur_100 );     // 降为额定电流(低功耗函数中提升了HSE偏置电流)

                DelayMs( 5 );


                WS2812x_Power_Set(ENABLE);

                PRINT( "wake.. \n" );


                DelayMs( 500 );

             }



            Usart_scan();


            switch(PlayMode)

            {

                case 2 :PlayFunction_1();break ;

                case 1 :PlayFunction_4(0,64,8);break ;

                case 3 :PlayFunction_3(&StrBuff[0],0,0,80);break ;

                case 4 :PlayFunction_4(0,64,8);break ;

            }


        }

    }

}

问题点:

1、项目没有使用协议栈,有RTC 时钟,16秒唤醒一次。当连接串口后,RTC时钟不能定时触发,断开串口后可以

2、程序使用了systick时钟,唤醒后工作不正常,SPI 一直输出高电平,轮询的按键功能也不能工作。是因为主时钟有问题?感觉程序没有跑起来

3、while(!GPIOB_ReadPortPin(GPIO_Pin_0));是为了进睡眠前确认按键已经松开。不加这一句的,睡眠电流大不少,但唤醒后工作是正常的


请工程师帮我看一下啊,想了好久都没有找到原因


串口是否进行数据收发,如果使用串口中断一直在收发数据,则有可能打断RTC的中断。这部分连接/断开串口具体描述一下是做了什么操作。

sleep模式唤醒后是正常执行功能代码的。加一些打印或者io翻转判断是否已经醒来。不要根据功耗去判断是否完全醒来。


进睡眠模式前,串口并没有数据收发。按键唤醒后,按键中断服务中打印“hello”,主程序打印"wake...",这些也都正常。但是本应该继续轮询按键和其它功能的,现在并没有。比较怀疑是systick出了问题或是程序掉进了某个中断,请帮我看下,万分感谢

icon_rar.gifThomas Lattice.zip



串口的断开/连接就是物理上的连接,连接的是RXD,TXD,GND 3根线。RXD->PA8 有10K上拉电阻。串口调试助手不打开

1、使用 LowPower_Halt();连接串口,RTC 不能唤醒,按键可以,唤醒后功能正常;断开串口,RTC 和按键都可以唤醒,工作正常。

2、使用LowPower_Sleep();连接串口,RTC 不能唤醒,按键唤醒后功能异常;断开串口,RTC 和按键都可以唤醒,但工作异常


QQ20240717-113233.png

使用官方的PM例程做测试,确定就是systick 出了问题,还请工程师说一下,systick从睡眠模式唤醒后要怎么恢复工作,唤醒后我重新配置了还是不行。

另外,电路板串口与电脑相连,并由串口供电,PM例程也是会自动唤醒(手碰到PA5引脚),断开连接使用电池供电没有这个问题,有没有可能是因为电脑电源未接地引起的感应电在作妖?


SysTick_Config(GetSysClock() / 1000 * SYSTICK_INTERVAL);

    SysTick->SR = 0;                    //清除中断标志

    PFIC_DisableIRQ(SysTick_IRQn);



嘀嗒定时器基于32M主频,睡眠不会再运行,唤醒后需要手动使能打开计时的。TMR定时器唤醒后也会重新计数。

在唤醒后可以重新使能嘀嗒定时器的开关:SysTick_Config。


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