M5Unit-RTC 0.1.0 git rev:26c1349
Loading...
Searching...
No Matches
unit_PCF8563.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
10#ifndef M5_UNIT_RTC_UNIT_PCF8563_HPP
11#define M5_UNIT_RTC_UNIT_PCF8563_HPP
12
13#include <M5UnitComponent.hpp>
15
16namespace m5 {
17namespace unit {
18
23class UnitPCF8563 : public Component {
24 M5_UNIT_COMPONENT_HPP_BUILDER(UnitPCF8563, 0x51);
25
26public:
28 using irq_callback_t = void (*)();
29
34 struct config_t {
36 int16_t int_pin{-1};
38 bool polling{true};
40 pcf8563::ClockOutput clkout{pcf8563::ClockOutput::None};
42 uint32_t polling_interval{500};
47 };
48
49 explicit UnitPCF8563(const uint8_t addr = DEFAULT_ADDRESS) : Component(addr)
50 {
51 }
52 virtual ~UnitPCF8563()
53 {
54 }
55
56 virtual bool begin() override;
57 virtual void update(const bool force = false) override;
58
61
62 inline config_t config() const
63 {
64 return _cfg;
65 }
67 inline void config(const config_t& cfg)
68 {
69 _cfg = cfg;
70 }
72
73 // ============================================================
74 // M5UnitUnified style API
75
78
83 bool readTime(pcf8563::rtc_time_t& time);
89 bool writeTime(const pcf8563::rtc_time_t& time);
95 bool readDate(pcf8563::rtc_date_t& date);
101 bool writeDate(const pcf8563::rtc_date_t& date);
119 bool readDateTime(struct tm& t);
125 bool writeDateTime(const struct tm& t);
127
151
159 bool writeAlarm(const pcf8563::rtc_time_t& time, const pcf8563::rtc_date_t& date);
172 bool readAlarmInterrupt(bool& enabled);
178 bool writeAlarmInterrupt(const bool enabled);
184 bool readAlarmFlag(bool& fired);
189 bool clearAlarmFlag();
190
200 uint32_t writeTimer(const uint32_t msec, const bool repeat = false);
207 bool readTimerControl(bool& enabled, pcf8563::TimerClock& clock);
214 bool writeTimerControl(const bool enabled, const pcf8563::TimerClock clock);
220 bool readTimerValue(uint8_t& count);
226 bool writeTimerValue(const uint8_t count);
232 bool readTimerInterrupt(bool& enabled);
238 bool writeTimerInterrupt(const bool enabled);
244 bool readTimerFlag(bool& fired);
249 bool clearTimerFlag();
257 bool readTimerPeriodic(bool& periodic);
265 bool writeTimerPeriodic(const bool periodic);
267
270
275 bool readStop(bool& stopped);
284 bool writeStop(const bool stop);
286
289
294 bool readVoltLow(bool& low);
296
297 // ============================================================
298 // M5Unified M5.RTC compatible API
299 // Available when M5Unified.hpp or RTC_Base.hpp is included before this header.
300#if defined(__M5_RTC_BASE_H__) || defined(__M5UNIFIED_HPP__)
301
304
311 inline bool getDateTime(m5::rtc_date_t* date, m5::rtc_time_t* time)
312 {
315 if (!read_datetime(date ? &d : nullptr, time ? &t : nullptr)) {
316 return false;
317 }
318 if (date) {
319 *date = {d.year, d.month, d.date, d.weekDay};
320 }
321 if (time) {
322 *time = {t.hours, t.minutes, t.seconds};
323 }
324 return true;
325 }
332 inline bool setDateTime(const m5::rtc_date_t* date, const m5::rtc_time_t* time)
333 {
334 pcf8563::rtc_date_t d;
335 pcf8563::rtc_time_t t;
336 if (date) {
337 d = {date->year, date->month, date->date, date->weekDay};
338 }
339 if (time) {
340 t = {time->hours, time->minutes, time->seconds};
341 }
342 return write_datetime(date ? &d : nullptr, time ? &t : nullptr);
343 }
344
346 inline bool getDateTime(m5::rtc_datetime_t* dt)
347 {
348 return dt ? getDateTime(&dt->date, &dt->time) : false;
349 }
351 inline bool getDate(m5::rtc_date_t* date)
352 {
353 return getDateTime(date, nullptr);
354 }
356 inline bool getTime(m5::rtc_time_t* time)
357 {
358 return getDateTime(nullptr, time);
359 }
360
362 inline bool setDateTime(const m5::rtc_datetime_t& dt)
363 {
364 return setDateTime(&dt.date, &dt.time);
365 }
367 inline bool setDateTime(const m5::rtc_datetime_t* dt)
368 {
369 return dt ? setDateTime(&dt->date, &dt->time) : false;
370 }
372 inline bool setDate(const m5::rtc_date_t* date)
373 {
374 return setDateTime(date, nullptr);
375 }
377 inline bool setDate(const m5::rtc_date_t& date)
378 {
379 return setDateTime(&date, nullptr);
380 }
382 inline bool setTime(const m5::rtc_time_t* time)
383 {
384 return setDateTime(nullptr, time);
385 }
387 inline bool setTime(const m5::rtc_time_t& time)
388 {
389 return setDateTime(nullptr, &time);
390 }
391
393 inline m5::rtc_time_t getTime()
394 {
395 pcf8563::rtc_time_t t{};
396 readTime(t);
397 return {t.hours, t.minutes, t.seconds};
398 }
400 inline m5::rtc_date_t getDate()
401 {
402 pcf8563::rtc_date_t d{};
403 readDate(d);
404 return {d.year, d.month, d.date, d.weekDay};
405 }
407 inline m5::rtc_datetime_t getDateTime()
408 {
409 pcf8563::rtc_datetime_t dt{};
410 readDateTime(dt);
411 return {{dt.date.year, dt.date.month, dt.date.date, dt.date.weekDay},
412 {dt.time.hours, dt.time.minutes, dt.time.seconds}};
413 }
414
421 int setAlarmIRQ(const m5::rtc_date_t* date, const m5::rtc_time_t* time);
423 inline int setAlarmIRQ(const m5::rtc_date_t& date, const m5::rtc_time_t& time)
424 {
425 return setAlarmIRQ(&date, &time);
426 }
428 inline int setAlarmIRQ(const m5::rtc_time_t& time)
429 {
430 return setAlarmIRQ(nullptr, &time);
431 }
437 int setAlarmIRQ(const int afterSeconds);
443 uint32_t setTimerIRQ(const uint32_t timer_msec);
444
446 inline bool getVoltLow()
447 {
448 bool low{};
449 return readVoltLow(low) ? low : true;
450 }
452 inline bool getIRQstatus()
453 {
454 uint8_t val{};
455 if (!read_control2(val)) {
456 return false;
457 }
458 return (val & 0x0C) != 0;
459 }
461 inline void clearIRQ()
462 {
463 write_control2_bits(0x0C, 0x00);
464 }
466 void disableIRQ();
471 void setSystemTimeFromRtc(struct timezone* tz = nullptr);
473
474#endif // defined(__M5_RTC_BASE_H__) || defined(__M5UNIFIED_HPP__)
475
476protected:
479 bool read_register(const uint8_t reg, uint8_t* buf, const size_t len);
480 bool read_register8(const uint8_t reg, uint8_t& val);
481 bool write_register(const uint8_t reg, const uint8_t* buf, const size_t len);
482 bool write_register8(const uint8_t reg, const uint8_t val);
484
486 bool read_datetime(pcf8563::rtc_date_t* date, pcf8563::rtc_time_t* time);
488 bool write_datetime(const pcf8563::rtc_date_t* date, const pcf8563::rtc_time_t* time);
490 bool read_control2(uint8_t& val);
492 bool write_control2_bits(const uint8_t mask, const uint8_t bits);
493
494private:
495 static void IRAM_ATTR isr_handler(void* arg);
496 void check_irq_flags();
497
498 config_t _cfg{};
499 volatile bool _isr_fired{};
500};
501
502namespace pcf8563 {
504namespace command {
505constexpr uint8_t CONTROL1_REG{0x00};
506constexpr uint8_t CONTROL2_REG{0x01};
507constexpr uint8_t SECONDS_REG{0x02};
508constexpr uint8_t MINUTES_REG{0x03};
509constexpr uint8_t HOURS_REG{0x04};
510constexpr uint8_t DAYS_REG{0x05};
511constexpr uint8_t WEEKDAYS_REG{0x06};
512constexpr uint8_t MONTHS_REG{0x07};
513constexpr uint8_t YEARS_REG{0x08};
514constexpr uint8_t ALARM_MINUTES_REG{0x09};
515constexpr uint8_t ALARM_HOURS_REG{0x0A};
516constexpr uint8_t ALARM_DAY_REG{0x0B};
517constexpr uint8_t ALARM_WEEKDAY_REG{0x0C};
518constexpr uint8_t CLKOUT_CONTROL_REG{0x0D};
519constexpr uint8_t TIMER_CONTROL_REG{0x0E};
520constexpr uint8_t TIMER_REG{0x0F};
521} // namespace command
523} // namespace pcf8563
524
525} // namespace unit
526} // namespace m5
527#endif
Real-time clock unit using PCF8563 compatible chip (BM8563/HYM8563)
Definition unit_PCF8563.hpp:23
bool readTimerInterrupt(bool &enabled)
Read timer interrupt enable state.
Definition unit_PCF8563.cpp:505
bool writeDate(const pcf8563::rtc_date_t &date)
Write date to RTC.
Definition unit_PCF8563.cpp:295
bool write_datetime(const pcf8563::rtc_date_t *date, const pcf8563::rtc_time_t *time)
Write time and/or date registers (nullable pointer support)
Definition unit_PCF8563.cpp:229
bool writeDateTime(const pcf8563::rtc_datetime_t &dt)
Write date and time to RTC.
Definition unit_PCF8563.cpp:306
bool readAlarm(pcf8563::rtc_time_t &time, pcf8563::rtc_date_t &date)
Read alarm settings.
Definition unit_PCF8563.cpp:357
bool readTime(pcf8563::rtc_time_t &time)
Read time from RTC.
Definition unit_PCF8563.cpp:278
bool clearTimerFlag()
Clear timer flag (TF bit)
Definition unit_PCF8563.cpp:532
bool writeTimerControl(const bool enabled, const pcf8563::TimerClock clock)
Write timer control settings.
Definition unit_PCF8563.cpp:488
bool readAlarmFlag(bool &fired)
Read alarm flag.
Definition unit_PCF8563.cpp:398
bool read_datetime(pcf8563::rtc_date_t *date, pcf8563::rtc_time_t *time)
Read time and/or date registers (nullable pointer support)
Definition unit_PCF8563.cpp:200
bool writeStop(const bool stop)
Write RTC clock stop state.
Definition unit_PCF8563.cpp:566
bool writeAlarm(const pcf8563::rtc_time_t &time, const pcf8563::rtc_date_t &date)
Set alarm and enable interrupt.
Definition unit_PCF8563.cpp:329
bool write_control2_bits(const uint8_t mask, const uint8_t bits)
Write CONTROL2 register with bit mask (read-modify-write)
Definition unit_PCF8563.cpp:262
bool readVoltLow(bool &low)
Read voltage-low flag (battery backup status)
Definition unit_PCF8563.cpp:574
bool readAlarmInterrupt(bool &enabled)
Read alarm interrupt enable state.
Definition unit_PCF8563.cpp:382
bool readTimerFlag(bool &fired)
Read timer flag.
Definition unit_PCF8563.cpp:521
bool writeTimerValue(const uint8_t count)
Write timer countdown value.
Definition unit_PCF8563.cpp:500
bool readDate(pcf8563::rtc_date_t &date)
Read date from RTC.
Definition unit_PCF8563.cpp:289
bool writeTime(const pcf8563::rtc_time_t &time)
Write time to RTC.
Definition unit_PCF8563.cpp:284
bool writeTimerInterrupt(const bool enabled)
Write timer interrupt enable state.
Definition unit_PCF8563.cpp:516
bool readStop(bool &stopped)
Read RTC clock stop state.
Definition unit_PCF8563.cpp:555
bool readDateTime(pcf8563::rtc_datetime_t &dt)
Read date and time from RTC.
Definition unit_PCF8563.cpp:300
void config(const config_t &cfg)
Set the configuration.
Definition unit_PCF8563.hpp:67
bool readTimerPeriodic(bool &periodic)
Read timer periodic mode (TI_TP bit)
Definition unit_PCF8563.cpp:537
void(*)() irq_callback_t
IRQ callback type.
Definition unit_PCF8563.hpp:28
bool clearAlarmFlag()
Clear alarm flag (AF bit)
Definition unit_PCF8563.cpp:409
bool writeAlarmInterrupt(const bool enabled)
Write alarm interrupt enable state.
Definition unit_PCF8563.cpp:393
bool read_control2(uint8_t &val)
Read CONTROL2 register.
Definition unit_PCF8563.cpp:257
config_t config() const
Gets the configuration.
Definition unit_PCF8563.hpp:62
bool readTimerValue(uint8_t &count)
Read timer countdown value.
Definition unit_PCF8563.cpp:494
bool readTimerControl(bool &enabled, pcf8563::TimerClock &clock)
Read timer control settings.
Definition unit_PCF8563.cpp:475
bool writeTimerPeriodic(const bool periodic)
Write timer periodic mode (TI_TP bit)
Definition unit_PCF8563.cpp:548
uint32_t writeTimer(const uint32_t msec, const bool repeat=false)
Set countdown timer with millisecond duration.
Definition unit_PCF8563.cpp:416
Settings for begin.
Definition unit_PCF8563.hpp:34
pcf8563::ClockOutput clkout
CLKOUT pin output frequency (default: disabled)
Definition unit_PCF8563.hpp:40
uint32_t polling_interval
Polling interval in milliseconds for IRQ status check in update()
Definition unit_PCF8563.hpp:42
irq_callback_t on_timer
Callback invoked from update() when timer fires (nullptr: disabled)
Definition unit_PCF8563.hpp:46
bool polling
true: poll IRQ status via I2C in update(), false: use hardware interrupt via int_pin
Definition unit_PCF8563.hpp:38
int16_t int_pin
GPIO pin connected to PCF8563 INT pin (-1: not connected)
Definition unit_PCF8563.hpp:36
irq_callback_t on_alarm
Callback invoked from update() when alarm fires (nullptr: disabled)
Definition unit_PCF8563.hpp:44
Calendar date (year, month, day, weekday)
Definition unit_PCF8563_types.hpp:85
int16_t year
year 1900-2099
Definition unit_PCF8563_types.hpp:87
int8_t date
date 1-31
Definition unit_PCF8563_types.hpp:91
int8_t month
month 1-12
Definition unit_PCF8563_types.hpp:89
int8_t weekDay
weekDay 0:sun / 1:mon / 2:tue / 3:wed / 4:thu / 5:fri / 6:sat
Definition unit_PCF8563_types.hpp:93
Combined date and time.
Definition unit_PCF8563_types.hpp:155
Time of day (hours, minutes, seconds)
Definition unit_PCF8563_types.hpp:25
Type definitions for PCF8563 Unit.
ClockOutput
CLKOUT pin output frequency (register 0x0D)
Definition unit_PCF8563_types.hpp:245
TimerClock
Timer clock source for PCF8563 countdown timer.
Definition unit_PCF8563_types.hpp:234