An STM32 HAL library for the DS3231 real-time clock IC.
- In STM32CubeMX, set I2C1 to "I2C" and USART1 to "asynchronous"
- Set up an external interrupt pin (say PB0) in GPIO settings, use "external interrupt mode with falling edge trigger detection" and "pull-up" settings.
- Activate the external interrupt in NVIC settings by checking the corresponding box.
- Connect pin 3 (INT#/SQW) of the DS3231 to this external interrupt pin.
- Save and generate code.
- In your IDE, include
ds3231_for_stm32_hal.h
andds3231_for_stm32_hal.c
.
- In
main.c
(main program body file), include:
#include "ds3231_for_stm32_hal.h"
- Initialization function:
void DS3231_Init(I2C_HandleTypeDef *hi2c);
- In
main.c
, before the main loop and after the system inits, call the DS3231 init function, and pass the corresponding I2C handle:
DS3231_Init(&hi2c1);
- Date functions:
void DS3231_SetDayOfWeek(uint8_t dow); // <-- Number of days since Sunday, 1 to 7.
void DS3231_SetDate(uint8_t date);
void DS3231_SetMonth(uint8_t month);
void DS3231_SetYear(uint16_t year);
void DS3231_SetFullDate(uint8_t date, uint8_t month, uint8_t dow, uint16_t year);
- Time functions:
void DS3231_SetHour(uint8_t hour_24mode);
void DS3231_SetMinute(uint8_t minute);
void DS3231_SetSecond(uint8_t second);
void DS3231_SetFullTime(uint8_t hour_24mode, uint8_t minute, uint8_t second);
- Set interrupt mode with:
void DS3231_SetInterruptMode(DS3231_InterruptMode mode);
- Options: square wave interrupt and alarm interrupt.
typedef enum DS3231_InterruptMode{
DS3231_SQUARE_WAVE_INTERRUPT, DS3231_ALARM_INTERRUPT
}DS3231_InterruptMode;
- With square wave interrupt mode selected, select interrupting rate with:
void DS3231_SetRateSelect(DS3231_Rate rate);
- Options: 1 Hz, 1.024 kHz, 4.096 kHz or 8.912 kHz.
typedef enum DS3231_Rate{
DS3231_1HZ, DS3231_1024HZ, DS3231_4096HZ, DS3231_8192HZ
}DS3231_Rate;
- With alarm interrupt mode selected, enable/disable alarms with:
void DS3231_EnableAlarm1(DS3231_State enable);
void DS3231_EnableAlarm2(DS3231_State enable);
- Set alarm mode with:
void DS3231_SetAlarm1Mode(DS3231_Alarm1Mode alarmMode);
void DS3231_SetAlarm2Mode(DS3231_Alarm2Mode alarmMode);
- Options modes: (refer to table 2 of datasheets):
typedef enum D3231_Alarm1Mode{
DS3231_A1_EVERY_S = 0x0f, DS3231_A1_MATCH_S = 0x0e, DS3231_A1_MATCH_S_M = 0x0c,
DS3231_A1_MATCH_S_M_H = 0x08, DS3231_A1_MATCH_S_M_H_DATE = 0x00, DS3231_A1_MATCH_S_M_H_DAY = 0x80,
}DS3231_Alarm1Mode;
typedef enum D3231_Alarm2Mode{
DS3231_A2_EVERY_M = 0x07, DS3231_A2_MATCH_M = 0x06, DS3231_A2_MATCH_M_H = 0x04,
DS3231_A2_MATCH_M_H_DATE = 0x00, DS3231_A2_MATCH_M_H_DAY = 0x80,
}DS3231_Alarm2Mode;
- In
stm32f*xx_it.c
(interrupt service routine file), include:
#include "ds3231_for_stm32_hal.h"
- Check for an alarm flag with:
uint8_t DS3231_IsAlarm1Triggered();
uint8_t DS3231_IsAlarm2Triggered();
- Clear an alarm flag with:
void DS3231_ClearAlarm1Flag();
void DS3231_ClearAlarm2Flag();
- Enable 32kHz output:
void DS3231_Enable32kHzOutput(DS3231_State enable);
- Check for status:
uint8_t DS3231_IsOscillatorStopped();
uint8_t DS3231_Is32kHzEnabled();
- Temperature functions:
int8_t DS3231_GetTemperatureInteger();
uint8_t DS3231_GetTemperatureFraction();
- Refer to ./examples (
main.c
,stm32f4xx_it.c
) and datasheets for further information.