Аварийный сигнал RTC библиотеки STM32 HAL

У меня проблема с настройкой RTC Alarm. Прежде всего, я попробовал пример кода, который предоставляется Cube, и он работает. Но в моем коде это вообще не работает. Я предполагаю, что форматы RTC не совпадают. Тем не менее, я перепробовал все возможности как BCD, так и BIN.

Функции чтения времени и даты работают. Я могу показать их на 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);
}

person ree    schedule 15.01.2017    source источник


Ответы (2)


Вот некоторые вещи, которые вы можете проверить:

  • Убедитесь, что вы вызываете Set_Alarm (), поскольку я не вижу вызова функции в вашем примере кода.
  • Попробуйте настроить будильник так, чтобы он срабатывал каждую секунду, и установите точку останова в HAL_RTC_AlarmAEventCallback () и посмотрите, запускается ли функция.
person Justegard    schedule 15.01.2017

Вам необходимо включить конфигурацию NVIC для RTC, чтобы использовать методы _IT (например, HAL_RTC_SetAlarm_IT). Если вы используете CubeMx, это можно сделать просто в Configuration -> RTC, затем перейдите в NVIC.

person Colateral    schedule 16.11.2018