STM32 RTC là một ngoại vi giúp cho vi điều khiển có thể chạy được các tác vụ thời gian thực như tính toán ngày, tháng, năm, phút giây mà không cần đến các chip thời gian thực khác như DS3231, DS1307…
Bài 13 trong serie Học lập trình STM32 từ A tới Z
RTC là gì?
RTC hay Real Time Clock là ngoại vi sử dụng như một bộ đồng hồ – lịch thời gian thực. Thuật ngữ thời gian thực là chỉ thời gian trong cuộc sống của con người hằng ngày, chứ không phải thời gian trong tính toán như các Timer khác.
Để bộ RTC có thể hoạt động chúng ta cần nối chân Vbat của vi điều khiển với một nguồn 3V, thường sử dụng Pin Cmos, nguồn điện này giúp duy trì xung RTC hoạt động bình thường.
real time clock được ứng dụng rất nhiều trong nhúng
Ưu nhược điểm của RTC on chip so với các IC RTC khác như DS3231, DS1307
Ưu điểm:
- Tiết kiệm chi phí linh kiện, góp phần giảm giá thành sản phẩm
- Có thể sử dụng thanh ghi Backup 16bit như 1 Eprom điều mà STM32 thiếu
Nhược điểm
- Sai số từ bộ dao động lớn (1%), khi chạy lâu dài sẽ dẫn tới sai thời gian
Các thông số chính của STM32 RTC
- Có thể cấu hình Clock đầu vào theo 3 nguồn đó là: LSE, HSE, LSI
- Bộ chia clock lên đến 20 bit, giúp bộ RTC hoạt động chính xác.
- Độ phân giải của timer RTC lên đến 32 bit – tức là 2^32 giây mới tràn và cần reset lại.
- 3 nguồn clock source có thể được sử dụng.
- 2 loại Reset RTC riêng biệt.
- Có các ngắt hỗ trợ là : ngắt Alarm, ngắt mỗi giây, ngắt tràn bộ đếm.
Trong bài hướng dẫn này, mình sẽ hướng dẫn các bạn tạo ra một chiếc đồng hồ chạy thời gian thực, nó sẽ vẫn chạy dù cho nguồn vi điều khiển có bị mất hay không. Bắt đầu nhé
Cấu hình STM32 RTC tạo đồng hồ thời gian thực
Để bắt đầu ta sẽ cấu hình STM32 RTC trong Cube MX
Trong Tab System Core, chọn RCC là HSE
Tab SYS, chọn Debug là Serial Wire
Tab RTC tích chọn Active Source Clock để bật bộ RTC, chọn Active Calendar để cấu hình ngày giờ bắt đầu cho RTC, chọn Tamper nếu sử dụng chân Tamper làm chân xuất tín hiệu RTC Out
Trong tab cấu hình
- Data Fomat chọn là Binary data format: Định dạng cho thời gian là kiểu số nhị phân
- Time, minutes, sec: thời gian ban đầu của hệ thống
- Day, date, week, …: Lịch ban đầu của hệ thông
- Các tab còn lại là cấu hình xung đầu ra cho RTC
Mở phần mềm lên và chọn chip STM32F103C8T6, cấu hình Clock và HSE, Cấu hình Clock cho RTC là HSE
Chuyển sang Project đặt tên và Gen Code
Lập trình STM32 RTC trong Keil C
Mở project đã tạo lên.
Trong phần cấu hình MX_RTC_Init(), ta sử dụng hai hàm Read và Write Backup Register. Công dụng của đoạn code này chính là, nếu Time và Date đã được ghi, thanh ghi RTC_BKP_DR1 sẽ có dữ liệu = 0x2608 (Số này tùy chọn), thanh ghi này sẽ không mất dữ liệu nếu chân Vbat được cấp 3V. Vì vậy ta chỉ có thể ghi dữ liệu vào RTC 1 lần mà thôi, khi reset MCU, dữ liệu thời gian, ngày tháng sẽ không bị ghi đè.
Copy đoạn code ghi dữ liệu vào RTC
Paste vào trong if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) == 0x2608) , cuối cùng sử dụng HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0x2608); để ghi vào BKP_DR1
Phía trên main() tạo 2 biến toàn cục dạng struct lưu thời gian và ngày tháng
Trong While(1) chúng ta sẽ đọc giá trị của thanh ghi RTC vào 2 biến đó
Nhấn F7 để build trương trình, F8 để nạp code vào Kit
Kết nối phần cứng cho STM32 RTC
Để RTC có thể hoạt động được chúng ta cần nối Vbat với Pin 3V, đảm bảo rằng chân đó luôn có điện
Sau khi nạo chương trình vào chip nhấn vào Debug, Chọn các biến sTime, sDate cho vào Watch 1.
Run trong debug mode để xem sự thay đổi của các biến
Ta thấy rằng đồng hồ đã bắt đầu đếm số giây. Nhấn reset mạch, ta thấy rằng thời gian không bị reset về giá trị set ban đầu => Thanh ghi BKP không bị mất dữ liệu.
Kết
STM32 RTC rất dễ học, được ứng dụng rất nhiều, các bạn có thể sử dụng nó làm một chiếc đồng hồ báo thức thông minh, một lịch vạn niên hiển thị cả ngày, tháng, năm.
Hi vọng kiến thức vừa rồi có thể giúp ích được cho các bạn, hẹn gặp lại vào các bài tiếp theo.
i like this awesome post
Thank for reading!
Khi reset kit, sTime không set lại giá trị ban đầu, nhưng sDate thì có, vì sao vậy, thk!