2017-01-15 294 views
0

我遇到了有關RTC鬧鐘配置的問題。首先,我嘗試了Cube提供的示例代碼,它可以工作。但在我的代碼中,它根本不起作用。我猜RTC格式不匹配。即使如此,我嘗試了BCD和BIN的所有可能性。STM32 HAL Library RTC鬧鐘

閱讀時間&日期功能正在工作。我可以在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); 
} 
+0

調試器是你的朋友。提示:STM32「HAL」只是一堆英國媒體報道,並不像其聲稱的那樣便攜。擺脫它並直接在驅動程序中編程寄存器。這樣你只需要參考手冊而不需要附加垃圾文件。 – Olaf

回答

0

有些東西你可以檢查:

  • ,請務必讓Set_Alarm(),因爲我看不到你的代碼示例中的函數調用。
  • 嘗試配置您的警報,每秒關閉並在HAL_RTC_AlarmAEventCallback()中設置斷點並查看該函數是否運行。