M41T62 is a serial real-time clock (RTC) made by STMicroelectronics.

Dependents:   LPC1114_data_logger Check_external_RTC LPC1114_barometer_with_data_logging

Revision:
5:959683e91979
Parent:
4:0c07690cb24f
diff -r 0c07690cb24f -r 959683e91979 m41t62_rtc.h
--- a/m41t62_rtc.h	Wed Aug 23 09:26:41 2017 +0000
+++ b/m41t62_rtc.h	Fri Aug 07 05:39:14 2020 +0000
@@ -1,16 +1,19 @@
 /*
  * mbed library program
  *  Control M41T62 RTC Module
+ *  STMicroelectronics
  *
- * Copyright (c) 2014,'15,'17 Kenji Arai / JH1PJL
- *  http://www.page.sannet.ne.jp/kenjia/index.html
- *  http://mbed.org/users/kenjiArai/
+ * Copyright (c) 2014,'15,'17,'20 Kenji Arai / JH1PJL
+ *  http://www7b.biglobe.ne.jp/~kenjia/
+ *  https://os.mbed.com/users/kenjiArai/
  *      Created: June       21st, 2014
- *      Revised: August     23rd, 2017
+ *      Revised: August      7th, 2020
  */
+
 /*
- *---------------- REFERENCE ----------------------------------------------------------------------
- *  http://www.st-japan.co.jp/web/jp/catalog/sense_power/FM151/CL1410/SC403/PF82507
+ *---------------- REFERENCE ---------------------------------------------------
+ *  http://www.st-japan.co.jp/web/jp/
+ *                  catalog/sense_power/FM151/CL1410/SC403/PF82507
  *  http://strawberry-linux.com/catalog/items?code=12062
  */
 
@@ -23,42 +26,6 @@
 // Address b7=1,b6=1,b5=0,b4=1,b3=0,b2=0,b1=0, b0=R/W
 #define M41T62ADDR  (0x68 << 1) // No other choice
 
-#define RTC_Wk_Monday       ((uint8_t)0x01)
-#define RTC_Wk_Tuesday      ((uint8_t)0x02)
-#define RTC_Wk_Wednesday    ((uint8_t)0x03)
-#define RTC_Wk_Thursday     ((uint8_t)0x04)
-#define RTC_Wk_Friday       ((uint8_t)0x05)
-#define RTC_Wk_Saturday     ((uint8_t)0x06)
-#define RTC_Wk_Sunday       ((uint8_t)0x07)
-
-#define RTC_SQW_NONE        ((uint8_t)0x0)
-#define RTC_SQW_32KHZ       ((uint8_t)0x1)
-#define RTC_SQW_8KHZ        ((uint8_t)0x2)
-#define RTC_SQW_4KHZ        ((uint8_t)0x3)
-#define RTC_SQW_2KHZ        ((uint8_t)0x4)
-#define RTC_SQW_1KHZ        ((uint8_t)0x5)
-#define RTC_SQW_512HZ       ((uint8_t)0x6)
-#define RTC_SQW_256HZ       ((uint8_t)0x7)
-#define RTC_SQW_128HZ       ((uint8_t)0x8)
-#define RTC_SQW_64HZ        ((uint8_t)0x9)
-#define RTC_SQW_32HZ        ((uint8_t)0xa)
-#define RTC_SQW_16HZ        ((uint8_t)0xb)
-#define RTC_SQW_8HZ         ((uint8_t)0xc)
-#define RTC_SQW_4HZ         ((uint8_t)0xd)
-#define RTC_SQW_2HZ         ((uint8_t)0xe)
-#define RTC_SQW_1HZ         ((uint8_t)0xf)
-
-typedef struct {    // BCD format
-    uint8_t rtc_seconds;
-    uint8_t rtc_minutes;
-    uint8_t rtc_hours;
-    uint8_t rtc_weekday;
-    uint8_t rtc_date;
-    uint8_t rtc_month;
-    uint8_t rtc_year_raw;
-    uint16_t rtc_year;
-} rtc_time;
-
 // Register definition
 #define M41T62_REG_SSEC         0x0
 #define M41T62_REG_SEC          0x1
@@ -68,7 +35,8 @@
 #define M41T62_REG_DAY          0x5
 #define M41T62_REG_MON          0x6
 #define M41T62_REG_YEAR         0x7
-
+#define M41T62_REG_CALIB        0x8
+#define M41T62_REG_WDT          0x9
 #define M41T62_REG_ALARM_MON    0xa
 #define M41T62_REG_ALARM_DAY    0xb
 #define M41T62_REG_ALARM_HOUR   0xc
