2017-10-31 7 views
0

FreeRTOSを使用しているstm32L476のRTCで異常な動作をしています。stm32l4 RTC HALが機能しない

実行時に内部レジスタの値をセーブして上がっているため、RUNモードで最初に読み込むだけです.RTCが動作しています。また

私はライン583でstm32l4xx_hal_rtc.cにブレークポイントを置くとき、私はDEBUGを行う場合:

tmpreg = (uint32_t)(hrtc->Instance->TR & RTC_TR_RESERVED_MASK);  
*breakpoint* sTime->Hours = (uint8_t)((tmpreg & (RTC_TR_HT | RTC_TR_HU)) >> 16); 
私はtmpregを見ることができますし、私は次のブレークポイント魔女へのジャンプをクリックしたとき、彼らは更新登録方法、およびTR

私はディスプレイが更新されたのを見たのと同じです。

だから、通常のRUNで動作しないのはなぜですか?

初期化コード(MXが生成キューブ):

void MX_RTC_Init(void) 
{ 
    RTC_TimeTypeDef sTime; 
    RTC_DateTypeDef sDate; 

    /**Initialize RTC Only 
    */ 
    hrtc.Instance = RTC; 
    hrtc.Init.HourFormat = RTC_HOURFORMAT_24; 
    hrtc.Init.AsynchPrediv = 127; 
    hrtc.Init.SynchPrediv = 255; 
    hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; 
    hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE; 
    hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; 
    hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; 
    if (HAL_RTC_Init(&hrtc) != HAL_OK) 
    { 
    _Error_Handler(__FILE__, __LINE__); 
    } 

    /**Initialize RTC and set the Time and Date 
    */ 
    if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0) != 0x32F2){ 
    sTime.Hours = 0; 
    sTime.Minutes = 0; 
    sTime.Seconds = 0; 
    sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; 
    sTime.StoreOperation = RTC_STOREOPERATION_RESET; 
    if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK) 
    { 
    _Error_Handler(__FILE__, __LINE__); 
    } 

    sDate.WeekDay = RTC_WEEKDAY_MONDAY; 
    sDate.Month = RTC_MONTH_JANUARY; 
    sDate.Date = 1; 
    sDate.Year = 0; 

    if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK) 
    { 
    _Error_Handler(__FILE__, __LINE__); 
    } 

    HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR0,0x32F2); 
    } 

} 

void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle) 
{ 

    if(rtcHandle->Instance==RTC) 
    { 
    /* USER CODE BEGIN RTC_MspInit 0 */ 

    /* USER CODE END RTC_MspInit 0 */ 
    /* RTC clock enable */ 
    __HAL_RCC_RTC_ENABLE(); 
    /* USER CODE BEGIN RTC_MspInit 1 */ 

    /* USER CODE END RTC_MspInit 1 */ 
    } 
} 

クロックreaded、すべてこのタスクおよび機能が同じmenu.cにある印刷されたタスク:

void MenuTask(void const *argument){ 
    for(;;){ 

     /* 
     * Menus 
     */ 
     DrawMenu(); 

     osDelay(100); 
    } 
} 

void DrawMenu(){ 
    switch(menuTaskStatus){ 

/* Not important code */ 

    case MENU_INFO: 
     menuInfoBar(); 

     break; 

    } 
} 

私に印刷液晶は、中に時計を持つバー

void menuInfoBar(){ 

    //Clock 
    CheckClock(); 
    if(updateNeeded.Clock){ 
     DrawClock(); 
     updateNeeded.Clock = 0; 
    } 

} 

私はトライを持っていることがわかりますシンクロを待つだけでなく動作しませんでした。私はこのシンクロとRTCの読書がどのように働くのかについて疑問を抱いています。

void CheckClock(){ 
    RTC_TimeTypeDef timeVar; 
    // HAL_GPIO_TogglePin(LEDR_GPIO_Port, LEDR_Pin); 
// if(HAL_RTC_WaitForSynchro(&hrtc) == HAL_OK){ 
     while(HAL_RTC_GetTime(&hrtc,&timeVar,RTC_FORMAT_BIN)!= HAL_OK); 
     if(timeVar.Seconds != timeVarAnt.Seconds){ 
      timeVarAnt.Minutes = timeVar.Minutes; 
      timeVarAnt.Hours = timeVar.Hours; 
      timeVarAnt.Seconds = timeVar.Seconds; 
      updateNeeded.Clock = 1; 
     } 
// } 
} 

ここで私は私のディスプレイに

void DrawClock(){ 
    DISP_locate(49,0); 
    sprintf((char *)stringBuffer,"%02d:%02d:%02d",(int)timeVarAnt.Hours,(int)timeVarAnt.Minutes,(int)timeVarAnt.Seconds); 
    DISP_puts((char *)stringBuffer); 
} 

をクロックを描くことは、私は100ミリ秒と高速なRTCを読み取ることができない可能性は? なぜ私はsyncronitzationが必要なのですか?データシートでは、クロックが7倍速い場合は、80MHzのAPB1クロックを使用しています。

いくつかのチュートリアルとサンプル私は正確に同じことを実行しましたが、osDelay多くの値の()。 freeRTOSを使用してタスクを読み込む際に問題がありますか?

時間は、私は5秒遅れで試してみた何の関係もありませんし、また

おかげ

+0

- ちょうどこのHALのブロートウェア? –

+0

私はハードウェアの専門家です。ソフトウェアでできる時間を無駄にしたくありません。しかし、このナンセンスの問題がすべて解決された後、私は、HALライブラリがSTが望む賢明なソリューションではないことを確信しています。 – taquionbcn

+0

周辺機器の知識なしにuCを使用することはできません。 HALを使用しても変更されませんが、不可能です。そして、終わりにはあなたはuCと非常に貧弱なバグ、不具合、そして奇妙なHALライブラリが書かれていることを学ぶ必要があります。だから、あなたは多くの時間を無駄にしています。ベアメタル方法をプログラミングする人々からの質問はほとんどないことに気付きましたか?HAL –

答えて

0

この回答は答えがない理由ST「HAL」はない作品を行う動作しますが、それはありませんRTCを使用して私が必要とするものを解決します。

これは私の新しいCheckClock関数です:あなたはレジスタを使用していないのはなぜ

void CheckClock(){ 

    uint32_t tmpreg = (uint32_t) hrtc.Instance->TR; 

    /* Fill the structure fields with the read parameters */ 
    timeVar.Hours = (uint8_t)((tmpreg & (RTC_TR_HT | RTC_TR_HU)) >> 16); 
    timeVar.Minutes = (uint8_t)((tmpreg & (RTC_TR_MNT | RTC_TR_MNU)) >>8); 
    timeVar.Seconds = (uint8_t)(tmpreg & (RTC_TR_ST | RTC_TR_SU)); 

    if(timeVar.Seconds != timeVarAnt.Seconds){ 
     HAL_GPIO_TogglePin(LEDR_GPIO_Port, LEDR_Pin); 
     timeVarAnt.Minutes = timeVar.Minutes; 
     timeVarAnt.Hours = timeVar.Hours; 
     timeVarAnt.Seconds = timeVar.Seconds; 
     updateNeeded.Clock = 1; 
    } 
} 

おかげ