Datasheet

Table Of Contents
65 }
66
67 // Write to setup registers
68 rtc_hw->setup_0 = (((uint)t->year) << RTC_SETUP_0_YEAR_LSB ) |
69 (((uint)t->month) << RTC_SETUP_0_MONTH_LSB) |
70 (((uint)t->day) << RTC_SETUP_0_DAY_LSB);
71 rtc_hw->setup_1 = (((uint)t->dotw) << RTC_SETUP_1_DOTW_LSB) |
72 (((uint)t->hour) << RTC_SETUP_1_HOUR_LSB) |
73 (((uint)t->min) << RTC_SETUP_1_MIN_LSB) |
74 (((uint)t->sec) << RTC_SETUP_1_SEC_LSB);
75
76 // Load setup values into rtc clock domain
77 rtc_hw->ctrl = RTC_CTRL_LOAD_BITS;
78
79 // Enable RTC and wait for it to be running
80 rtc_hw->ctrl = RTC_CTRL_RTC_ENABLE_BITS;
81 while (!rtc_running()) {
82 tight_loop_contents();
83 }
84
85 return true;
86 }
NOTE
It is possible to change the current time while the RTC is running. Write the desired values, then set the LOAD bit in
the CTRL register.
4.8.5.3. Reading the current time
The RTC time is stored across two 32-bit registers. To ensure a consistent value, RTC_0 should be read before RTC_1.
Reading RTC_0 latches the value of RTC_1.
SDK: https://github.com/raspberrypi/pico-sdk/tree/master/src/rp2_common/hardware_rtc/rtc.c Lines 88 - 107
Ê88 bool rtc_get_datetime(datetime_t *t) {
Ê89 // Make sure RTC is running
Ê90 if (!rtc_running()) {
Ê91 return false;
Ê92 }
Ê93
Ê94 // Note: RTC_0 should be read before RTC_1
Ê95 uint32_t rtc_0 = rtc_hw->rtc_0;
Ê96 uint32_t rtc_1 = rtc_hw->rtc_1;
Ê97
Ê98 t->dotw = (rtc_0 & RTC_RTC_0_DOTW_BITS ) >> RTC_RTC_0_DOTW_LSB;
Ê99 t->hour = (rtc_0 & RTC_RTC_0_HOUR_BITS ) >> RTC_RTC_0_HOUR_LSB;
100 t->min = (rtc_0 & RTC_RTC_0_MIN_BITS ) >> RTC_RTC_0_MIN_LSB;
101 t->sec = (rtc_0 & RTC_RTC_0_SEC_BITS ) >> RTC_RTC_0_SEC_LSB;
102 t->year = (rtc_1 & RTC_RTC_1_YEAR_BITS ) >> RTC_RTC_1_YEAR_LSB;
103 t->month = (rtc_1 & RTC_RTC_1_MONTH_BITS) >> RTC_RTC_1_MONTH_LSB;
104 t->day = (rtc_1 & RTC_RTC_1_DAY_BITS ) >> RTC_RTC_1_DAY_LSB;
105
106 return true;
107 }
RP2040 Datasheet
4.8. RTC 572