You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This is just an observation, I'm not looking for it to be fixed...
On OpenLog_Artemis, using v1.2 of the core, we could use millis to tell how long the Artemis had been awake since the last SLEEP_DEEP because millis was reset to zero at each sleep. In v2.1, that is no longer true...
Using the code below on a RedBoard Artemis ATP, here's what you get using v1.2 of the core:
millis gets reset to zero at each SLEEP_DEEP.
Here's what we get using v2.1:
Note how millis:
does not get reset to zero
increments after 2-4 cycles
when it does increment, it increments by 1431656 milliseconds - even though the sleep was only ~1 second!
Recommendation: don't trust millis after a SLEEP_DEEP !
Cheers,
Paul
Code to reproduce:
extern "C" void am_stimer_cmpr6_isr(void)
{
uint32_t ui32Status = am_hal_stimer_int_status_get(false);
if (ui32Status & AM_HAL_STIMER_INT_COMPAREG)
{
am_hal_stimer_int_clear(AM_HAL_STIMER_INT_COMPAREG);
}
}
void setup() {
Serial.begin(115200);
Serial.println(F("Apollo3: millis after deep sleep test"));
Serial.flush();
}
void loop() {
//We use counter/timer 6 to cause us to wake up from sleep but 0 to 7 are available
//CT 7 is used for Software Serial. All CTs are used for Servo.
am_hal_stimer_int_clear(AM_HAL_STIMER_INT_COMPAREG); //Clear CT6
am_hal_stimer_int_enable(AM_HAL_STIMER_INT_COMPAREG); //Enable C/T G=6
//Use the lower power 32kHz clock. Use it to run CT6 as well.
am_hal_stimer_config(AM_HAL_STIMER_CFG_CLEAR | AM_HAL_STIMER_CFG_FREEZE);
am_hal_stimer_config(AM_HAL_STIMER_XTAL_32KHZ | AM_HAL_STIMER_CFG_COMPARE_G_ENABLE);
//Setup interrupt to trigger when the number of ms have elapsed
am_hal_stimer_compare_delta_set(6, 32768); // Sleep for 32768 clock ticks = 1 second at 32768Hz
//Power down cache, flash, SRAM
am_hal_pwrctrl_memory_deepsleep_powerdown(AM_HAL_PWRCTRL_MEM_ALL); // Power down all flash and cache
am_hal_pwrctrl_memory_deepsleep_retain(AM_HAL_PWRCTRL_MEM_SRAM_384K); // Retain all SRAM
//Enable the timer interrupt in the NVIC.
NVIC_EnableIRQ(STIMER_CMPR6_IRQn);
//Deep Sleep
am_hal_sysctrl_sleep(AM_HAL_SYSCTRL_SLEEP_DEEP);
//Turn off interrupt
NVIC_DisableIRQ(STIMER_CMPR6_IRQn);
am_hal_stimer_int_disable(AM_HAL_STIMER_INT_COMPAREG); //Disable C/T G=6
// Power up SRAM, turn on entire Flash
am_hal_pwrctrl_memory_deepsleep_powerdown(AM_HAL_PWRCTRL_MEM_MAX);
//Go back to using the main clock
am_hal_stimer_config(AM_HAL_STIMER_CFG_CLEAR | AM_HAL_STIMER_CFG_FREEZE);
am_hal_stimer_config(AM_HAL_STIMER_HFRC_3MHZ);
Serial.print(F("Millis: "));
Serial.println(millis());
Serial.flush();
}
The text was updated successfully, but these errors were encountered:
This is just an observation, I'm not looking for it to be fixed...
On OpenLog_Artemis, using v1.2 of the core, we could use millis to tell how long the Artemis had been awake since the last SLEEP_DEEP because millis was reset to zero at each sleep. In v2.1, that is no longer true...
Using the code below on a RedBoard Artemis ATP, here's what you get using v1.2 of the core:
millis gets reset to zero at each SLEEP_DEEP.
Here's what we get using v2.1:
Note how millis:
Recommendation: don't trust millis after a SLEEP_DEEP !
Cheers,
Paul
Code to reproduce:
The text was updated successfully, but these errors were encountered: