У меня возникла проблема с настройкой аварийной сигнализации RTC. Прежде всего, я попробовал пример кода, который предоставлен Cube, и он работает. Но в моем коде это вообще не работает. Я предполагаю, что форматы RTC не совпадают. даже несмотря на это, я пробовал все возможности как BCD, так и BIN.STM32 HAL Library RTC Alarm
Время чтения & Функции даты работают. Я могу показать их на экране OLED. Но не может генерировать прерывание сигнала тревоги. Что я делаю не так?
void StartRTC_Routine(void)
{
HAL_PWR_EnableBkUpAccess();
__HAL_RCC_RTC_ENABLE();
hrtc.Instance = RTC;
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = 127;
hrtc.Init.SynchPrediv = 255;
if(HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR0) != RTC_BKP_DATE_TIME_UPDTATED)
{
/*RTC Init*/
MX_RTC_Init();
RTC_Default();
HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR0,RTC_BKP_DATE_TIME_UPDTATED);
}
else
{
/* Check if the Power On Reset flag is set */
if(__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) != RESET)
{
MyFlag = 0xBA;
}
/* Check if the Soft Reset flag is set */
if(__HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST) != RESET)
{
MyFlag = 0xFB;
}
}
}
void RTC_TimeShow(uint8_t* showtime)
{
/* Get the RTC current Time */
HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BCD);
/* Display time Format : hh:mm:ss */
sprintf((char*)showtime,"%02X:%02X:%02X",stimestructureget.Hours, stimestructureget.Minutes, stimestructureget.Seconds);
ssd1306_SetCursor(20,20);
ssd1306_WriteString((char*)showtime,Font_11x18,White);
ssd1306_UpdateScreen();
}
/* Initial Values of RTC **/
void RTC_Default(void)
{
sdatestructureget.Date = 0x14;
sdatestructureget.Year = 0x17;
sdatestructureget.WeekDay = 0x05;
sdatestructureget.Month = 0x01;
stimestructureget.Hours = 0x02;
stimestructureget.Minutes = 0x04;
stimestructureget.Seconds = 0x30;
stimestructureget.TimeFormat = RTC_HOURFORMAT_24;
stimestructureget.DayLightSaving = RTC_DAYLIGHTSAVING_NONE ;
stimestructureget.StoreOperation = RTC_STOREOPERATION_RESET;
HAL_RTC_SetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BCD);
HAL_RTC_SetTime(&hrtc, &stimestructureget, RTC_FORMAT_BCD);
}
void Set_Alarm(void)
{
/*################# Configure the RTC Alarm peripheral #################*/
salarmstructure.Alarm = RTC_ALARM_A;
salarmstructure.AlarmDateWeekDay = RTC_WEEKDAY_MONDAY;
salarmstructure.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_WEEKDAY;
salarmstructure.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY;
salarmstructure.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;
salarmstructure.AlarmTime.TimeFormat = RTC_HOURFORMAT_24;
salarmstructure.AlarmTime.Hours = 0x02;
salarmstructure.AlarmTime.Minutes = 0x34;
salarmstructure.AlarmTime.Seconds = 0x10;
salarmstructure.AlarmTime.SubSeconds = 00;
HAL_RTC_SetAlarm_IT(&hrtc,&salarmstructure,RTC_FORMAT_BCD);
}
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{
/* Turn LED2 on: Alarm generation */
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
}
Отладчик - ваш друг. Подсказка: STM32 «HAL» - это всего лишь куча вирусов и не очень портативная, как она утверждает. Избавьтесь от него и запрограммируйте регистры непосредственно в драйвере. Таким образом вам нужно только справочное руководство, а не документальное подтверждение этого мусора. – Olaf