Hi,
It seems to be a bug in hal_device_reset() when using S132.
void hal_device_reset(uint8_t gpregret_value)
{
#if defined(SOFTDEVICE_PRESENT)
(void) sd_power_reset_reason_clr(RESET_REASON_MASK); /* avoid wrongful state-readout on reboot */
#if defined(S130) || defined(S110)
(void) sd_power_gpregret_set(gpregret_value);
#elif defined(S132)
(void) sd_power_gpregret_set(gpregret_value, RESET_REASON_MASK);
#endif
(void) sd_nvic_SystemReset();
#else
NRF_POWER->RESETREAS = RESET_REASON_MASK; /* avoid wrongful state-readout on reboot */
NRF_POWER->GPREGRET = gpregret_value;
NVIC_SystemReset();
#endif
NRF_MESH_ASSERT(false);
}
On line 8 above the function sd_power_gpregret_set() is called with the wrong arguments. The first arguments should be either 0 or 1 to select between GPREGRET and GPREGRET2, the second argument should be the bits to set.
So instead of setting GPREGRET to gpregret_value, either one of the two registers or none at all is set to RESET_REASON_MASK (0xFFFFFFFF).
This bug seem to exist in v3.0.0 back to v1.0.0.
Changing line 8 to (void) sd_power_gpregret_set(0, gpregret_value); solves the problem and the correct value is written to the register.
Thanks.