Vấn đề về RTC STM32

Em đọc về giá trị RTC thì luôn bằng giá trị đã set , không hề thay đổi sau mỗi giây . Mọi người giúp e hướng xử lý với ạ

while (1)
{
    HAL_RTC_GetTime(&hrtc, &gTime, RTC_FORMAT_BIN);
    printmsg("%02d:%02d:%02d\r\n", gTime.Hours, gTime.Minutes, gTime.Seconds);
    HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN */
}

Phần SetTime

sTime.Hours = 22;
sTime.Minutes = 8;
sTime.Seconds = 10;
sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sTime.StoreOperation = RTC_STOREOPERATION_RESET;
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
{
    Error_Handler();
}
sDate.WeekDay = RTC_WEEKDAY_WEDNESDAY;
sDate.Month = RTC_MONTH_MARCH;
sDate.Date = 24;
sDate.Year = 21;

if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
{
    Error_Handler();
}

Đã khắc phục được , cảm ơn mọi người đã xem.

2 Likes

Chưa enable RTC phải không ? Mình cũng đang tập tành, đọc một nùi mà không hiểu gì hết ?

2 Likes

Khắc phục được thì post lý do và cách sửa lên đi bạn ơi.

3 Likes

Khi mình gọi mỗi hàm
HAL_RTC_GetTime() thì giá trị sẽ luôn giữ nguyên
Nhưng gọi thêm hàm
HAL_RTC_GetDate() thì giá trị sẽ được cập nhật. Mình chỉ khắc phục được chứ lý do tại sao thì mình vẫn chưa hiểu lắm
3

Mình cấu hình bằng CubeMx nên đã Enable rồi b :stuck_out_tongue:

Nếu có gì khúc mắc b có thể đăng lên hoặc liên hệ mình

Vậy thì thử đi tìm lý do đi, hiểu giá trị hơn là làm được.

1 Like

E lại bị trục trặc phần đấy , bác có thể phân tích e biết tại sao không ạ

Tự đọc datasheet đi bạn ơi, mình không biết, lười tìm hiểu =]]

2 Likes

đấy là phần configure, configure xong thì bật cái bit nào đấy của control register, nó mới bắt đầu chạy, thử tìm hàm nào tương ứng xem.

1 Like

Bạn download Reference manual của stm32f4 về, lật tới phần RTC để tham khảo.
Sau khi reset, phải chờ 4 RTCCLK, tuơng ứng với 4s, rồi mới đọc được giá trị.

2 Likes

Tính để bạn @Cuong_Tran_Minh tự tìm hiểu, nhưng mà vì mình thấy bạn @linhnguyen đưa đáp án chưa hợp lý lắm nên mình trả lời theo ý kiến của mình:

STM32 được thiết kế cho việc đọc RTC đồng bộ cả Time và Date để tránh trường hợp user đang đọc time của 23:59:59 của ngày hôm trước rồi lại get Date của ngày hôm sau. Mặc dù trường hợp này có xác suất lỗi cực thấp, nhưng trong trường hợp bạn vô tình dính phải thì hệ thống chạy sai bét nhè.
Do đó, con chip yêu cầu bạn thực hiện 2 lệnh đọc Time và Date mới ra giá trị đúng.

Cụ thể trong datasheet: https://www.st.com/resource/en/reference_manual/dm00119316-stm32f411xc-e-advanced-arm-based-32-bit-mcus-stmicroelectronics.pdf

The RSF bit is set in RTC_ISR register each time the calendar registers are copied into the RTC_SSR, RTC_TR and RTC_DR shadow registers. The copy is performed every two RTCCLK cycles. To ensure consistency between the 3 values, reading either RTC_SSR or RTC_TR locks the values in the higher-order calendar shadow registers until RTC_DR is read. In case the software makes read accesses to the calendar in a time interval smaller than 2 RTCCLK periods: RSF must be cleared by software after the first calendar read, and then the software must wait until RSF is set before reading again the RTC_SSR, RTC_TR and RTC_DR registers.

Wew, khó hiểu đúng không?
Phiên bản dễ hiểu hơn: https://github.com/JoeMerten/Stm32-Tools-Evaluation/blob/e9fd061f48f50501606bc237c6773c2b6c28d345/Stm32F4-MX-copyAll/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c#L554

  * @note You must call HAL_RTC_GetDate() after HAL_RTC_GetTime() to unlock the values 
  *        in the higher-order calendar shadow registers to ensure consistency between the time and date values.
  *        Reading RTC current time locks the values in calendar shadow registers until current date is read.
3 Likes

E cảm ơn , e hiểu rồi ạ . E thật sự kém trong phần đọc những chi tiết này . Sẽ cố gắng để tốt hơn . Cảm ơn a và mọi người

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?