关于571/573休眠死机与功耗

反复测试了很多次,使用TMOS与不使用TMOS,唤醒休眠唤醒休眠不断循环,shutdown+RTC4秒或多秒唤醒,必然死机。deepsleep电源全关只开核心也必然死机。只有deepsleep至少开启RAM16K电源,测试了N天不会死机。

也就是说手册上的shutdow+RTC 0.6UA的功耗是做不到的,因为会死机。deepsleep+RAM16K电源至少5UA,也就是这个芯片用来说标签类产品至少要5UA电流(外扩主控用复位按钮唤醒除外)。

不知道这样理解是否有错误,只是想尽量降低功耗。开启RAM16K电源不知道是否是因为中断向量在RAM16K的开头,唤醒需要用到,但是不开启这个电源也能唤醒,只是运行一段时间后死机。

不知道能否做到周期唤醒蓝牙发送,而休眠又能在1.4UA以下。

尝试在执行shutdown 前做以下处理:

1,//R8_SLP_WAKE_CTRL 寄存器中的RB_WAKE_DELAY 设置位长延时:

PWR_PeriphWakeUpCfg( ENABLE, RB_SLP_GPIO_WAKE, Edge_LongDelay )

2,  降频:

SetSysClock( CLK_SOURCE_HSE_6_4MHz );


example code:

        PWR_PeriphWakeUpCfg( ENABLE, RB_SLP_GPIO_WAKE, Edge_LongDelay );

        uint32_t rtc_cnt = RTC_GetCycle32k();
        rtc_cnt = 3276+current_rtc_cnt;
        if( rtc_cnt > 0xA8C00000 ) {
            rtc_cnt -= 0xA8C00000;
        }
        RTC_SetTignTime(current_rtc_cnt);
        SetSysClock( CLK_SOURCE_HSE_6_4MHz );
        LowPower_Shutdown( 0 );



原来还有秘密操作,周末挂起来试一下


#if( DEBUG == Debug_UART1 )  // 使用其他串口输出打印信息需要修改这行代码
  while( ( R8_UART1_LSR & RB_LSR_TX_ALL_EMP ) == 0 )
    __nop();
#endif
    GPIOA_ModeCfg(GPIO_Pin_All,GPIO_ModeIN_Floating);

    //清除RTC中断
    R8_RTC_FLAG_CTRL = ( RB_RTC_TMR_CLR | RB_RTC_TRIG_CLR );
#ifndef RTC_TIME_TRIG
    {
        u32 tmp, irq_status;
        SYS_DisableAllIrq( &irq_status );
        tmp = RTC_GetCycle32k();
        SYS_RecoverIrq( irq_status );
        tmp += SEND_PERIOD*32768;
        if( tmp > 0xA8C00000 )
            tmp -= 0xA8C00000;
        RTC_SetTignTime( tmp );

        R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
        R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
        R8_RTC_MODE_CTRL |= RB_RTC_TRIG_EN;    // 触发模式
        R8_SAFE_ACCESS_SIG = 0;    //
        PFIC_EnableIRQ( RTC_IRQn );
    }
#else
    {
       RTC_TMRFunCfg(SEND_PERIOD);
       PFIC_EnableIRQ( RTC_IRQn );
    }
#endif
    //PWR_UnitModCfg(DISABLE,0x1);
    PWR_PeriphWakeUpCfg( ENABLE, RB_SLP_RTC_WAKE, Edge_LongDelay );
    SetSysClock( CLK_SOURCE_HSE_6_4MHz );
    LowPower_Shutdown( 0 );


PWR_PeriphWakeUpCfg( ENABLE, RB_SLP_RTC_WAKE, Edge_LongDelay );

Edge_LongDelay 直接无法唤醒,short可以


测试了2天多,没死机。SetSysClock( CLK_SOURCE_HSE_6_4MHz );加了这句,就没死机,不知道为什么,手册要更新下。


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