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

Dependents:   LPC1114_data_logger Check_external_RTC LPC1114_barometer_with_data_logging

Committer:
kenjiArai
Date:
Wed Aug 23 09:26:41 2017 +0000
Revision:
4:0c07690cb24f
Parent:
3:41c351da2fdf
Child:
5:959683e91979
countermeasure for  NonCopyable

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:2919f8bd90f3 1 /*
kenjiArai 3:41c351da2fdf 2 * mbed library program
kenjiArai 0:2919f8bd90f3 3 * Control M41T62 RTC Module
kenjiArai 0:2919f8bd90f3 4 *
kenjiArai 4:0c07690cb24f 5 * Copyright (c) 2014,'15,'17 Kenji Arai / JH1PJL
kenjiArai 0:2919f8bd90f3 6 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 0:2919f8bd90f3 7 * http://mbed.org/users/kenjiArai/
kenjiArai 4:0c07690cb24f 8 * Created: June 21st, 2014
kenjiArai 4:0c07690cb24f 9 * Revised: August 23rd, 2017
kenjiArai 0:2919f8bd90f3 10 */
kenjiArai 3:41c351da2fdf 11 /*
kenjiArai 3:41c351da2fdf 12 *---------------- REFERENCE ----------------------------------------------------------------------
kenjiArai 3:41c351da2fdf 13 * http://www.st-japan.co.jp/web/jp/catalog/sense_power/FM151/CL1410/SC403/PF82507
kenjiArai 3:41c351da2fdf 14 * http://strawberry-linux.com/catalog/items?code=12062
kenjiArai 3:41c351da2fdf 15 */
kenjiArai 0:2919f8bd90f3 16
kenjiArai 0:2919f8bd90f3 17 #ifndef M41T62_H
kenjiArai 0:2919f8bd90f3 18 #define M41T62_H
kenjiArai 0:2919f8bd90f3 19
kenjiArai 0:2919f8bd90f3 20 #include "mbed.h"
kenjiArai 0:2919f8bd90f3 21
kenjiArai 0:2919f8bd90f3 22 // RTC STmicro M41T62
kenjiArai 0:2919f8bd90f3 23 // Address b7=1,b6=1,b5=0,b4=1,b3=0,b2=0,b1=0, b0=R/W
kenjiArai 3:41c351da2fdf 24 #define M41T62ADDR (0x68 << 1) // No other choice
kenjiArai 0:2919f8bd90f3 25
kenjiArai 0:2919f8bd90f3 26 #define RTC_Wk_Monday ((uint8_t)0x01)
kenjiArai 0:2919f8bd90f3 27 #define RTC_Wk_Tuesday ((uint8_t)0x02)
kenjiArai 0:2919f8bd90f3 28 #define RTC_Wk_Wednesday ((uint8_t)0x03)
kenjiArai 0:2919f8bd90f3 29 #define RTC_Wk_Thursday ((uint8_t)0x04)
kenjiArai 0:2919f8bd90f3 30 #define RTC_Wk_Friday ((uint8_t)0x05)
kenjiArai 0:2919f8bd90f3 31 #define RTC_Wk_Saturday ((uint8_t)0x06)
kenjiArai 0:2919f8bd90f3 32 #define RTC_Wk_Sunday ((uint8_t)0x07)
kenjiArai 0:2919f8bd90f3 33
kenjiArai 0:2919f8bd90f3 34 #define RTC_SQW_NONE ((uint8_t)0x0)
kenjiArai 0:2919f8bd90f3 35 #define RTC_SQW_32KHZ ((uint8_t)0x1)
kenjiArai 0:2919f8bd90f3 36 #define RTC_SQW_8KHZ ((uint8_t)0x2)
kenjiArai 0:2919f8bd90f3 37 #define RTC_SQW_4KHZ ((uint8_t)0x3)
kenjiArai 0:2919f8bd90f3 38 #define RTC_SQW_2KHZ ((uint8_t)0x4)
kenjiArai 0:2919f8bd90f3 39 #define RTC_SQW_1KHZ ((uint8_t)0x5)
kenjiArai 0:2919f8bd90f3 40 #define RTC_SQW_512HZ ((uint8_t)0x6)
kenjiArai 0:2919f8bd90f3 41 #define RTC_SQW_256HZ ((uint8_t)0x7)
kenjiArai 0:2919f8bd90f3 42 #define RTC_SQW_128HZ ((uint8_t)0x8)
kenjiArai 0:2919f8bd90f3 43 #define RTC_SQW_64HZ ((uint8_t)0x9)
kenjiArai 0:2919f8bd90f3 44 #define RTC_SQW_32HZ ((uint8_t)0xa)
kenjiArai 0:2919f8bd90f3 45 #define RTC_SQW_16HZ ((uint8_t)0xb)
kenjiArai 0:2919f8bd90f3 46 #define RTC_SQW_8HZ ((uint8_t)0xc)
kenjiArai 0:2919f8bd90f3 47 #define RTC_SQW_4HZ ((uint8_t)0xd)
kenjiArai 0:2919f8bd90f3 48 #define RTC_SQW_2HZ ((uint8_t)0xe)
kenjiArai 0:2919f8bd90f3 49 #define RTC_SQW_1HZ ((uint8_t)0xf)
kenjiArai 0:2919f8bd90f3 50
kenjiArai 0:2919f8bd90f3 51 typedef struct { // BCD format
kenjiArai 3:41c351da2fdf 52 uint8_t rtc_seconds;
kenjiArai 3:41c351da2fdf 53 uint8_t rtc_minutes;
kenjiArai 3:41c351da2fdf 54 uint8_t rtc_hours;
kenjiArai 3:41c351da2fdf 55 uint8_t rtc_weekday;
kenjiArai 3:41c351da2fdf 56 uint8_t rtc_date;
kenjiArai 3:41c351da2fdf 57 uint8_t rtc_month;
kenjiArai 3:41c351da2fdf 58 uint8_t rtc_year_raw;
kenjiArai 3:41c351da2fdf 59 uint16_t rtc_year;
kenjiArai 3:41c351da2fdf 60 } rtc_time;
kenjiArai 3:41c351da2fdf 61
kenjiArai 3:41c351da2fdf 62 // Register definition
kenjiArai 3:41c351da2fdf 63 #define M41T62_REG_SSEC 0x0
kenjiArai 3:41c351da2fdf 64 #define M41T62_REG_SEC 0x1
kenjiArai 3:41c351da2fdf 65 #define M41T62_REG_MIN 0x2
kenjiArai 3:41c351da2fdf 66 #define M41T62_REG_HOUR 0x3
kenjiArai 3:41c351da2fdf 67 #define M41T62_REG_WDAY 0x4
kenjiArai 3:41c351da2fdf 68 #define M41T62_REG_DAY 0x5
kenjiArai 3:41c351da2fdf 69 #define M41T62_REG_MON 0x6
kenjiArai 3:41c351da2fdf 70 #define M41T62_REG_YEAR 0x7
kenjiArai 3:41c351da2fdf 71
kenjiArai 3:41c351da2fdf 72 #define M41T62_REG_ALARM_MON 0xa
kenjiArai 3:41c351da2fdf 73 #define M41T62_REG_ALARM_DAY 0xb
kenjiArai 3:41c351da2fdf 74 #define M41T62_REG_ALARM_HOUR 0xc
kenjiArai 3:41c351da2fdf 75 #define M41T62_REG_ALARM_MIN 0xd
kenjiArai 3:41c351da2fdf 76 #define M41T62_REG_ALARM_SEC 0xe
kenjiArai 3:41c351da2fdf 77 #define M41T62_REG_FLAGS 0xf
kenjiArai 0:2919f8bd90f3 78
kenjiArai 2:c58da9ec9ae3 79 /** Interface for RTC (I2C Interface) STMicroelectronics M41T62
kenjiArai 2:c58da9ec9ae3 80 *
kenjiArai 2:c58da9ec9ae3 81 * Standalone type RTC via I2C interface
kenjiArai 2:c58da9ec9ae3 82 *
kenjiArai 2:c58da9ec9ae3 83 * @code
kenjiArai 2:c58da9ec9ae3 84 * #include "mbed.h"
kenjiArai 3:41c351da2fdf 85 * #include "m41t62_rtc.h"
kenjiArai 2:c58da9ec9ae3 86 *
kenjiArai 2:c58da9ec9ae3 87 * // I2C Communication
kenjiArai 2:c58da9ec9ae3 88 * M41T62 m41t62(dp5,dp27); // STmicro RTC(M41T62) SDA, SCL
kenjiArai 2:c58da9ec9ae3 89 * // If you connected I2C line not only this device but also other devices,
kenjiArai 2:c58da9ec9ae3 90 * // you need to declare following method.
kenjiArai 2:c58da9ec9ae3 91 * I2C i2c(dp5,dp27); // SDA, SCL
kenjiArai 2:c58da9ec9ae3 92 * M41T62 m41t62(i2c); // STmicro RTC(M41T62)
kenjiArai 2:c58da9ec9ae3 93 *
kenjiArai 2:c58da9ec9ae3 94 * int main() {
kenjiArai 2:c58da9ec9ae3 95 * tm t;
kenjiArai 2:c58da9ec9ae3 96 * time_t seconds;
kenjiArai 2:c58da9ec9ae3 97 * char buf[40];
kenjiArai 2:c58da9ec9ae3 98 *
kenjiArai 3:41c351da2fdf 99 * m41t62.set_sq_wave(RTC_SQW_NONE); // Stop output for more low current
kenjiArai 2:c58da9ec9ae3 100 *
kenjiArai 2:c58da9ec9ae3 101 * m41t62.read_rtc_std(&t); // read RTC data
kenjiArai 2:c58da9ec9ae3 102 * seconds = mktime(&t);
kenjiArai 2:c58da9ec9ae3 103 * strftime(buf, 40, "%I:%M:%S %p (%Y/%m/%d)", localtime(&seconds));
kenjiArai 2:c58da9ec9ae3 104 * printf("Date: %s\r\n", buf);
kenjiArai 2:c58da9ec9ae3 105 * }
kenjiArai 2:c58da9ec9ae3 106 * @endcode
kenjiArai 2:c58da9ec9ae3 107 */
kenjiArai 3:41c351da2fdf 108
kenjiArai 3:41c351da2fdf 109 class M41T62
kenjiArai 3:41c351da2fdf 110 {
kenjiArai 0:2919f8bd90f3 111 public:
kenjiArai 2:c58da9ec9ae3 112 /** Configure data pin
kenjiArai 2:c58da9ec9ae3 113 * @param data SDA and SCL pins
kenjiArai 2:c58da9ec9ae3 114 */
kenjiArai 0:2919f8bd90f3 115 M41T62(PinName p_sda, PinName p_scl);
kenjiArai 2:c58da9ec9ae3 116
kenjiArai 2:c58da9ec9ae3 117 /** Configure data pin (with other devices on I2C line)
kenjiArai 2:c58da9ec9ae3 118 * @param I2C previous definition
kenjiArai 2:c58da9ec9ae3 119 */
kenjiArai 0:2919f8bd90f3 120 M41T62(I2C& p_i2c);
kenjiArai 0:2919f8bd90f3 121
kenjiArai 2:c58da9ec9ae3 122 /** Read RTC data with Standard C "struct tm" format
kenjiArai 2:c58da9ec9ae3 123 * @param tm (data save area)
kenjiArai 2:c58da9ec9ae3 124 * @return none but all data in tm
kenjiArai 2:c58da9ec9ae3 125 */
kenjiArai 1:9d7702a887d3 126 void read_rtc_std(tm *);
kenjiArai 2:c58da9ec9ae3 127
kenjiArai 2:c58da9ec9ae3 128 /** Write data to RTC data with Standard C "struct tm" format
kenjiArai 2:c58da9ec9ae3 129 * @param tm (save writing data)
kenjiArai 2:c58da9ec9ae3 130 * @return none but all data in tm
kenjiArai 2:c58da9ec9ae3 131 */
kenjiArai 1:9d7702a887d3 132 void write_rtc_std(tm *);
kenjiArai 2:c58da9ec9ae3 133
kenjiArai 2:c58da9ec9ae3 134 /** Read RTC data with own format
kenjiArai 2:c58da9ec9ae3 135 * @param tm (data save area)
kenjiArai 2:c58da9ec9ae3 136 * @return none but all data in tm
kenjiArai 2:c58da9ec9ae3 137 */
kenjiArai 1:9d7702a887d3 138 void read_rtc_direct(rtc_time *);
kenjiArai 2:c58da9ec9ae3 139
kenjiArai 2:c58da9ec9ae3 140 /** Read RTC data with own format
kenjiArai 2:c58da9ec9ae3 141 * @param tm (save writing data)
kenjiArai 2:c58da9ec9ae3 142 * @return none but all data in tm
kenjiArai 2:c58da9ec9ae3 143 */
kenjiArai 1:9d7702a887d3 144 void write_rtc_direct(rtc_time *);
kenjiArai 2:c58da9ec9ae3 145
kenjiArai 3:41c351da2fdf 146 /** Set I2C clock frequency
kenjiArai 3:41c351da2fdf 147 * @param freq.
kenjiArai 3:41c351da2fdf 148 * @return none
kenjiArai 3:41c351da2fdf 149 */
kenjiArai 3:41c351da2fdf 150 void frequency(int hz);
kenjiArai 3:41c351da2fdf 151
kenjiArai 2:c58da9ec9ae3 152 /** Control Square wave output port
kenjiArai 2:c58da9ec9ae3 153 * @param output_mode
kenjiArai 2:c58da9ec9ae3 154 * @return none
kenjiArai 2:c58da9ec9ae3 155 */
kenjiArai 1:9d7702a887d3 156 void set_sq_wave(uint8_t );
kenjiArai 0:2919f8bd90f3 157
kenjiArai 0:2919f8bd90f3 158 protected:
kenjiArai 0:2919f8bd90f3 159 uint8_t bin2bcd(uint8_t);
kenjiArai 0:2919f8bd90f3 160 uint8_t bcd2bin(uint8_t);
kenjiArai 0:2919f8bd90f3 161
kenjiArai 4:0c07690cb24f 162 I2C *_i2c_p;
kenjiArai 4:0c07690cb24f 163 I2C &_i2c;
kenjiArai 0:2919f8bd90f3 164
kenjiArai 0:2919f8bd90f3 165 private:
kenjiArai 0:2919f8bd90f3 166 uint8_t M41T62_addr;
kenjiArai 0:2919f8bd90f3 167 uint8_t rtc_buf[8 + 2]; // buffer for RTC
kenjiArai 0:2919f8bd90f3 168 };
kenjiArai 0:2919f8bd90f3 169
kenjiArai 2:c58da9ec9ae3 170 #endif // M41T62_H
kenjiArai 4:0c07690cb24f 171