2017-10-31 118 views
0

FreeRTOS가있는 stm32L476에서 RTC와 이상한 동작이 발생합니다.stm32l4 RTC HAL이 작동하지 않습니다.

처음부터 RUN 모드에서만 읽습니다. RTC가 실행될 때마다 내부 레지스터의 값을 저장하고 올라 가기 때문에 RTC가 작동합니다. 또한

I 라인 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

디스플레이가 업데이트 된 것을 본 것과 같습니다.

그렇다면 정상적인 작동 상태에서 작동하지 않는 이유는 무엇입니까?

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 */ 
    } 
} 

작업이 시계가 읽혀질되는 경우이 모든 작업을 인쇄 기능은 동일 menu.c에 있습니다 : :

초기화 코드 (큐브 MX 생성)

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

     /* 
     * Menus 
     */ 
     DrawMenu(); 

     osDelay(100); 
    } 
} 

void DrawMenu(){ 
    switch(menuTaskStatus){ 

/* Not important code */ 

    case MENU_INFO: 
     menuInfoBar(); 

     break; 

    } 
} 

나는 인쇄 LCD는 중간에 시계가 달린 막대기입니다.

void menuInfoBar(){ 

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

} 

여기에 문제가되는 부분이 있습니다. 싱크로를 기다리지 만 또한 작동하지 않았다. 이 syncro 및 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); 
} 

그것은 내가이 100ms로 빠른 RTC를 읽을 수 없습니다 가능성이 내 화면에 시계를 그려? 왜 어떤 사람들은 내게 동기 부여가 필요한지 설명 할 수 있습니까? 데이터 시트는 시계가 7 시간 더 빠르면 ok입니다. 저는 80MHz APB1 클럭을 사용하고 있습니다.

일부 튜토리얼과 예제는 제가했던 것과 똑같은 것을 찾았지만 osDelay() 많은 가치의. freeRTOS를 사용하고 작업에서 읽는 데 문제가 있습니까?

시간이 나는

감사

+0

왜 레지스터를 사용하지 마십시오 - 그냥이 HAL의 블로 트웨어를? –

+0

저는 하드웨어 전문가로서 가능한 적은 시간을 소프트웨어로 낭비하고 싶습니다. 그러나이 모든 말도 안되는 문제들 후에 나는 HAL 라이브러리가 ST가 바라는 똑똑한 솔루션에서 멀리 떨어져 있다는 것을 확신하게되었습니다. – taquionbcn

+0

주변 장치 지식 없이는 uC를 사용할 수 없습니다. HAL을 사용하여 변경하지 않더라도 불가능합니다. 그리고 하루가 끝나면 당신은 버그와 결함, 이상한 HAL 라이브러리로 가득 찬 uC & 매우 가난한 문서를 배워야합니다. 그래서 당신은 많은 시간을 낭비하고 있습니다.베어 메탈 방식을 프로그래밍하는 사람들로부터 거의 질문이 없다는 것을 알고 계셨습니까? HAL –

답변

0

이 대답을 5 초 지연 시도하고도하지 작동 할 무관하지 같다 "복도"없는 일을 왜 대답하지만, 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; 
    } 
} 

감사