29 #include <libopencm3/stm32/rcc.h>
30 #include <libopencm3/stm32/gpio.h>
31 #include <libopencm3/stm32/i2c.h>
32 #include <libopencm3/cm3/nvic.h>
33 #include <libopencmsis/core_cm3.h>
34 #include <libopencm3/stm32/timer.h>
39 #if defined(RTC_DS1307_SQUARE_WAVE_TICKS)
49 rcc_periph_clock_enable(RCC_AFIO);
59 #if defined(RTC_DS1307_SQUARE_WAVE_TICKS)
91 bool to_return =
false;
92 if (data==NULL || len==0) {
114 for (
size_t i=0; i<len; i++) {
135 uint8_t data[1] = {0};
142 uint16_t to_return = 0;
143 uint8_t data[1] = {0};
144 const uint16_t rtc_ds1307_rs[] = {1, 4096, 8192, 32768};
147 to_return = rtc_ds1307_rs[data[0]&0x03];
156 uint8_t to_return = 0;
157 uint8_t data[1] = {0};
159 to_return = ((data[0]&0x70)>>4)*10+(data[0]&0x0f);
165 uint8_t to_return = 0;
166 uint8_t data[1] = {0};
168 to_return = (data[0]>>4)*10+(data[0]&0x0f);
174 uint8_t to_return = 0;
175 uint8_t data[1] = {0};
181 to_return += ((data[0]&0x10)>>4)*10;
183 to_return = ((data[0]&0x30)>>4)*10;
185 to_return += (data[0]&0x0f);
191 uint8_t to_return = 0;
192 uint8_t data[1] = {0};
194 to_return = (data[0]&0x07);
200 uint8_t to_return = 0;
201 uint8_t data[1] = {0};
203 to_return = ((data[0]&0x30)>>4)*10+(data[0]&0x0f);
209 uint8_t to_return = 0;
210 uint8_t data[1] = {0};
212 to_return = ((data[0]&0x10)>>4)*10+(data[0]&0x0f);
218 uint8_t data[1] = {0};
220 uint8_t to_return = ((data[0]&0xf0)>>4)*10+(data[0]&0x0f);
226 static uint8_t time[7] = {0};
227 uint8_t data[7] = {0};
229 time[0] = ((data[0]&0x70)>>4)*10+(data[0]&0x0f);
230 time[1] = (data[1]>>4)*10+(data[1]&0x0f);
236 time[2] += ((data[2]&0x10)>>4)*10;
238 time[2] = ((data[2]&0x30)>>4)*10;
240 time[2] += (data[2]&0x0f);
241 time[3] = (data[3]&0x07);
242 time[4] = ((data[4]&0x30)>>4)*10+(data[4]&0x0f);
243 time[5] = ((data[5]&0x10)>>4)*10+(data[5]&0x0f);
244 time[6] = ((data[6]&0xf0)>>4)*10+(data[6]&0x0f);
256 bool to_return =
false;
257 if (data==NULL || len==0) {
272 for (
size_t i=0; i<len; i++) {
287 uint8_t data[1] = {0};
295 uint8_t data[1] = {0};
303 uint8_t data[1] = {0};
331 uint8_t data[1] = {0};
336 data[0] |= (((seconds/10)%6)<<4)+(seconds%10);
345 uint8_t data[1] = {0};
346 data[0] = (((minutes/10)%6)<<4)+(minutes%10);
355 uint8_t data[1] = {0};
356 data[0] = (((hours/10)%3)<<4)+(hours%10);
362 if (day<1 || day>7) {
365 uint8_t data[1] = {0};
372 if (date<1 || date>31) {
375 uint8_t data[1] = {0};
376 data[0] = (((date/10)%4)<<4)+(date%10);
382 if (month<1 || month>12) {
385 uint8_t data[1] = {0};
386 data[0] = (((month/10)%2)<<4)+(month%10);
395 uint8_t data[1] = {0};
396 data[0] = (((year/10)%10)<<4)+(year%10);
400 bool rtc_ds1307_write_time(uint8_t seconds, uint8_t minutes, uint8_t hours, uint8_t day, uint8_t date, uint8_t month, uint8_t year)
402 uint8_t data[7] = {0};
411 data[0] |= (((seconds/10)%6)<<4)+(seconds%10);
416 data[1] = (((minutes/10)%6)<<4)+(minutes%10);
421 data[2] = (((hours/10)%3)<<4)+(hours%10);
423 if (day<1 || day>7) {
428 if (date<1 || date>31) {
431 data[4] = (((date/10)%4)<<4)+(date%10);
433 if (month<1 || month>12) {
436 data[5] = (((month/10)%2)<<4)+(month%10);
441 data[6] = (((year/10)%10)<<4)+(year%10);
446 #if defined(RTC_DS1307_SQUARE_WAVE_TICKS)
#define RTC_DS1307_I2C_PORT
I2C I/O peripheral port.
bool rtc_ds1307_write_date(uint8_t date)
write date into RTC IC
#define RTC_DS1307_SQUARE_WAVE_TIMER_IRQ
timer interrupt
#define RTC_DS1307_SQUARE_WAVE_TIMER
timer peripheral
#define RTC_DS1307_SQUARE_WAVE_FREQUENCY
square wave output frequency from the RTC IC
#define RTC_DS1307_SQUARE_WAVE_TICKS
number of square wave tics before setting rtc_ds1307_tic_flag
void rtc_ds1307_setup(void)
setup communication with RTC IC configure the I2C port defined in the sources
bool rtc_ds1307_write_time(uint8_t seconds, uint8_t minutes, uint8_t hours, uint8_t day, uint8_t date, uint8_t month, uint8_t year)
write time into RTC IC
bool rtc_ds1307_write_year(uint8_t year)
write year into RTC IC
#define RTC_DS1307_SQUARE_WAVE_TIMER_TS
input capture trigger (actually TI1FP1)
static bool rtc_ds1307_read_memory(uint8_t addr, uint8_t *data, size_t len)
read memory from RTC IC
#define RTC_DS1307_SQUARE_WAVE_GPIO_RCC
timer port peripheral clock (TIM2_CH1 on PA0)
bool rtc_ds1307_oscillator_enable(void)
enable RTC IC oscillator
uint16_t rtc_ds1307_read_square_wave(void)
read square wave output frequency (in Hz)
bool rtc_ds1307_write_month(uint8_t month)
write month into RTC IC
bool rtc_ds1307_write_minutes(uint8_t minutes)
write minutes into RTC IC
volatile bool rtc_ds1307_tick_flag
set on SQUARE_WAVE_TICS square wave ticks
#define RTC_DS1307_SQUARE_WAVE_GPIO_PIN
timer pin input, connect to RTC IC square wave output (TIM2_CH1 on PA0)
#define RTC_DS1307_SQUARE_WAVE_TIMER_IC
input capture channel (for TIM2_CH1)
global definitions and methods
uint8_t rtc_ds1307_read_month(void)
read month from RTC IC
#define RTC_DS1307_SQUARE_WAVE_TIMER_IN
input capture input source (TIM2_CH1 becomes TI1, then TI1F, then TI1FP1)
uint8_t rtc_ds1307_read_year(void)
read year from RTC IC
uint8_t * rtc_ds1307_read_time(void)
read time from RTC IC
uint8_t rtc_ds1307_read_seconds(void)
read seconds from RTC IC
bool rtc_ds1307_oscillator_disable(void)
disable RTC IC oscillator
void RTC_DS1307_SQUARE_WAVE_TIMER_ISR(void)
timer interrupt service routine called when number of ticks have been received
#define RTC_DS1307_I2C_RCC
I2C peripheral clock.
bool rtc_ds1307_write_day(uint8_t day)
write day into RTC IC
bool rtc_ds1307_write_hours(uint8_t hours)
write hours into RTC IC
#define RTC_DS1307_I2C_PIN_SDA
I2C peripheral data pin (PB7)
uint8_t rtc_ds1307_read_date(void)
read date from RTC IC
bool rtc_ds1307_write_seconds(uint8_t seconds)
write seconds into RTC IC
static bool rtc_ds1307_write_memory(uint8_t addr, uint8_t *data, size_t len)
write memory into RTC IC
#define RTC_DS1307_I2C_PIN_SCL
I2C peripheral clock pin (PB6)
#define RTC_DS1307_SQUARE_WAVE_TIMER_RCC
timer peripheral clock
uint8_t rtc_ds1307_read_day(void)
read day from RTC IC
volatile uint32_t rtc_ds1307_ticks
increment on SQUARE_WAVE_TICS square wave ticks
#define LENGTH(x)
get the length of an array
#define RTC_DS1307_I2C
I2C peripheral.
#define RTC_DS1307_SQUARE_WAVE_GPIO_PORT
timer port (TIM2_CH1 on PA0)
#define RTC_DS1307_I2C_ADDR
DS1307 I2C address (fixed to 0b1101000)
#define RTC_DS1307_I2C_PORT_RCC
I2C I/O peripheral clock.
bool rtc_ds1307_oscillator_disabled(void)
verify if oscillator is disabled
library to communicate with the Maxim DS1307 I2C RTC IC (API)
bool rtc_ds1307_write_square_wave(uint16_t frequency)
write square wave output frequency (in Hz)
uint8_t rtc_ds1307_read_hours(void)
read hours from RTC IC
uint8_t rtc_ds1307_read_minutes(void)
read minutes from RTC IC