Parcourir la source

fix mcu reset when sleep(restart rtc when start alarm)

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui il y a 4 ans
Parent
commit
1c21ddaf92

+ 4 - 1
Application/app/iap.c

@@ -2,6 +2,7 @@
 #include "app/iap.h"
 #include "app/nv_storage.h"
 #include "bsp/fmc_flash.h"
+#include "bsp/shark_rtc.h"
 
 static int iap_write_image(uint8_t *data, int len);
 static int iap_check_image(uint8_t *data, int len);
@@ -20,6 +21,7 @@ void process_iap_message(can_frame_t *frame, int len){
 			if (gd32_flash_size() < 128 * 1024){
 				wdog_reload();
 				fmc_iap_write_magic(0xFFFFFFFF);
+				shark_rtc_set_backup(0x3000);
 				NVIC_SystemReset();
 				while(1);
 			}
@@ -63,11 +65,12 @@ void process_iap_message(can_frame_t *frame, int len){
 			if (len == 4 && shark_decode_u32(frame->data) == SHARK_IAP_MAGIC_SUCCESS) {
 				fmc_iap_write_magic(0xFFFFFFFF);
 			}
-
+			shark_rtc_set_backup(0x3003);
 			shark_timer_post(&_reboot_timer, 100);
 			protocol_send_ack(frame->head.can_addr, frame->key, 1);
 			break;
 		case CAN_KET_ERASE_NV:
+			shark_rtc_set_backup(0x3002);
 			nv_erase_soc(0);
 			nv_erase_soc(1);
 			shark_timer_post(&_reboot_timer, 100);

+ 3 - 1
Application/app/sox/health.c

@@ -79,7 +79,7 @@ void health_log(void){
 	health_debug("hard short:%d\n", error_counts.hard_current_short);
 	health_debug("work temp: %d\n", _health.is_work_temp_normal);
 	health_debug("aux_short: %d, %d\n", error_counts.aux_short, error_counts.aux_real_short);
-	health_debug("lower voltage: %d, %d\n", discharger_lower_cell_voltage, discharger_lower_voltage);
+	health_debug("lower voltage: %d, %d, %d, %d\n", discharger_lower_cell_voltage, discharger_lower_voltage, error_counts.cell_under_voltage, error_counts.pack_under_voltage);
 }
 
 bms_health_t *bms_health(){
@@ -249,6 +249,7 @@ void check_voltage_state(void) {
 		if ((bms_state_get()->cell_min_vol <= min_discharger_cell_vol[_health.is_work_temp_normal])){
 			if (judge_debounce(!_health.sigle_cell_lower_voltage, &_sigle_cell_discharger_lower_vol)){
 				_health.sigle_cell_lower_voltage = 1;
+				error_counts.cell_under_voltage++;
 				discharger_lower_cell_voltage = bms_state_get()->cell_min_vol;
 			}
 		}else if ((bms_state_get()->cell_min_vol >= min_discharger_cell_recovery_vol[_health.is_work_temp_normal])){
@@ -260,6 +261,7 @@ void check_voltage_state(void) {
 		if (bms_state_get()->pack_voltage <= min_discharger_vol[_health.is_work_temp_normal]){
 			if (judge_debounce(!_health.discharger_lower_voltage, &_discharger_lower_voltage)){
 				_health.discharger_lower_voltage = 1;
+				error_counts.pack_under_voltage++;
 				discharger_lower_voltage = bms_state_get()->pack_voltage;
 			}
 		}else if (bms_state_get()->pack_voltage >= min_discharger_recovery_vol[_health.is_work_temp_normal]){

+ 2 - 0
Application/app/sox/health.h

@@ -56,6 +56,8 @@ typedef struct {
 	uint32_t hard_current_short;
 	uint32_t aux_short;
 	uint32_t aux_real_short;
+	uint32_t cell_under_voltage;
+	uint32_t pack_under_voltage;
 }error_counts_t;
 
 bms_health_t *bms_health(void);

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

@@ -100,7 +100,6 @@ void bms_set_ps_charger_in(uint16_t mask, uint16_t in){
 int bms_is_ps_charger_in(void){
 	return _bms_state.ps_charger_mask && _bms_state.ps_charger_in;
 }
-
 void bms_state_log(void){
 	state_debug("Life Time: %d\n", shark_get_seconds());
 	state_debug("Sleep Time: %ds\n", get_system_sleep_time());

+ 4 - 5
Application/bsp/bsp.c

@@ -99,15 +99,14 @@ void wdog_reload(void){
 #endif 
 }
 
-int  wdog_set_timeout(int timeout)
+int  wdog_set_timeout(int wdog_time)
 {  
 #if CONFIG_DEBUG == 0
 	uint32_t flag_status = RESET;
-
+	uint32_t timeout = FWDGT_RLD_TIMEOUT;
     /* 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;
@@ -117,7 +116,7 @@ int  wdog_set_timeout(int timeout)
         return -1;
     }
     
-    FWDGT_RLD = RLD_RLD(timeout*40000UL/256);
+    FWDGT_RLD = RLD_RLD(wdog_time*40000UL/256);
 
     /* reload the counter */
     FWDGT_CTL = FWDGT_KEY_RELOAD;

+ 5 - 0
Application/bsp/irqs.c

@@ -1,5 +1,6 @@
 #include "gd32f3x0.h"
 #include "nv_storage.h"
+#include "shark_rtc.h"
 extern void system_reboot(void);
 /*!
     \brief      this function handles NMI exception
@@ -20,6 +21,7 @@ void NMI_Handler(void)
 void HardFault_Handler(void){
     /* if Hard Fault exception occurs, go to infinite loop */
 	nv_save_all_soc();
+	shark_rtc_set_backup(0x2000);
     while (1){
 		system_reboot();
     }
@@ -35,6 +37,7 @@ void MemManage_Handler(void)
 {
     /* if Memory Manage exception occurs, go to infinite loop */
 	nv_save_all_soc();
+	shark_rtc_set_backup(0x2001);
     while (1){
 		system_reboot();
     }
@@ -50,6 +53,7 @@ void BusFault_Handler(void)
 {
     /* if Bus Fault exception occurs, go to infinite loop */
 	nv_save_all_soc();
+	shark_rtc_set_backup(0x2002);
     while (1){
 		system_reboot();
     }
@@ -65,6 +69,7 @@ void UsageFault_Handler(void)
 {
     /* if Usage Fault exception occurs, go to infinite loop */
 	nv_save_all_soc();
+	shark_rtc_set_backup(0x2003);
     while (1){
 		system_reboot();
     }

+ 0 - 1
Application/bsp/mcu_power_sleep.c

@@ -59,7 +59,6 @@ static void wait_dcdc_good(void) {
 	volatile uint32_t wait_cycle = 2000;
 	while(--wait_cycle > 0 && (!IS_DCDC_POWER_GOOD()));
 }
-
 static int pre_deepsleep(void){
 	LED_ALL_ON(0);
 	systick_close();

+ 11 - 1
Application/bsp/shark_rtc.c

@@ -3,6 +3,8 @@
 #include "shark_rtc.h"
 #include "bsp/mcu_power_sleep.h"
 
+static void _init_rtc_date(void);
+
 void shark_rtc_init(void){
 	/* enable PMU and BKPI clocks */
 	rcu_periph_clock_enable(RCU_PMU);
@@ -19,6 +21,10 @@ void shark_rtc_init(void){
 	
 	rtc_register_sync_wait();
 
+	_init_rtc_date();
+}
+
+static void _init_rtc_date(void){
 	rtc_deinit();
 
 	rtc_parameter_struct rtc_initpara;
@@ -27,7 +33,6 @@ void shark_rtc_init(void){
 	rtc_initpara.rtc_factor_syn = 399;
 	rtc_initpara.rtc_display_format = RTC_24HOUR;
 	rtc_initpara.rtc_am_pm = RTC_AM;
-	rtc_initpara.rtc_date = 1;
 	rtc_init(&rtc_initpara);
 }
 
@@ -41,6 +46,7 @@ uint8_t _int_to_bcd(uint8_t data){
 
 int shark_rtc_get_second(void){
 	rtc_parameter_struct rtc_time;
+	rtc_register_sync_wait();
 	rtc_current_time_get(&rtc_time);
 	return _bcd_to_int(rtc_time.rtc_second);
 }
@@ -49,6 +55,7 @@ int shark_rtc_get_second(void){
 static int set_rtc_alarm(uint32_t sencod){
 	rtc_parameter_struct rtc_initpara;
 
+	rtc_register_sync_wait();
 	rtc_current_time_get(&rtc_initpara);
 
 	rtc_alarm_struct rtc_alarm;
@@ -76,6 +83,9 @@ int shark_rtc_start_alarm(uint32_t second){
 	if (rtc_alarm_disable() != SUCCESS){
 		return -1;
 	}
+
+	_init_rtc_date();
+	
 	set_rtc_alarm(second);
 	rtc_interrupt_enable(RTC_INT_ALARM);
 	rtc_alarm_enable();