@@ -76,6 +44,28 @@
 #define M41T62_REG_ALARM_SEC    0xe
 #define M41T62_REG_FLAGS        0xf
 
+// Buffer size
+#define RTC_BUF_SIZ            (M41T62_REG_FLAGS + 5)
+
+typedef enum {
+    RTC_SQW_NONE = 0,
+    RTC_SQW_32KHZ,
+    RTC_SQW_8KHZ,
+    RTC_SQW_4KHZ,
+    RTC_SQW_2KHZ,
+    RTC_SQW_1KHZ,
+    RTC_SQW_512HZ,
+    RTC_SQW_256HZ,
+    RTC_SQW_128HZ,
+    RTC_SQW_64HZ,
+    RTC_SQW_32HZ,
+    RTC_SQW_16HZ,
+    RTC_SQW_8HZ,
+    RTC_SQW_4HZ,
+    RTC_SQW_2HZ,
+    RTC_SQW_1HZ
+} sq_wave_t;
+
 /** Interface for RTC (I2C Interface)  STMicroelectronics M41T62
  *
  *  Standalone type RTC via I2C interface
@@ -96,12 +86,13 @@
  * time_t seconds;
  * char buf[40];
  *
- *   m41t62.set_sq_wave(RTC_SQW_NONE);      // Stop output for more low current
- *
- *   m41t62.read_rtc_std(&t);   // read RTC data
- *   seconds = mktime(&t);
- *   strftime(buf, 40, "%I:%M:%S %p (%Y/%m/%d)", localtime(&seconds));
- *   printf("Date: %s\r\n", buf);
+ *   m41t62.set_sq_wave(RTC_SQW_NONE); // Stop output for more low current
+ *   while(1){
+ *      m41t62.read_rtc_std(&t);       // read RTC data
+ *      seconds = mktime(&t);
+ *      strftime(buf, 40, "%I:%M:%S %p (%Y/%m/%d)", localtime(&seconds));
+ *      printf("Date: %s\r\n", buf);
+ *   }
  * }
  * @endcode
  */
@@ -109,7 +100,19 @@
 class M41T62
 {
 public:
-    /** Configure data pin
+
+    typedef struct {    // BCD format
+        uint8_t rtc_seconds;
+        uint8_t rtc_minutes;
+        uint8_t rtc_hours;
+        uint8_t rtc_weekday;
+        uint8_t rtc_date;
+        uint8_t rtc_month;
+        uint8_t rtc_year_raw;
+        uint16_t rtc_year;
+    } rtc_time;
+
+    /** Configure data pin (with other devices on I2C line)
       * @param data SDA and SCL pins
       */
     M41T62(PinName p_sda, PinName p_scl);
@@ -124,12 +127,26 @@
       * @return none but all data in tm
       */
     void read_rtc_std(tm *);
+    void get_time_rtc(tm *);
 
     /** Write data to RTC data with Standard C "struct tm" format
       * @param tm (save writing data)
       * @return none but all data in tm
       */
     void write_rtc_std(tm *);
+    void set_time_rtc(tm *);
+
+    /** Set Alarm / IRQ time
+      * @param next time (unit: minutes) from now on minimum = 2 minutes!!
+      * @return none
+      */
+    void set_next_IRQ(uint16_t time);
+
+    /** Clear Alarm / IRQ pin interrupt
+      * @param none
+      * @return none
+      */
+    void clear_IRQ(void);
 
     /** Read RTC data with own format
       * @param tm (data save area)
@@ -147,25 +164,26 @@
       * @param freq.
       * @return none
       */
-    void frequency(int hz);
+    void frequency(int);
 
     /** Control Square wave output port
-      * @param output_mode
+      * @param output_mode 
       * @return none
       */
-    void set_sq_wave(uint8_t );
+    void set_sq_wave(sq_wave_t);
 
 protected:
-    uint8_t bin2bcd(uint8_t);
-    uint8_t bcd2bin(uint8_t);
-
     I2C *_i2c_p;
     I2C &_i2c;
 
+    uint8_t bin2bcd(uint8_t);
+    uint8_t bcd2bin(uint8_t);
+    void set_alarm_reg (uint16_t time);
+
 private:
     uint8_t M41T62_addr;
-    uint8_t rtc_buf[8 + 2];   // buffer for RTC
+    uint8_t rtc_buf[RTC_BUF_SIZ];   // buffer for RTC
+
 };
 
 #endif      // M41T62_H
-