#include "mcu_power_sleep.h" #include "bsp/ml5238.h" #include "bsp/cs1180.h" #include "bsp/gpio.h" #include "bsp/spi.h" #include "bsp/uart.h" #include "bsp/i2c.h" extern void system_clock_24m_irc8m(void); extern void system_clock_config(void); static void enable_wakeup_irq(void){ charger_detect_irq_enable(1); hall_1_detect_irq_enable(1); hall_2_detect_irq_enable(1); } static void disable_wakeup_irq(void){ charger_detect_irq_enable(0); hall_1_detect_irq_enable(0); hall_2_detect_irq_enable(0); } static void pre_deepsleep(void){ #if (CONFIG_BOARD_TYPE==SHARK_BOARD_SP700) UART0_IR_EN(0); UART1_IR_EN(0); #elif (CONFIG_BOARD_TYPE==SHARK_BOARD_SP600) RS485_PWR_ENABLE(0); #endif CS1180_PWR_ENABLE(0); shark_uart_deinit(SHARK_UART0); shark_uart_deinit(SHARK_UART1); //gd32_i2c_deinit(); UART0_IR_EN(0); UART0_IR_EN(0); ml5238_power_save(1); //call, before spi0_deinit spi0_deinit(); spi1_deinit(); gd32_i2c_deinit(0); system_clock_24m_irc8m();//before dcdc off, should set clock to 24M, avoid ml5238's supply is not enough DCDC_VOL_OPEN(0); wdog_start(10); } static void post_deepsleep(void){ DCDC_VOL_OPEN(1); SystemInit(); system_clock_config(); spi0_init(); ml5238_power_save(0); CS1180_PWR_ENABLE(1); cs1180_adc_init(); #if (CONFIG_BOARD_TYPE==SHARK_BOARD_SP700) UART0_IR_EN(1); UART1_IR_EN(1); #elif (CONFIG_BOARD_TYPE==SHARK_BOARD_SP600) RS485_PWR_ENABLE(1); #endif shark_uart_init(SHARK_UART0); shark_uart_init(SHARK_UART1); gd32_i2c_init(0, 100* 1000); wdog_start(4); } void mcu_enter_deepsleep(void){ pre_deepsleep(); enable_wakeup_irq(); pmu_to_deepsleepmode(PMU_LDO_LOWPOWER, WFI_CMD); disable_wakeup_irq(); post_deepsleep(); }