stm32f0: stm32f1: alarm: implement functionality to enable and disable the alarm with a time-out for resetting the host
parent
40ba5323f3
commit
0542810d22
@ -1,29 +1,56 @@ |
||||
#include <libopencm3/cm3/nvic.h> |
||||
#include <libopencm3/stm32/exti.h> |
||||
#include <libopencm3/stm32/gpio.h> |
||||
#include <libopencm3/stm32/rtc.h> |
||||
|
||||
#include <rtc.h> |
||||
|
||||
static int reset = 0; |
||||
|
||||
void rtc_alarm_isr(void) |
||||
{ |
||||
exti_reset_request(EXTI17); |
||||
|
||||
if (rtc_check_flag(RTC_ALR)) { |
||||
rtc_clear_flag(RTC_ALR); |
||||
|
||||
rtc_set_alarm_time(rtc_get_counter_val() + 10); |
||||
rtc_disable_alarm(); |
||||
exti_reset_request(EXTI17); |
||||
|
||||
if (!reset) { |
||||
reset = 1; |
||||
gpio_set(GPIOA, GPIO1); |
||||
|
||||
EXTI_IMR |= EXTI17; |
||||
exti_set_trigger(EXTI17, EXTI_TRIGGER_RISING); |
||||
rtc_set_alarm_time(rtc_get_counter_val() + 5); |
||||
rtc_enable_alarm(); |
||||
} else { |
||||
reset = 0; |
||||
gpio_set(GPIOA, GPIO1); |
||||
alarm_disable(); |
||||
} |
||||
} |
||||
} |
||||
|
||||
int alarm_init(void) |
||||
int alarm_enable(uint32_t timeout) |
||||
{ |
||||
rtc_enable_alarm(); |
||||
rtc_set_alarm_time(rtc_get_counter_val() + 10); |
||||
rtc_set_alarm_time(rtc_get_counter_val() + timeout); |
||||
|
||||
nvic_enable_irq(NVIC_RTC_ALARM_IRQ); |
||||
EXTI_IMR |= EXTI17; |
||||
exti_enable_request(EXTI17); |
||||
exti_set_trigger(EXTI17, EXTI_TRIGGER_RISING); |
||||
|
||||
nvic_enable_irq(NVIC_RTC_ALARM_IRQ); |
||||
nvic_set_priority(NVIC_RTC_ALARM_IRQ, 1); |
||||
|
||||
rtc_interrupt_enable(RTC_ALR); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
int alarm_disable(void) |
||||
{ |
||||
exti_disable_request(EXTI17); |
||||
nvic_disable_irq(NVIC_RTC_ALARM_IRQ); |
||||
rtc_interrupt_disable(RTC_ALR); |
||||
rtc_disable_alarm(); |
||||
|
||||
return 0; |
||||
} |
||||
|
Loading…
Reference in new issue