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를 사용하고 작업에서 읽는 데 문제가 있습니까?
시간이 나는
감사
왜 레지스터를 사용하지 마십시오 - 그냥이 HAL의 블로 트웨어를? –
저는 하드웨어 전문가로서 가능한 적은 시간을 소프트웨어로 낭비하고 싶습니다. 그러나이 모든 말도 안되는 문제들 후에 나는 HAL 라이브러리가 ST가 바라는 똑똑한 솔루션에서 멀리 떨어져 있다는 것을 확신하게되었습니다. – taquionbcn
주변 장치 지식 없이는 uC를 사용할 수 없습니다. HAL을 사용하여 변경하지 않더라도 불가능합니다. 그리고 하루가 끝나면 당신은 버그와 결함, 이상한 HAL 라이브러리로 가득 찬 uC & 매우 가난한 문서를 배워야합니다. 그래서 당신은 많은 시간을 낭비하고 있습니다.베어 메탈 방식을 프로그래밍하는 사람들로부터 거의 질문이 없다는 것을 알고 계셨습니까? HAL –