Saya mengalami masalah tentang konfigurasi Alarm RTC. Pertama-tama, saya mencoba contoh kode yang disediakan oleh Cube, dan berhasil. Namun dalam kode saya, itu tidak berfungsi sama sekali. Saya kira format RTC tidak cocok. Meski begitu, saya mencoba segala kemungkinan baik BCD maupun BIN.
Fungsi Membaca Waktu & Tanggal berfungsi. Saya dapat menampilkannya di layar OLED. Namun tidak dapat menghasilkan interupsi alarm. Apa yang saya lakukan salah?
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);
}