#include #include #include #include "shell_commands.h" #include "stm32l1xx.h" #include "main_logic.h" #include "stm32l_rtc.h" #include "stats.h" static const ShellConfig shellconfig = { (BaseSequentialStream*)&SD1, shell_commands }; static WORKING_AREA(shellstack, 512); int main() { SYSCFG->PMC = 0; halInit(); chSysInit(); #if ENABLE_DEBUG DBGMCU->CR |= DBGMCU_CR_DBG_SLEEP | DBGMCU_CR_DBG_STOP; #endif DBGMCU->APB1FZ = 0xFFFFFFFF; DBGMCU->APB2FZ = 0xFFFFFFFF; // Enable watchdog IWDG->KR = 0x5555; // Enable watchdog register write IWDG->PR = 6; IWDG->RLR = 4095; // 30 seconds IWDG->KR = 0xCCCC; // Start watchdog stats_load(); stats_add_reboot(); stats_save(); sdStart(&SD1, NULL); shellInit(); shellCreateStatic(&shellconfig, shellstack, sizeof(shellstack), NORMALPRIO); while (1) { int sleep_time = main_logic_step(); if (sleep_time) { if (palReadPad(GPIOA, GPIOA_RX)) { // Shell is connected, keep it active. chThdSleepMilliseconds(sleep_time); // Processor uses about 120µA when waiting without sleep stats_add_power(120, sleep_time); } else { // Go to deep sleep mode for given number of seconds. rtc_sleep(sleep_time); // RTC uses 2µA in stop mode. stats_add_power(2, sleep_time); } } } }