This commit is contained in:
Tinyu
2022-07-15 17:13:24 +08:00
parent 5882eee183
commit c5ebe0c82e
7 changed files with 132 additions and 117 deletions
+5 -3
View File
@@ -1,13 +1,15 @@
# M5_BM8563
# M5Unit-RTC
## Overview
### SKU:U126
M5Stack-**UNIT RTC** related programs.compatible with BM8563 and HYM8563.
## Related Link
[Document & Datasheet](https://docs.m5stack.com/en/unit/rtc)
[Document & Datasheet - M5Unit-RTC](https://docs.m5stack.com/en/unit/rtc)
## License
[UNIT_ENV - MIT](LICENSE)
[M5Unit-RTC - MIT](LICENSE)
@@ -0,0 +1,56 @@
/*
*******************************************************************************
* Copyright (c) 2021 by M5Stack
* Equipped with M5Series sample source code
* 配套 M5Series 示例源代码
* Visit for more information: https://docs.m5stack.com/en/unit/rtc
* 获取更多资料请访问: https://docs.m5stack.com/zh_CN/unit/rtc
*
* Describe: Unit RTC.
* Date: 2022/7/15
*******************************************************************************
Real-time time output on serial port every one second
每个一秒在串口输出实时时间
*/
#include "Unit_RTC.h"
Unit_RTC RTC;
rtc_time_type rtc_time;
rtc_date_type rtc_date;
char str_buffer[64];
void showlog(rtc_time_type *rtc_time, rtc_date_type *rtc_date) {
sprintf(str_buffer, "RTC Time Now is %02d:%02d:%02d", rtc_time->Hours,
rtc_time->Minutes, rtc_time->Seconds);
Serial.println(str_buffer);
sprintf(str_buffer, "RTC Date Now is %02d:%02d:%02d WeekDay:%02d",
rtc_date->Year, rtc_date->Month, rtc_date->Date, rtc_date->WeekDay);
Serial.println(str_buffer);
}
void setup() {
RTC.begin();
Serial.begin(115200);
delay(10);
rtc_time.Hours = 14;
rtc_time.Minutes = 40;
rtc_time.Seconds = 5;
rtc_date.WeekDay = 4;
rtc_date.Month = 7;
rtc_date.Date = 15;
rtc_date.Year = 2021;
RTC.setTime(&rtc_time);
RTC.setDate(&rtc_date);
}
void loop() {
RTC.getTime(&rtc_time);
RTC.getDate(&rtc_date);
showlog(&rtc_time, &rtc_date);
delay(300);
}
-42
View File
@@ -1,42 +0,0 @@
#include "M5_BM8563.h"
BM8563 RTC;
rtc_time_type rtc_time_unit;
rtc_date_type rtc_date_unit;
char str_buffer[64];
void showlog(rtc_time_type *rtc_time, rtc_date_type *rtc_date) {
sprintf(str_buffer, "RTC Time Now is %02d:%02d:%02d", rtc_time->Hours,
rtc_time->Minutes, rtc_time->Seconds);
Serial.println(str_buffer);
sprintf(str_buffer, "RTC Date Now is %02d:%02d:%02d WeekDay:%02d",
rtc_date->Year, rtc_date->Month, rtc_date->Date, rtc_date->WeekDay);
Serial.println(str_buffer);
}
void setup() {
RTC.begin();
Serial.begin(115200);
delay(10);
rtc_time_unit.Hours = 14;
rtc_time_unit.Minutes = 40;
rtc_time_unit.Seconds = 5;
rtc_date_unit.WeekDay = 4;
rtc_date_unit.Month = 7;
rtc_date_unit.Date = 15;
rtc_date_unit.Year = 2021;
RTC.setTime(&rtc_time_unit);
RTC.setDate(&rtc_date_unit);
}
void loop() {
RTC.getTime(&rtc_time_unit);
RTC.getDate(&rtc_date_unit);
showlog(&rtc_time_unit, &rtc_date_unit);
delay(300);
}
+5 -5
View File
@@ -1,16 +1,16 @@
{
"name": "M5_BM8563",
"description": "Library for M5_BM8563 RTC",
"keywords": "BM8563 RTC",
"name": "M5Unit-RTC",
"description": "Library for M5Stack Unit RTC",
"keywords": "M5Stack Unit BM8563 RTC",
"authors": {
"name": "M5Stack",
"url": "http://www.m5stack.com"
},
"repository": {
"type": "git",
"url": "https://github.com/m5stack/M5_BM8563.git"
"url": "https://github.com/m5stack/M5Unit-RTC.git"
},
"version": "0.0.1",
"frameworks": "arduino",
"platforms": "espressif32"
}
}
+6 -6
View File
@@ -1,10 +1,10 @@
name=M5_BM8563
name=M5Unit-RTC
version=0.0.1
author=M5Stack
maintainer=M5Stack,Sean
sentence=Library for M5_BM8563 RTC
paragraph=See more on http://M5Stack.com
maintainer=M5Stack
sentence=Library for BM8563 RTC
paragraph=See more on https://docs.m5stack.com/en/unit/rtc
category=Device Control
url=https://github.com/m5stack/M5_BM8563
url=https://github.com/m5stack/M5Unit-RTC
architectures=esp32
includes=M5_BM8563.h
includes=Unit_RTC.h
+43 -53
View File
@@ -1,10 +1,15 @@
#include "M5_BM8563.h"
#include "Unit_RTC.h"
BM8563::BM8563() { _addr = DEVICE_ADDR; }
Unit_RTC::Unit_RTC() {
_addr = DEVICE_ADDR;
}
BM8563::BM8563(uint8_t addr) { _addr = addr; }
Unit_RTC::Unit_RTC(uint8_t addr) {
_addr = addr;
}
void BM8563::begin() {
/*! @brief Initialize the RTC. */
void Unit_RTC::begin() {
_wire = &Wire;
_wire->begin();
writeReg(0x00, 0x00);
@@ -12,7 +17,8 @@ void BM8563::begin() {
writeReg(0x0D, 0x00);
}
void BM8563::begin(TwoWire *wire) {
/*! @brief Initialize the RTC. */
void Unit_RTC::begin(TwoWire *wire) {
_wire = wire;
_wire->begin();
writeReg(0x00, 0x00);
@@ -20,50 +26,34 @@ void BM8563::begin(TwoWire *wire) {
writeReg(0x0D, 0x00);
}
void BM8563::begin(TwoWire *wire, uint8_t scl, uint8_t sda, uint32_t i2c_freq) {
/*! @brief Initialize the RTC. */
void Unit_RTC::begin(TwoWire *wire, uint8_t scl, uint8_t sda,
uint32_t i2c_freq) {
_wire = wire;
_wire->begin(sda, scl, i2c_freq);
_wire->begin(DEVICE_ADDR, sda, scl, i2c_freq);
writeReg(0x00, 0x00);
writeReg(0x01, 0x00);
writeReg(0x0D, 0x00);
}
void BM8563::writeReg(uint8_t reg, uint8_t data) {
_wire->beginTransmission(0x51);
/*! @brief Write data to register. */
void Unit_RTC::writeReg(uint8_t reg, uint8_t data) {
_wire->beginTransmission(DEVICE_ADDR);
_wire->write(reg);
_wire->write(data);
_wire->endTransmission();
}
uint8_t BM8563::ReadReg(uint8_t reg) {
_wire->beginTransmission(0x51);
/*! @brief Read data from register. */
uint8_t Unit_RTC::ReadReg(uint8_t reg) {
_wire->beginTransmission(DEVICE_ADDR);
_wire->write(reg);
_wire->endTransmission(false);
_wire->requestFrom(0x51, 1);
_wire->requestFrom(DEVICE_ADDR, 1);
return _wire->read();
}
void BM8563::getBm8563Time(void) {
_wire->beginTransmission(0x51);
_wire->write(0x02);
_wire->endTransmission(false);
_wire->requestFrom(0x51, 7);
while (_wire->available()) {
_trdata[0] = _wire->read();
_trdata[1] = _wire->read();
_trdata[2] = _wire->read();
_trdata[3] = _wire->read();
_trdata[4] = _wire->read();
_trdata[5] = _wire->read();
_trdata[6] = _wire->read();
}
DataMask();
Bcd2asc();
Str2Time();
}
void BM8563::Str2Time(void) {
void Unit_RTC::Str2Time(void) {
Second = (asc[0] - 0x30) * 10 + asc[1] - 0x30;
Minute = (asc[2] - 0x30) * 10 + asc[3] - 0x30;
Hour = (asc[4] - 0x30) * 10 + asc[5] - 0x30;
@@ -76,7 +66,7 @@ void BM8563::Str2Time(void) {
*/
}
void BM8563::DataMask() {
void Unit_RTC::DataMask() {
_trdata[0] = _trdata[0] & 0x7f; //秒
_trdata[1] = _trdata[1] & 0x7f; //分
_trdata[2] = _trdata[2] & 0x3f; //时
@@ -95,7 +85,7 @@ void BM8563::DataMask() {
***********************************************************************/
void BM8563::Bcd2asc(void) {
void Unit_RTC::Bcd2asc(void) {
uint8_t i, j;
for (j = 0, i = 0; i < 7; i++) {
asc[j++] =
@@ -104,13 +94,13 @@ void BM8563::Bcd2asc(void) {
}
}
uint8_t BM8563::Bcd2ToByte(uint8_t Value) {
uint8_t Unit_RTC::Bcd2ToByte(uint8_t Value) {
uint8_t tmp = 0;
tmp = ((uint8_t)(Value & (uint8_t)0xF0) >> (uint8_t)0x4) * 10;
return (tmp + (Value & (uint8_t)0x0F));
}
uint8_t BM8563::ByteToBcd2(uint8_t Value) {
uint8_t Unit_RTC::ByteToBcd2(uint8_t Value) {
uint8_t bcdhigh = 0;
while (Value >= 10) {
@@ -121,14 +111,14 @@ uint8_t BM8563::ByteToBcd2(uint8_t Value) {
return ((uint8_t)(bcdhigh << 4) | Value);
}
void BM8563::getTime(rtc_time_type *RTC_TimeStruct) {
void Unit_RTC::getTime(rtc_time_type *RTC_TimeStruct) {
// if()
uint8_t buf[3] = {0};
_wire->beginTransmission(0x51);
_wire->beginTransmission(DEVICE_ADDR);
_wire->write(0x02);
_wire->endTransmission(false);
_wire->requestFrom(0x51, 3);
_wire->requestFrom(DEVICE_ADDR, 3);
while (_wire->available()) {
buf[0] = _wire->read();
@@ -141,12 +131,12 @@ void BM8563::getTime(rtc_time_type *RTC_TimeStruct) {
RTC_TimeStruct->Hours = Bcd2ToByte(buf[2] & 0x3f); //时
}
int BM8563::setTime(rtc_time_type *RTC_TimeStruct) {
int Unit_RTC::setTime(rtc_time_type *RTC_TimeStruct) {
if (RTC_TimeStruct == NULL || RTC_TimeStruct->Hours > 24 ||
RTC_TimeStruct->Minutes > 60 || RTC_TimeStruct->Seconds > 60)
return 0;
_wire->beginTransmission(0x51);
_wire->beginTransmission(DEVICE_ADDR);
_wire->write(0x02);
_wire->write(ByteToBcd2(RTC_TimeStruct->Seconds));
_wire->write(ByteToBcd2(RTC_TimeStruct->Minutes));
@@ -155,13 +145,13 @@ int BM8563::setTime(rtc_time_type *RTC_TimeStruct) {
return 1;
}
void BM8563::getDate(rtc_date_type *RTC_DateStruct) {
void Unit_RTC::getDate(rtc_date_type *RTC_DateStruct) {
uint8_t buf[4] = {0};
_wire->beginTransmission(0x51);
_wire->beginTransmission(DEVICE_ADDR);
_wire->write(0x05);
_wire->endTransmission(false);
_wire->requestFrom(0x51, 4);
_wire->requestFrom(DEVICE_ADDR, 4);
while (_wire->available()) {
buf[0] = _wire->read();
@@ -181,11 +171,11 @@ void BM8563::getDate(rtc_date_type *RTC_DateStruct) {
}
}
int BM8563::setDate(rtc_date_type *RTC_DateStruct) {
int Unit_RTC::setDate(rtc_date_type *RTC_DateStruct) {
if (RTC_DateStruct == NULL || RTC_DateStruct->WeekDay > 7 ||
RTC_DateStruct->Date > 31 || RTC_DateStruct->Month > 12)
return 0;
_wire->beginTransmission(0x51);
_wire->beginTransmission(DEVICE_ADDR);
_wire->write(0x05);
_wire->write(ByteToBcd2(RTC_DateStruct->Date));
_wire->write(ByteToBcd2(RTC_DateStruct->WeekDay));
@@ -203,7 +193,7 @@ int BM8563::setDate(rtc_date_type *RTC_DateStruct) {
return 1;
}
int BM8563::setAlarmIRQ(int afterSeconds) {
int Unit_RTC::setAlarmIRQ(int afterSeconds) {
uint8_t reg_value = 0;
reg_value = ReadReg(0x01);
@@ -234,7 +224,7 @@ int BM8563::setAlarmIRQ(int afterSeconds) {
return afterSeconds * div;
}
int BM8563::setAlarmIRQ(const rtc_time_type &RTC_TimeStruct) {
int Unit_RTC::setAlarmIRQ(const rtc_time_type &RTC_TimeStruct) {
uint8_t irq_enable = false;
uint8_t out_buf[4] = {0x80, 0x80, 0x80, 0x80};
@@ -267,8 +257,8 @@ int BM8563::setAlarmIRQ(const rtc_time_type &RTC_TimeStruct) {
return irq_enable ? 1 : 0;
}
int BM8563::setAlarmIRQ(const rtc_date_type &RTC_DateStruct,
const rtc_time_type &RTC_TimeStruct) {
int Unit_RTC::setAlarmIRQ(const rtc_date_type &RTC_DateStruct,
const rtc_time_type &RTC_TimeStruct) {
uint8_t irq_enable = false;
uint8_t out_buf[4] = {0x80, 0x80, 0x80, 0x80};
@@ -308,11 +298,11 @@ int BM8563::setAlarmIRQ(const rtc_date_type &RTC_DateStruct,
return irq_enable ? 1 : 0;
}
void BM8563::clearIRQ() {
void Unit_RTC::clearIRQ() {
uint8_t data = ReadReg(0x01);
writeReg(0x01, data & 0xf3);
}
void BM8563::disableIRQ() {
void Unit_RTC::disableIRQ() {
clearIRQ();
uint8_t data = ReadReg(0x01);
writeReg(0x01, data & 0xfC);
+17 -8
View File
@@ -1,8 +1,15 @@
#ifndef __M5_BM8563_RTC_H__
#define __M5_BM8563_RTC_H__
/*!
* @brief A programmable real-time clock module From M5Stack
* @copyright Copyright (c) 2022 by M5Stack[https://m5stack.com]
*
* @Links [Unit RTC](https://docs.m5stack.com/en/unit/rtc)
* @version V0.0.1
* @date 2022-07-15
*/
#ifndef _Unit_RTC_H__
#define _Unit_RTC_H__
#include <Wire.h>
#include "Arduino.h"
#define DEVICE_ADDR 0x51
@@ -12,7 +19,8 @@ struct rtc_time_type {
uint8_t Minutes;
uint8_t Seconds;
rtc_time_type(uint8_t hours = 0, uint8_t minutes = 0, uint8_t seconds = 0)
: Hours{hours}, Minutes{minutes}, Seconds{seconds} {}
: Hours{hours}, Minutes{minutes}, Seconds{seconds} {
}
};
struct rtc_date_type {
@@ -22,10 +30,11 @@ struct rtc_date_type {
uint8_t WeekDay;
rtc_date_type(uint16_t year = 2000, uint8_t month = 0, uint8_t date = 0,
uint8_t weekDay = 0)
: Year{year}, Month{month}, Date{date}, WeekDay{weekDay} {}
: Year{year}, Month{month}, Date{date}, WeekDay{weekDay} {
}
};
class BM8563 {
class Unit_RTC {
private:
void Bcd2asc(void);
void DataMask();
@@ -44,8 +53,8 @@ class BM8563 {
TwoWire *_wire;
public:
BM8563();
BM8563(uint8_t addr);
Unit_RTC();
Unit_RTC(uint8_t addr);
void begin();
void begin(TwoWire *wire);
void begin(TwoWire *wire, uint8_t scl, uint8_t sda, uint32_t i2c_freq);