kopia lustrzana https://github.com/SP8EBC/ParaTNC
134 wiersze
7.2 KiB
C
134 wiersze
7.2 KiB
C
/*
|
|
* pwr_save.h
|
|
*
|
|
* Created on: Aug 22, 2021
|
|
* Author: mateusz
|
|
*/
|
|
|
|
#ifndef PWR_SAVE_H_
|
|
#define PWR_SAVE_H_
|
|
|
|
#include "station_config_target_hw.h"
|
|
|
|
/**
|
|
* This header file defines all functions related to powersaving, switching between different power states,
|
|
* stopping cpu core etc. Generally they are few power states as below
|
|
*
|
|
* /-------------------------------------------------------------------------\
|
|
* | State | CPU | +5V_S | +7V5_R and VBATT_SW_R | +4V_G | +5V_C |
|
|
* | | | VBATT_SW_S | | | |
|
|
* =-------------------------------------------------------------------------=
|
|
* | C0 |Running| ON | ON | ON | ON |
|
|
* | C1 |Running| ON | ON | OFF | ON |
|
|
* | C2 |Running| OFF | ON | OFF | ON |
|
|
* | C3 |Running| OFF | ON | ON | ON |
|
|
* | M4 |Running| ON | OFF | OFF | OFF |
|
|
* | M4a |Running| ON | OFF | ON | OFF |
|
|
* | I5 |Running| OFF | OFF | OFF | OFF |
|
|
* | L6 | Stop2 | OFF | OFF | ON | OFF |
|
|
* | L7 | Stop2 | OFF | OFF | OFF | OFF |
|
|
* \-------------------------------------------------------------------------/
|
|
*
|
|
* C = modes with communication enabled
|
|
* M = mode with measuremenet only w/o any communication
|
|
* I = idle / initialization mode with anything disabled
|
|
* L = low power consumption modes with CPU halted in STOP2 mode
|
|
*
|
|
* What is supplied by which voltage
|
|
* +3V3_C - Microcontroller and UART-RS232 converter. It is always present
|
|
* +4V_G - GSM module
|
|
* +5V_C and +3V3_CC derived from it - LMV358 op amp, microSD Cards, PT100 interface
|
|
* +5V_S and +3V3_S derived from it - Wind sensor, one wire thermometer, RS485
|
|
* +7V5_R - external VHF radio
|
|
*
|
|
*
|
|
* Stop2 mode is a power saving mode defined in STM paperwork (DM0083560
|
|
* aka Reference Manual RM0351). This mode halts CPU core completely and
|
|
* disable HCLK, AHB1 & AHB2 buses, but preserves StaticRAM and registers
|
|
* content. 32k-LSE and RTC works normally and wakeups the core every
|
|
* programmed amount of seconds.
|
|
*
|
|
* C0 - Mode with everything avaliable. Used when station shall works
|
|
* as APRS digi / igate and is (probably) powered from mains instead
|
|
* of PV
|
|
*
|
|
* C1 - Mode with everything except GPRS modem is powered. This is
|
|
* default mode when station is powered from PV and works as DIGI.
|
|
* Digi required constant participation in radio channel traffic
|
|
* so VHF radio must operates constantly.
|
|
*
|
|
* C2 - Simmilar to C1 but with all meteo sensors disabled. This helps
|
|
* save some mA of current drain (but presumably radio will consume more
|
|
* than sensors)
|
|
*
|
|
* M4 - Measurement only mode when only meteo sensors are enabled
|
|
*
|
|
* I5 - Idle / initialization mode when only micro is operating normally but
|
|
* all aux voltages are turned off. This is mode CPU starts after poweron/reset
|
|
* and wakes up from Stop2
|
|
*
|
|
* L6 - This is Low power STOP2 mode with GSM radio kept in standby mode. +4V_G
|
|
* is powered on but GSM radio is left in most power efficient mode available.
|
|
* This is used when WX packet interval is shorter than 5 minutes. In such case
|
|
* GSM modem reinitialization and tuning & logging into network will consume more
|
|
* power than keeping modem on standby.
|
|
*
|
|
* L7 - Deep sleep mode with everything powered off and CPU kept in STOP2 mode.
|
|
*
|
|
*
|
|
*
|
|
* Transitions between states depends on configuration and value of config_data_powersave_mode_t.
|
|
* If 'powersave_keep_gsm_always_enabled' is set to one, the controller will swtich to modem M4a instead of M4
|
|
*
|
|
* ====================================================================================================================================|
|
|
* | Mode | Powersave Mode | |
|
|
* |=======================|===================|=======================================================================================|
|
|
* | DIGI | don't care | Always stays in C2 no matter of how config_data_powersave_mode_t is set |
|
|
* | DIGI + WX | PWSAVE_NONE | C1 |
|
|
* | DIGI + WX | PWSAVE_NORMAL | C2 --- (1 minute before WX frame)---> C1 -> C2 |
|
|
* | DIGI + WX | PWSAVE_AGGRESV | C2 --- (1 minute before WX frame)---> C1 -> C2 |
|
|
* | DIGI + WX + GSM | PWSAVE_NONE | C0 |
|
|
* | DIGI + WX + GSM | PWSAVE_NORMAL | C2 --- (1 minute before WX frame)---> C0 -> C2 ; if WX_INTERVAL >= 5 minutes |
|
|
* | DIGI + WX + GSM | PWSAVE_NORMAL | C3 --- (1 minute before WX frame)---> C0 -> C3 ; if WX_INTERVAL < 5 minutes |
|
|
* | DIGI + WX + GSM | PWSAVE_AGGRESV | C2 --- (1 minute before WX frame)---> C0 -> C2 ; no matter WX_INTERVAL |
|
|
* | WX + GSM | PWSAVE_NONE | C0 |
|
|
* | WX + GSM | PWSAVE_NORMAL | M4 --- (1 minute before WX frame)---> C0 -> M4 |
|
|
* | WX + GSM (only) | PWSAVE_AGGRESV | L6 --- (1 minute before WX frame)---> C0 -> L6 ; if WX_INTERVAL < 5 minutes |
|
|
* | WX + GSM (only) | PWSAVE_AGGRESV | L7 --- (1 minute before WX frame)---> M4 --- (30 sec before)---> C0 -> L7 |
|
|
* | WX | PWSAVE_NONE | M4 --- (2 minute before WX frame)---> C1 -> M4 |
|
|
* | WX | PWSAVE_NORMAL | L7 --- (2 minute before WX frame)---> C1 -> L7 |
|
|
* | WX | PWSAVE_AGGRESV | L7 --- (1 minute before WX frame)---> M4 --- (30 sec before)---> C1 -> L7 |
|
|
* ====================================================================================================================================|
|
|
*
|
|
*/
|
|
|
|
#include "config_data.h"
|
|
|
|
#define CURRENTLY_CUTOFF 0x1
|
|
#define CURRENTLY_VBATT_LOW 0x8
|
|
|
|
#if defined(STM32L471xx)
|
|
|
|
extern int8_t pwr_save_currently_cutoff;
|
|
|
|
void pwr_save_init(config_data_powersave_mode_t mode);
|
|
void pwr_save_enter_stop2(void);
|
|
void pwr_save_exit_from_stop2(void);
|
|
int pwr_save_switch_mode_to_c0(void);
|
|
int pwr_save_switch_mode_to_c1(void);
|
|
void pwr_save_switch_mode_to_c2(void);
|
|
void pwr_save_switch_mode_to_c3(void);
|
|
int pwr_save_switch_mode_to_m4(void);
|
|
int pwr_save_switch_mode_to_m4a(void);
|
|
void pwr_save_switch_mode_to_i5(void);
|
|
void pwr_save_switch_mode_to_l6(uint16_t sleep_time);
|
|
void pwr_save_switch_mode_to_l7(uint16_t sleep_time);
|
|
void pwr_save_pooling_handler(const config_data_mode_t * config, const config_data_basic_t * timers, int16_t minutes_to_wx, uint16_t vbatt); // this should be called from 10 seconds pooler
|
|
|
|
#endif
|
|
|
|
uint8_t pwr_save_get_inhibit_pwr_switch_periodic(void);
|
|
|
|
|
|
#endif /* PWR_SAVE_H_ */
|