Demonstrate non-exclusive sleep

This commit is contained in:
William Vinnicombe 2025-08-22 17:49:54 +01:00
parent 50069f06aa
commit d9cf06ba33
2 changed files with 44 additions and 7 deletions

View file

@ -18,9 +18,9 @@
bool repeater(repeating_timer_t *timer) {
if (aon_timer_is_running()) {
printf(" Repeating timer at %dms (aon: %dms)\n", to_ms_since_boot(get_absolute_time()), to_ms_since_boot(aon_timer_get_absolute_time()));
printf(" Repeating timer %d at %dms (aon: %dms)\n", *(uint32_t*)timer->user_data, to_ms_since_boot(get_absolute_time()), to_ms_since_boot(aon_timer_get_absolute_time()));
} else {
printf(" Repeating timer at %dms (aon: not running)\n", to_ms_since_boot(get_absolute_time()));
printf(" Repeating timer %d at %dms (aon: not running)\n", *(uint32_t*)timer->user_data, to_ms_since_boot(get_absolute_time()));
}
status_led_set_state(!status_led_get_state());
return true;
@ -56,24 +56,32 @@ int main() {
stdio_init_all();
status_led_init();
printf("Hello Sleep!\n");
// use a repeating timer on the same TIMER instance; it should be disabled
// during exclusive sleep (todo not sure how it affects power!)
repeating_timer_t repeat;
uint32_t repeater_id = 0;
add_repeating_timer_ms(500, repeater, &repeater_id, &repeat);
#if !PICO_RP2040
// use a second repeating timer on the other TIMER instance; it should be gated
// during our sleep (todo not sure how it affects power!)
alarm_pool_t *alarm_pool = alarm_pool_create_on_timer_with_unused_hardware_alarm(timer1_hw, 4);
repeating_timer_t repeat;
alarm_pool_add_repeating_timer_ms(alarm_pool, 500, repeater, NULL, &repeat);
repeating_timer_t repeat2;
uint32_t repeater2_id = 1;
alarm_pool_add_repeating_timer_ms(alarm_pool, 500, repeater, &repeater2_id, &repeat2);
if (came_from_pstate) {
printf("Came from powerup %s with (%s) memory kept on - skipping to end\n", powman_last_pwrup, powman_last_pstate);
goto post_pstate_timer;
}
printf("Waiting %d seconds\n", SLEEP_TIME_S); // so we can see some repeat printfs
busy_wait_ms(SLEEP_TIME_MS);
pstate_bitset_t pstate;
#endif
printf("Waiting %d seconds\n", SLEEP_TIME_S); // so we can see some repeat printfs
busy_wait_ms(SLEEP_TIME_MS);
absolute_time_t start_time;
absolute_time_t wakeup_time;
int64_t diff;
@ -94,6 +102,20 @@ int main() {
printf("Doing %d second pause to prove timer running\n", SLEEP_TIME_S);
busy_wait_ms(SLEEP_TIME_MS);
printf("Going to non-exclusive sleep for %d seconds via TIMER\n", SLEEP_TIME_S);
start_time = get_absolute_time();
wakeup_time = delayed_by_ms(start_time, SLEEP_TIME_MS);
low_power_sleep_until_timer(timer_hw, wakeup_time, NULL, false);
diff = absolute_time_diff_us(wakeup_time, get_absolute_time());
printf("Woken up now @%dus since target\n", (int)diff);
if (diff < 0) {
printf("ERROR: Woke up too soon\n");
return -1;
}
printf("Doing %d second pause to prove timer running\n", SLEEP_TIME_S);
busy_wait_ms(SLEEP_TIME_MS);
printf("Going DORMANT for %d seconds via AON TIMER\n", SLEEP_TIME_S);
// todo, ah; we should start the aon timer; still have to decide what to do about keeping them in sync

View file

@ -81,6 +81,21 @@ int main() {
printf("Doing %d second pause to prove timer running\n", SLEEP_TIME_S);
busy_wait_ms(SLEEP_TIME_MS);
printf("Going to non-exclusive sleep until GPIO wakeup\n");
// need to keep the timer running
clock_dest_set_t keep_enabled = clock_dest_set_none();
#if PICO_RP2040
clock_dest_set_add(&keep_enabled, CLK_DEST_SYS_TIMER);
#else
clock_dest_set_add(&keep_enabled, CLK_DEST_SYS_TIMER0);
clock_dest_set_add(&keep_enabled, CLK_DEST_REF_TICKS);
#endif
low_power_sleep_until_pin_state(PICO_DEFAULT_UART_RX_PIN, true, false, &keep_enabled, false);
printf("Doing %d second pause to prove timer running\n", SLEEP_TIME_S);
busy_wait_ms(SLEEP_TIME_MS);
// todo, ah; we should start the aon timer; still have to decide what to do about keeping them in sync
start_time = get_absolute_time();
us_to_timespec(start_time, &ts);