電池ボックス付きで使いやすく、
Groveコネクタを介して簡単に接続ができます。
CR1225というリチウム電池の入手性が非常に悪いですが、
CR1220と若干の容量差があるものの、厚みの差だけのため、使用可能です。
CR1220は100均等でも買えるため、CR1220を使用しました。
CR1220の方が.数mm厚さが薄いため、容量が少ないようです。
今回は普通にI2C接続でSTM32F303K8と接続しました。
STM32の32ピンパッケージはVBAT端子が付いていないため、
RTC機能はありますが電源OFF時の時刻保持等ができません。
ということで外付けでRTCを使用することにしました。
普通に接続して、時刻を設定、読込しようとしましたが、
最初、思ったように動作しませんでした。
GroveRTCモジュールはDS1307という
良く良くデータシートを見ると、
電源電圧が4.5V~となっており、
上記サイトでは3.3V~使用できるとありますが・・・
VCCを3.3Vに接続して電池をセットしてI2Cで設定、読込しようとすると
DS1307からまったく応答がありません。
なぜか電池を外すとDS1307と通信できて、設定、読込ができます。
電池を外して動作してもRTCとしては使い物になりません。
データシート通りにVCCに5Vを供給して電池をセットすると
DS1307と通信できて、設定、読込ができました。
やはり、GroveRTCモジュールはVCC=3.3VではRTCとして使えないようです。
プルアップ抵抗等をいじったりしてみましたが、駄目でした・・・
ということでVCCへ5Vを給電して、
STM32F303K8と接続しました。
なお、STM32F303K8のI2Cはプルアップ無効で
FTfピンのため、5V耐圧として直接接続して使用可能です。
コード例
#define DS1307ADDR 0xD0
#define Ds1307SecondRegAddress 0x00
#define Ds1307DateRegAddress 0x04
#define Ds1307ControlRegAddress 0x07
typedef struct
{
uint8_t sec;
uint8_t min;
uint8_t hour;
uint8_t weekDay;
uint8_t date;
uint8_t month;
uint8_t year;
}rtc_t;
void RTC_Init(void)
{
HAL_I2C_Mem_Write( &hi2c1,
DS1307ADDR,
Ds1307ControlRegAddress,
I2C_MEMADD_SIZE_8BIT,
0x00, 1, 1000);
}
void RTC_SetDateTime(rtc_t *rtc)
{
uint8_t data[7];
data[0]=rtc->sec;
data[1]=rtc->min;
data[2]=rtc->hour;
data[3]=rtc->weekDay;
data[4]=rtc->date;
data[5]=rtc->month;
data[6]=rtc->year;
HAL_I2C_Mem_Write( &hi2c1,
DS1307ADDR,
Ds1307SecondRegAddress,
I2C_MEMADD_SIZE_8BIT,
data, 7, 1000);
}
void RTC_GetDateTime(rtc_t *rtc)
{
uint8_t data[7];
HAL_I2C_Mem_Read( &hi2c1,
DS1307ADDR,
Ds1307SecondRegAddress,
I2C_MEMADD_SIZE_8BIT,
(uint8_t*)&data, 7, 1000);
rtc->sec=data[0];
rtc->min=data[1];
rtc->hour=data[2];
rtc->weekDay=data[3];
rtc->date=data[4];
rtc->month=data[5];
rtc->year=data[6];
}
main関数内
RTC_Init();
/* USER CODE END 2 */
rtc.hour = 0x13; // 13:12:00
rtc.min = 0x12;
rtc.sec = 0x00;
rtc.date = 0x12; //17/2/12
rtc.month = 0x02;
rtc.year = 0x17;
rtc.weekDay = 5;
RTC_SetDateTime(&rtc)
while (1)
{
RTC_GetDateTime(&rtc);
printf("Y/M/D H:M:S -> %2x/%2x/%2x %2x:%2x:%2x \n\r",
(uint16_t)rtc.year,(uint16_t)rtc.month,(uint16_t)rtc.date,
(uint16_t)rtc.hour,(uint16_t)rtc.min,(uint16_t)rtc.sec);
HAL_Delay(300);
}
時刻を一度、セットしてから、
RTC_SetDateTime(&rtc)をコメントアウトしたプログラムを書き込んで、
上記のように電池で保持されることを確認できました。