CH573死机

int main()

{

    SetSysClock( CLK_SOURCE_PLL_60MHz );

    GPIOA_ModeCfg(GPIO_Pin_All,GPIO_ModeIN_Floating);

    GPIOB_ModeCfg(GPIO_Pin_All,GPIO_ModeIN_Floating);


    WWDG_SetCounter(0x0);

    WWDG_ResetCfg(ENABLE);


#ifdef DEBUG

    GPIOA_SetBits( bTXD1 );

    GPIOA_ModeCfg( bTXD1, GPIO_ModeOut_PP_5mA );

    UART1_DefInit( );

#endif

    PRINT("s\n");

    {

        //PRINT("%s\n",VER_LIB);

    }

    

    WWDG_SetCounter(0x0);


    CH57X_BLEInit( );

    RF_RoleInit( );

    rf_init();


    RF_Tx( TX_DATA,TX_DATA_SIZE, 0x02, 0xFF );

    RF_Tx( TX_DATA,TX_DATA_SIZE, 0x02, 0xFF );

    RF_Tx( TX_DATA,TX_DATA_SIZE, 0x02, 0xFF );


    WWDG_SetCounter(0x0);

    /*while(1){

        DelayMs( 200 );

        RF_Tx( TX_DATA,TX_DATA_SIZE, 0x02, 0xFF );

    }*/



SLEEP:

    PRINT( "e\n" );

    //PRINT( "shut down mode sleep\n" );

    RTC_TMRFunCfg(SEND_PERIOD);

    PWR_PeriphWakeUpCfg( ENABLE, RB_SLP_RTC_WAKE, Edge_ShortDelay );

    DelayUs( 2 );

    LowPower_Shutdown( 0 );                          //全部断电,唤醒后复位


    return 0;

}


用573发送蓝牙每隔4秒数据,持续20来分钟就再也收不到数据。代码里的看门狗功能是后加的,现在正在测试。但是不加看门狗的情况下,会出现单片机死机,接串口线也收不到打印数据。现在很怕是休眠状态下死机,因为573看门狗非独立,依赖系统时钟。如果是RTC死机的话这该怎么办,电池供电的长期用产品


实测,加了看门狗一样死机


RTC初始化完成了吗?使用的是内置晶振还是外部晶振?帖子中并未出现以上信息。

如果方便,请提供整个工程,验证测试。


不好意思,确实没初始化为内部始终,抄代码抄拉了,现在加上使能HAL_TIME_INIT,我再测试下


/********************************** (C) COPYRIGHT *******************************

 * File Name          : Main.c

 * Author             : WCH

 * Version            : V1.0

 * Date               : 2020/08/06

 * Description     : 串口1收发演示

 *******************************************************************************/


#include "CH57x_common.h"

#include "CH57xBLE_LIB.H"

#include "HAL.h"

#include "math.h"


__attribute__((aligned(4))) u32 MEM_BUF[BLE_MEMHEAP_SIZE/4];


#if (defined (BLE_MAC)) && (BLE_MAC == TRUE)

u8C MacAddr[6] = {0x84,0xC2,0xE4,0x03,0x02,0x02};

#endif


#define TX_DATA_SIZE  15

uint8_t TX_DATA[TX_DATA_SIZE] = {0x1,0x00,0x0, 0x0, 0xAB, 0x23,

                                 8,0x09,'m','y','-','T','E','S','T',

};


//rf发送周期

#define SEND_PERIOD Period_4_S


void RF_2G4StatusCallBack( uint8 sta , uint8 crc, uint8 *rxBuf )

{


}


void rf_init(void){

    uint8 state;

    rfConfig_t rfConfig;


    rfConfig.accessAddress = 0x8E89BED6;  // 禁止使用0x55555555以及0xAAAAAAAA ( 建议不超过24次位反转,且不超过连续的6个0或1 )

    rfConfig.CRCInit = 0x555555;

    rfConfig.Channel = 39;

    //rfConfig.Frequency = 2480000;

    //rfConfig.LLEMode = LLE_MODE_BASIC|LLE_MODE_EX_CHANNEL; // 使能 LLE_MODE_EX_CHANNEL 表示 选择 rfConfig.Frequency 作为通信频点

    rfConfig.LLEMode = LLE_MODE_BASIC;

    rfConfig.rfStatusCB = RF_2G4StatusCallBack;

    state = RF_Config( &rfConfig );

    //PRINT("rf 2.4g init: %x\n",state);

}



int main()

{

    SetSysClock( CLK_SOURCE_PLL_60MHz );

    GPIOA_ModeCfg(GPIO_Pin_All,GPIO_ModeIN_Floating);

    GPIOB_ModeCfg(GPIO_Pin_All,GPIO_ModeIN_Floating);

    HAL_TimeInit();


    WWDG_SetCounter(0x0);

    WWDG_ResetCfg(ENABLE);


#ifdef DEBUG

    GPIOA_SetBits( bTXD1 );

    GPIOA_ModeCfg( bTXD1, GPIO_ModeOut_PP_5mA );

    UART1_DefInit( );

#endif

    PRINT("s\n");

    {

        //PRINT("%s\n",VER_LIB);

    }

   

    WWDG_SetCounter(0x0);


    CH57X_BLEInit( );

    RF_RoleInit( );

    rf_init();


    RF_Tx( TX_DATA,TX_DATA_SIZE, 0x02, 0xFF );

    RF_Tx( TX_DATA,TX_DATA_SIZE, 0x02, 0xFF );

    RF_Tx( TX_DATA,TX_DATA_SIZE, 0x02, 0xFF );


    WWDG_SetCounter(0x0);

    /*while(1){

        DelayMs( 200 );

        RF_Tx( TX_DATA,TX_DATA_SIZE, 0x02, 0xFF );

    }*/



SLEEP:

    PRINT( "e\n" );

    //PRINT( "shut down mode sleep\n" );

    GPIOA_ModeCfg(GPIO_Pin_All,GPIO_ModeIN_Floating);

    RTC_TMRFunCfg(SEND_PERIOD);

    PFIC_EnableIRQ(RTC_IRQn);

    //PWR_UnitModCfg(DISABLE,0x1);

    PWR_PeriphWakeUpCfg( ENABLE, RB_SLP_RTC_WAKE, Edge_ShortDelay );

    DelayUs( 5 );

    LowPower_Shutdown( 0 );                          //全部断电,唤醒后复位


    while(1){

        __nop();__nop();

        SYS_ResetExecute();

    }


    return 0;

}


以上工程运行大概20分钟就死机,已经定义宏变量CLK_OSC32K 1,有一个奇怪的现象,如果官方开发板的调试串口输出接上串口线,那么运行了30多分钟都还没死机,如果没接大概20分钟就死机。


icon_rar.gif死机工程.zip

这个就是死机的工程,运行大概20来分钟RTC就再也无法唤醒


最新测试情况,RTC弄成时间点到期触发,而非定时触发,运行了2小时没死机


最新测试,把shutdown改成deepsleep,同时开启ram2K电源就不死机了,等会再试试deepsleep去掉所有电源只留核心电源跟RTC。

是否shutdown有问题?那么留RTC低功耗0.6UA就做不到了。


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