Parcourir la source

add backup reg to record sleep step to debug reset

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui il y a 5 ans
Parent
commit
53f3bda96e

+ 2 - 1
Application/app/sox/state.c

@@ -19,7 +19,7 @@
 #define ALLOW_5238_BALANCE 1
 #define IGNORE_DISCHARGER_LOW_VOL 0 //ºöÂԷŵçǷѹ
 extern uint32_t bsp_get_rst_reson(void);
-
+extern uint32_t bsp_get_backup(void);
 static void _current_notify(void);
 static void _voltage_notify(void);
 static void _temperature_notify(void);
@@ -108,6 +108,7 @@ void bms_state_log(void){
 	state_debug("ps charger mask:in %d, %d\n", _bms_state.ps_charger_mask, _bms_state.ps_charger_in);
 	state_debug("open dfet %d - %d - %d - %d\n", open_dfet, open_dfet_failt, close_dfet_reson, close_dfet_no_hall);
 	state_debug("Reset Reson 0x%x\n", bsp_get_rst_reson());
+	state_debug("BackUp value 0x%x\n", bsp_get_backup());
 #if 0
 	state_debug("Charging: %d\n", _bms_state.charging);
 	state_debug("WorkMode %d\n", _bms_state.work_mode);

+ 22 - 2
Application/bsp/bsp.c

@@ -25,9 +25,11 @@ extern void gpio_key_init(void);
 #define CONFIG_DEBUG 0
 #endif
 static uint32_t reset_source = 0;
+static uint32_t backup_reg = 0;
 //all board's low level init is here
 void bsp_init(void){
 	reset_source = RCU_RSTSCK;
+	backup_reg = RTC_BKP0;
 	wdog_start(4);
 	shark_rtc_init();
 	enable_mcu_power();
@@ -43,12 +45,17 @@ void bsp_init(void){
 	AT24CXX_Init();
 	AUX_VOL_OPEN(0);
 	gpio_key_init();
+	RTC_BKP0 = 0;
 }
 
 uint32_t bsp_get_rst_reson(void){
 	return reset_source;
 }
 
+uint32_t bsp_get_backup(void){
+	return backup_reg;
+}
+
 void systick_close(void)
 {
 	SysTick->CTRL  &= ~SysTick_CTRL_ENABLE_Msk;
@@ -92,17 +99,30 @@ void wdog_reload(void){
 #endif 
 }
 
-void  wdog_set_timeout(int timeout)
+int  wdog_set_timeout(int timeout)
 {  
 #if CONFIG_DEBUG == 0
+	uint32_t flag_status = RESET;
+
     /* enable write access to FWDGT_PSC,and FWDGT_RLD */
     FWDGT_CTL = FWDGT_WRITEACCESS_ENABLE;
 
+    timeout = FWDGT_RLD_TIMEOUT;    
+    /* wait until the RUD flag to be reset */
+    do{
+        flag_status = FWDGT_STAT & FWDGT_STAT_RUD;
+    }while((--timeout > 0U) && (RESET != flag_status));
+   
+    if (RESET != flag_status){
+        return -1;
+    }
+    
     FWDGT_RLD = RLD_RLD(timeout*40000UL/256);
 
     /* reload the counter */
     FWDGT_CTL = FWDGT_KEY_RELOAD;
-#endif	
+#endif
+	return 0;
 }
 
 

+ 25 - 1
Application/bsp/mcu_power_sleep.c

@@ -63,11 +63,13 @@ static void wait_dcdc_good(void) {
 static int pre_deepsleep(void){
 	LED_ALL_ON(0);
 	systick_close();
+	shark_rtc_set_backup(0xF0);
 	shark_uart_deinit(SHARK_UART0);
 #if (CONFIG_BOARD_TYPE==SHARK_BOARD_SP700)
 	shark_uart_deinit(SHARK_UART1);
 #endif
 	wdog_reload();
+	shark_rtc_set_backup(0xF1);
 	ml5238_power_save(1); //call, before spi0_deinit
 	cs1180_adc_shutdown();
 	AT24CXX_DeInit();
@@ -76,6 +78,7 @@ static int pre_deepsleep(void){
 		AUX_VOL_OPEN(0);//we should close small power, before dcdc close
 		delay_us(1000);
 	}
+	shark_rtc_set_backup(0xF2);
 	wdog_reload();
 	io_state()->aux_lock_detect = 0;
 	DCDC_VOL_OPEN(0);
@@ -83,39 +86,53 @@ static int pre_deepsleep(void){
 	AUX_VOL_OPEN(1);
 	delay_us(5000); //give 5s to detect if the small current is short
 	if (io_state()->aux_lock_detect){
+		shark_rtc_set_backup(0xF3);
 		post_deepsleep();
 		return -1;
 	}
-	wdog_set_timeout(WDOG_TIME_FOR_SLEEP);
+	shark_rtc_set_backup(0xF4);
+	if (wdog_set_timeout(WDOG_TIME_FOR_SLEEP) < 0){
+		post_deepsleep();
+		return -1;		
+	}
+	shark_rtc_set_backup(0xF5);
 	wait_for_enter_dsleep();
+	shark_rtc_set_backup(0xF6);
 	if (_is_wakeup_source()) {
 		_wakeup_source = 0;
 		post_deepsleep();
 		return -1;
 	}
+	shark_rtc_set_backup(0xF7);
 	return 0;
 }
 
 static void post_deepsleep(void){
+	shark_rtc_set_backup(0xF8);
 	DCDC_VOL_OPEN(1);
 	AUX_VOL_OPEN(0);//must close small power, cs1180 cali need small power close
 	wait_dcdc_good();
+	shark_rtc_set_backup(0xF9);
 	SystemInit();
 	system_clock_config();
 	SystemCoreClockUpdate();
 	ml5238_power_save(0);
 	gd32_adc_init();
 	cs1180_adc_init();
+	shark_rtc_set_backup(0xFA);
 	shark_uart_init(SHARK_UART0);
 #if (CONFIG_BOARD_TYPE==SHARK_BOARD_SP700)	
 	shark_uart_init(SHARK_UART1);
 #endif
 	AT24CXX_Init();
+	shark_rtc_set_backup(0xFB);
 	wdog_set_timeout(4);
+	shark_rtc_set_backup(0xFC);
 	current_calibrate();
 	wdog_reload();
 	systick_open();
 	AUX_VOL_OPEN(1);
+	shark_rtc_set_backup(0xFD);
 }
 
 void mcu_enter_deepsleep(void){
@@ -129,9 +146,11 @@ void mcu_enter_deepsleep(void){
 		post_deepsleep();
 		return;
 	}
+	shark_rtc_set_backup(0xFF0);
 	do {
 		u32 start_time = shark_rtc_get_second();
 		pmu_to_deepsleepmode(PMU_LDO_LOWPOWER, WFI_CMD);
+		shark_rtc_set_backup(0xFF1);
 		u32 end_time = shark_rtc_get_second();
 		if (end_time >= start_time) {
 			_sleep_second_time_now += end_time - start_time;
@@ -140,17 +159,22 @@ void mcu_enter_deepsleep(void){
 		}
 		if (_wakeup_source & WAKEUP_SOURCE_RTC) {
 			wdog_reload();
+			shark_rtc_set_backup(0xFF2);
 			while (shark_rtc_start_alarm(RTC_ALARM_FOR_SLEEP) < 0){
 				wdog_reload();
+				shark_rtc_set_backup(0xFF3);
 				if (_is_wakeup_source() || (_sleep_second_time_now >= (60))){
 					break;
 				}
 			}
+			shark_rtc_set_backup(0xFF4);
 			wait_for_enter_dsleep();
+			shark_rtc_set_backup(0xFF5);
 		}
 	}while(!_is_wakeup_source() && (_sleep_second_time_now < (60)));
 	_sleep_second_time += _sleep_second_time_now;
 	disable_wakeup_irq();
+	shark_rtc_set_backup(0xFF6);
 	post_deepsleep();
 }
 

+ 1 - 1
Application/bsp/shark_bsp.h

@@ -57,7 +57,7 @@
 void bsp_init(void);
 void wdog_start(int timeout);
 void wdog_reload(void);
-void  wdog_set_timeout(int timeout);
+int  wdog_set_timeout(int timeout);
 void systick_close(void);
 void systick_open(void);
 

+ 8 - 0
Application/bsp/shark_rtc.c

@@ -85,6 +85,14 @@ int shark_rtc_start_alarm(uint32_t second){
 }
 
 
+void shark_rtc_set_backup(uint32_t v) {
+	RTC_BKP0 = v;
+}
+
+uint32_t shark_rtc_get_backup(void){
+	return RTC_BKP0;
+}
+
 void shark_rtc_stop_alarm(void){
 	rtc_alarm_disable();
 	rtc_flag_clear(RTC_STAT_ALRM0F);

+ 8 - 7
Application/bsp/shark_rtc.h

@@ -5,12 +5,13 @@
 #ifndef _Shark_Rtc_h__
 #define _Shark_Rtc_h__
 
-
-extern void shark_rtc_init(void);
-extern int shark_rtc_start_alarm(uint32_t sencod);
-extern void shark_update_alarm(uint32_t sencod);
-extern void shark_rtc_stop_alarm(void);
-extern int shark_rtc_get_second(void);
-extern int shark_rtc_update_alarm(uint32_t sencod);
+void shark_rtc_init(void);
+int shark_rtc_start_alarm(uint32_t sencod);
+void shark_update_alarm(uint32_t sencod);
+void shark_rtc_stop_alarm(void);
+int shark_rtc_get_second(void);
+int shark_rtc_update_alarm(uint32_t sencod);
+void shark_rtc_set_backup(uint32_t v);
+uint32_t shark_rtc_get_backup(void);
 
 #endif /* _Shark_Rtc_h__ */