4646#include "spi.h"
4747#include "wdt.h"
4848
49+ #if defined(MCU_SERIES_F4 )
50+ // the HAL does not define these constants
51+ #define RCC_CSR_IWDGRSTF (0x20000000)
52+ #define RCC_CSR_PINRSTF (0x04000000)
53+ #elif defined(MCU_SERIES_L4 )
54+ // L4 does not have a POR, so use BOR instead
55+ #define RCC_CSR_PORRSTF RCC_CSR_BORRSTF
56+ #endif
57+
58+ #define PYB_RESET_SOFT (0)
59+ #define PYB_RESET_POWER_ON (1)
60+ #define PYB_RESET_HARD (2)
61+ #define PYB_RESET_WDT (3)
62+ #define PYB_RESET_DEEPSLEEP (4)
63+
64+ STATIC uint32_t reset_cause ;
65+
66+ void machine_init (void ) {
67+ #if defined(MCU_SERIES_F4 )
68+ if (PWR -> CSR & PWR_CSR_SBF ) {
69+ // came out of standby
70+ reset_cause = PYB_RESET_DEEPSLEEP ;
71+ PWR -> CR = PWR_CR_CSBF ;
72+ } else
73+ #endif
74+ {
75+ // get reset cause from RCC flags
76+ uint32_t state = RCC -> CSR ;
77+ if (state & RCC_CSR_IWDGRSTF || state & RCC_CSR_WWDGRSTF ) {
78+ reset_cause = PYB_RESET_WDT ;
79+ } else if (state & RCC_CSR_PORRSTF || state & RCC_CSR_BORRSTF ) {
80+ reset_cause = PYB_RESET_POWER_ON ;
81+ } else if (state & RCC_CSR_PINRSTF ) {
82+ reset_cause = PYB_RESET_HARD ;
83+ } else {
84+ // default is soft reset
85+ reset_cause = PYB_RESET_SOFT ;
86+ }
87+ }
88+ // clear RCC reset flags
89+ RCC -> CSR = RCC_CSR_RMVF ;
90+ }
91+
4992// machine.info([dump_alloc_table])
5093// Print out lots of information about the board.
5194STATIC mp_obj_t machine_info (mp_uint_t n_args , const mp_obj_t * args ) {
@@ -448,13 +491,10 @@ STATIC mp_obj_t machine_deepsleep(void) {
448491}
449492MP_DEFINE_CONST_FUN_OBJ_0 (machine_deepsleep_obj , machine_deepsleep );
450493
451- #if 0
452494STATIC mp_obj_t machine_reset_cause (void ) {
453- return mp_obj_new_int (0 );
454- //return mp_obj_new_int(pyb_sleep_get_reset_cause());
495+ return MP_OBJ_NEW_SMALL_INT (reset_cause );
455496}
456497STATIC MP_DEFINE_CONST_FUN_OBJ_0 (machine_reset_cause_obj , machine_reset_cause );
457- #endif
458498
459499STATIC const mp_map_elem_t machine_module_globals_table [] = {
460500 { MP_OBJ_NEW_QSTR (MP_QSTR___name__ ), MP_OBJ_NEW_QSTR (MP_QSTR_umachine ) },
@@ -469,8 +509,8 @@ STATIC const mp_map_elem_t machine_module_globals_table[] = {
469509 { MP_OBJ_NEW_QSTR (MP_QSTR_idle ), (mp_obj_t )& pyb_wfi_obj },
470510 { MP_OBJ_NEW_QSTR (MP_QSTR_sleep ), (mp_obj_t )& machine_sleep_obj },
471511 { MP_OBJ_NEW_QSTR (MP_QSTR_deepsleep ), (mp_obj_t )& machine_deepsleep_obj },
472- #if 0
473512 { MP_OBJ_NEW_QSTR (MP_QSTR_reset_cause ), (mp_obj_t )& machine_reset_cause_obj },
513+ #if 0
474514 { MP_OBJ_NEW_QSTR (MP_QSTR_wake_reason ), (mp_obj_t )& machine_wake_reason_obj },
475515#endif
476516
@@ -502,11 +542,13 @@ STATIC const mp_map_elem_t machine_module_globals_table[] = {
502542 { MP_OBJ_NEW_QSTR (MP_QSTR_IDLE ), MP_OBJ_NEW_SMALL_INT (PYB_PWR_MODE_ACTIVE ) },
503543 { MP_OBJ_NEW_QSTR (MP_QSTR_SLEEP ), MP_OBJ_NEW_SMALL_INT (PYB_PWR_MODE_LPDS ) },
504544 { MP_OBJ_NEW_QSTR (MP_QSTR_DEEPSLEEP ), MP_OBJ_NEW_SMALL_INT (PYB_PWR_MODE_HIBERNATE ) },
505- { MP_OBJ_NEW_QSTR (MP_QSTR_POWER_ON ), MP_OBJ_NEW_SMALL_INT (PYB_SLP_PWRON_RESET ) },
506- { MP_OBJ_NEW_QSTR (MP_QSTR_HARD_RESET ), MP_OBJ_NEW_SMALL_INT (PYB_SLP_HARD_RESET ) },
507- { MP_OBJ_NEW_QSTR (MP_QSTR_WDT_RESET ), MP_OBJ_NEW_SMALL_INT (PYB_SLP_WDT_RESET ) },
508- { MP_OBJ_NEW_QSTR (MP_QSTR_DEEPSLEEP_RESET ), MP_OBJ_NEW_SMALL_INT (PYB_SLP_HIB_RESET ) },
509- { MP_OBJ_NEW_QSTR (MP_QSTR_SOFT_RESET ), MP_OBJ_NEW_SMALL_INT (PYB_SLP_SOFT_RESET ) },
545+ #endif
546+ { MP_OBJ_NEW_QSTR (MP_QSTR_POWER_ON ), MP_OBJ_NEW_SMALL_INT (PYB_RESET_POWER_ON ) },
547+ { MP_OBJ_NEW_QSTR (MP_QSTR_HARD_RESET ), MP_OBJ_NEW_SMALL_INT (PYB_RESET_HARD ) },
548+ { MP_OBJ_NEW_QSTR (MP_QSTR_WDT_RESET ), MP_OBJ_NEW_SMALL_INT (PYB_RESET_WDT ) },
549+ { MP_OBJ_NEW_QSTR (MP_QSTR_DEEPSLEEP_RESET ), MP_OBJ_NEW_SMALL_INT (PYB_RESET_DEEPSLEEP ) },
550+ { MP_OBJ_NEW_QSTR (MP_QSTR_SOFT_RESET ), MP_OBJ_NEW_SMALL_INT (PYB_RESET_SOFT ) },
551+ #if 0
510552 { MP_OBJ_NEW_QSTR (MP_QSTR_WLAN_WAKE ), MP_OBJ_NEW_SMALL_INT (PYB_SLP_WAKED_BY_WLAN ) },
511553 { MP_OBJ_NEW_QSTR (MP_QSTR_PIN_WAKE ), MP_OBJ_NEW_SMALL_INT (PYB_SLP_WAKED_BY_GPIO ) },
512554 { MP_OBJ_NEW_QSTR (MP_QSTR_RTC_WAKE ), MP_OBJ_NEW_SMALL_INT (PYB_SLP_WAKED_BY_RTC ) },
0 commit comments