Estoy usando MCU STM32l151vbt6 y estoy tratando de configurar la alarma RTC cada 15 minutos. (Eso es 0, 15, 30 y 45 minutos de cada hora).
Puedo configurar la alarma y funcionará por primera vez, si intento configurarlo nuevamente después de que se active la alarma, se establecerá en el estado de alarma anterior. Si reinicio la MCU, puedo configurar la alarma y despertará al controlador del modo de parada cuando se produzca la alarma. Déjeme saber cómo puedo configurar la próxima alarma sin reiniciar la MCU.
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/* 8(hour) and 19(day) are masked and there is no effect on the alarm */
RTC_AlarmTypeDef RTC_AlarmStructure =
{
0,
0,
0,
RTC_H12_AM,
(RTC_AlarmMask_DateWeekDay | RTC_AlarmMask_Hours),
RTC_AlarmDateWeekDaySel_Date,
19
};
const uint8_t alarm_interval[4] = { 15, 30, 45, 0 };
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes = alarm_interval[RTC_current_time.minute/15];
/*Alarm A will be configured*/
RTC_Alarm_Config(&RTC_AlarmStructure);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void RTC_Alarm_Config(RTC_AlarmTypeDef *RTC_AlarmStructure)
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
RTC_AlarmCmd(RTC_Alarm_A, DISABLE);
RTC_AlarmCmd(RTC_Alarm_B, DISABLE);//Not using this
/* EXTI configuration */
EXTI_ClearITPendingBit(EXTI_Line17);
EXTI_InitStructure.EXTI_Line = EXTI_Line17;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
/* Enable the RTC Alarm Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = RTC_Alarm_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_A, RTC_AlarmStructure);
/* Clear RTC AlarmA Flags */
RTC_ClearITPendingBit(RTC_IT_ALRA);
/* Enable AlarmA interrupt */
RTC_ITConfig(RTC_IT_ALRA, ENABLE);
/* Enable the alarmA */
RTC_AlarmCmd(RTC_Alarm_A, ENABLE);
}