Bài 13: Lập trình STM32 RTC – Real Time Clock

Lập trình stm32 rtc đồng hồ thời gian thực

STM32 RTC là một ngoại vi giúp 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, giờ, 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 được sử dụng như một bộ đồng hồ – lịch thời gian thực. Thuật ngữ thời gian thực ở đây là chỉ thời gian trong cuộc sống hằng ngày của con người, chứ không phải thời gian dùng để tính toán như các Timer khác.

Để bộ RTC vẫn hoạt động khi mất nguồn chính, 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 dùng pin CMOS (CR2032). Nguồn điện này giúp duy trì bộ RTC và các thanh ghi Backup. Giống như chiếc đồng hồ trên bo mạch chủ máy tính: rút điện ra cắm lại vẫn đúng giờ là nhờ viên pin CMOS nhỏ xíu đó.

 

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 các thanh ghi Backup 16 bit như 1 bộ nhớ EEPROM nhỏ, thứ mà STM32F1 không có

Nhược điểm:

  • Sai số từ bộ dao động lớn hơn (dùng LSI sai số có thể tới vài %), 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: LSE, HSE/128, LSI
  • Bộ chia clock lên đến 20 bit, giúp bộ RTC hoạt động chính xác
  • Bộ đếm RTC dài 32 bit, tức là 2^32 giây (khoảng 136 năm) mới tràn và cần reset lại
  • 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, vẫn giữ được giờ khi vi điều khiển bị reset. 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 CubeMX.

Trong tab System Core, chọn RCC là HSE.

STM32 RTC RCC

Tab SYS, chọn Debug là Serial Wire.

 

STM32 RTC SYS

Tab RTC tích chọn Activate Clock Source để bật bộ RTC, chọn Activate 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 Format chọn là Binary data format: định dạng thời gian là kiểu số nhị phân
  • Hours, Minutes, Seconds: 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

STM32 RTC cau hinh

Trong tab Clock Configuration, cấu hình Clock hệ thống dùng HSE và chọn Clock cho RTC là HSE.

STM32 RTC Clock source

Lưu ý: Trên STM32F1, khi mất nguồn chính (chỉ còn pin ở VBAT), bộ dao động HSE và LSI đều tắt, chỉ có LSE (thạch anh 32.768kHz nối PC14, PC15, Blue Pill có sẵn) là còn chạy. Vì vậy nếu chọn RTC clock là HSE như trên, đồng hồ chỉ giữ được giờ khi nhấn reset, còn rút nguồn thì RTC sẽ dừng đếm. Muốn đồng hồ chạy cả khi mất điện, các bạn bật LSE trong RCC và chọn RTC clock là LSE nhé.

Chuyển sang Project Manager đặt tên và Gen Code.

STM32 RTC Gen code

Lập trình STM32 RTC trong Keil C

Mở project đã tạo lên.

Trong hàm cấu hình MX_RTC_Init(), ta sử dụng hai hàm đọc và ghi Backup Register. Ý tưởng như sau: sau khi Time và Date đã được ghi lần đầu, ta ghi vào thanh ghi RTC_BKP_DR1 giá trị 0x2608 (số này tùy chọn) để đánh dấu. Thanh ghi này không mất dữ liệu khi reset nếu chân VBAT được cấp 3V. Lần khởi động sau thấy đã có dấu thì bỏ qua, nhờ vậy thời gian chỉ được ghi vào RTC 1 lần, reset MCU sẽ không bị ghi đè lại giờ cũ.

Copy đoạn code ghi dữ liệu vào RTC.

RTC coppy set time

Paste vào trong khối if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) != 0x2608) (nghĩa là chưa từng ghi giờ), cuối khối đó sử dụng HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0x2608); để ghi dấu vào BKP_DR1.

RTC Backup check

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.

RTC tao bien

Trong while(1) chúng ta sẽ đọc giá trị của RTC vào 2 biến đó.

RTC while

Lưu ý: Phải gọi HAL_RTC_GetTime() trước rồi mới gọi HAL_RTC_GetDate(). Ngoài ra thư viện HAL của STM32F1 chỉ lưu giờ phút giây trong bộ đếm phần cứng, còn ngày tháng năm được giữ trong biến RAM, nên sau khi reset ngày có thể quay về giá trị cũ. Ứng dụng cần lịch chính xác thì nên tự lưu ngày tháng vào các thanh ghi Backup.

Nhấn F7 để build chươ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 khi mất nguồn chính, chúng ta cần nối VBAT với pin 3V, đảm bảo chân đó luôn có điện.

stm32 rtc vbat

Trên KIT Blue Pill, các bạn nối pin CR2032 như sơ đồ sau: cực dương vào chân VBAT, cực âm vào GND.

Sơ đồ đấu nối pin CR2032 3V vào chân VBAT và GND của STM32F103C8T6 Blue Pill để nuôi RTC khi mất nguồn

Sau khi nạp 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.

RTC debug

Run trong chế độ Debug để xem sự thay đổi của các biến.

RTC Time

 

Ta thấy rằng đồng hồ đã bắt đầu đếm giây. Nhấn reset mạch, thời gian không bị quay về giá trị cài đặt ban đầu => thanh ghi BKP không bị mất dữ liệu.

Kết

STM32 RTC rất dễ học và đượ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, hay 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 trong các bài tiếp theo nhé!

4.7/5 - (4 bình chọn)

4 những suy nghĩ trên “Bài 13: Lập trình STM32 RTC – Real Time Clock”

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *