#define DS3231_ADDR 0x68
uint8_t bcd_to_dec(uint8_t bcd)
{
return (bcd >> 4) * 10 + (bcd & 0x0F);
}
uint8_t dec_to_bcd(uint8_t dec)
{
return ((dec / 10) << 4) | (dec % 10);
}
void ds3231_read_time(uint8_t *hour, uint8_t *min, uint8_t *sec)
{
uint8_t buf[7];
// 读取寄存器0x00-0x06
uint8_t reg = 0x00;
HAL_I2C_Master_Transmit(&hi2c, DS3231_ADDR << 1, ®, 1, 100);
HAL_I2C_Master_Receive(&hi2c, DS3231_ADDR << 1, buf, 7, 100);
*sec = bcd_to_dec(buf[0]);
*min = bcd_to_dec(buf[1]);
*hour = bcd_to_dec(buf[2] & 0x3F); // 24小时模式
}
void ds3231_set_time(uint8_t hour, uint8_t min, uint8_t sec)
{
uint8_t buf[8];
buf[0] = 0x00; // 起始寄存器地址
buf[1] = dec_to_bcd(sec);
buf[2] = dec_to_bcd(min);
buf[3] = dec_to_bcd(hour);
HAL_I2C_Master_Transmit(&hi2c, DS3231_ADDR << 1, buf, 4, 100);
}
// 读取温度(DS3231内置温度传感器)
float ds3231_read_temp(void)
{
uint8_t buf[2];
uint8_t reg = 0x11;
HAL_I2C_Master_Transmit(&hi2c, DS3231_ADDR << 1, ®, 1, 100);
HAL_I2C_Master_Receive(&hi2c, DS3231_ADDR << 1, buf, 2, 100);
int16_t temp = (buf[0] << 8) | buf[1];
return temp / 256.0;
}