Dans vos conditions temporelles de changement d'état (ou autres) il faut comparer des intervalles et non des temps absolus. Il faut aussi que vos temps soient comptés par des unsigned.
uint32_t t1=get_time_ms()
...
...
...
uint32_t t2=get_time_ms()
If ( t2 > t1 + zzz) peut retourner un résultat erroné s'il y a eu un rollover du timer
If ( t2-t1 > 800) retournera tjs un bon résultat (tant qu'il ny a pas eu 2 rollovers du timer)
Et comme la nucleo sera tjs alimentée (et pour le moment elle n'est pas mise en sommeil) , les risques de rollover ne sont pas à exclure