BÀI 13: RTC VỚI STM32F1.



  1. Một số khái niệm về lý thuyết.
  2. RTC(Real time clock ) là bộ thời gian thực được tích hợp sẵn trong STM32F103. Thay vì phải gắn thêm IC thời gian thực để đọc được ngày tháng năm, giờ phút giây thì không phải dùng nó khi dùng STM32F103. Một số ứng dụng chính như làm đồng hồ, mạch kiểm soát thời gian, báo thức, bộ đếm thời gian…
    Bộ RTC này sử dụng timer độc lập, tách biệt với các timer khác. Việc cài đặt thời gian, đọc thời gian cũng trở nên dễ dàng hơn bằng cách tác động trực tiếp vào các thanh ghi thời gian của MCU.
    Nguồn clock cấp cho bộ RTC hoạt động có thể được sử dụng 1 trong 3 nguồn sau:
    • HSE : sử dụng thạch anh ngoài tốc độ cao 62.5 Khz.
    • LSI RC: sử dụng bộ giao động RC nội tốc độ 40Khz.
    • LSE : sử dụng thạc anh ngoài tốc độ thấp 32.768khz.
    Thạch anh ngoài giúp bộ MCU hoạt động ổn định hơn. Khi cần backup data khi mất nguồn trên chân VDD thì cần có 2 điều kiện là sử dụng thạch anh ngoài và có điện áp trên chân VBAT.
    Các chức năng cơ bản của bộ RTC:
    • 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.
  3. Cấu hình sử dụng thư viện chuẩn.
  4. Vd: Cấu hình sử dụng bộ RTC sử thạch anh ngoài(LSE, HSE – thạch anh 32.768khz, 8Mhz), sử dụng backup data để kiểm tra xem đã cấu hình bộ RTC hay chưa, Cho phép ngắt 1s để cứ 1s in thời gian lên máy tính thông quan UART. LED ở chân PB9 sẽ hiển thị quá trình ngắt 1s bằng cách chớp - tắt ở chu kì 2s.
    • Kiểm tra đã có 2 loại thạch anh ngoài(LSE, HSE) hay chưa và nó còn được sử dụng hay không.
    • Chân PC14,PC15 chỉ được sử dụng riêng cho thạch ngoài.
    • Nối chân Vbat với nguồn riêng, khác nguồn cấp với VĐK. Nếu không có nguồn riêng thì nối chung với nguồn cấp cho VĐK, tuy nhiên hoạt động ở chế độ này chỉ kiểm tra được là có tín hiệu reset ở chân Reset hay là không, còn khi tắt nguồn thì hệ thống reset lại từ đầu.
    Tóm tắt cách thức hoạt động của chương trình:
    Đầu tiên, chương trình sẽ gọi các chương trình con đã được cấu hình(GPIO, UART, NVIC) để chúng hoạt động được. Tiếp đến kiểm tra thanh ghi đã có backup data hay chưa bằng cách đọc data ở thanh ghi DR1 và so sánh chúng với 0xA5A5.
    • Nếu chưa có thì thông báo là chưa được cấu hình, gọi chương trình con cấu hình, chương trình con set thời gian, ghi data 0xA5A5 vào thanh ghi DR1 để sau khi reset còn kiểm tra.
    • Nếu đã được cấu hình thì kiểm tra nguyên nhân Reset và đưa ra nguyên nhân đó là do nguồn bị tắt hoặc do nhấn nút reset.
    Trong vòng lặp while : khi cờ báo có ngắt 1s xảy ra thì sẽ đọc thanh ghi thời gian về và in lên máy tính thông qua UART, xóa cờ ngắt báo 1s. Chương trình con thực thi ngắt 1s được đặt trong file stm3210x_it.c.
    1. Chương trình con cấu hình RTC.
    2. Chương trình con cấu hình ngắt 1s RTC.
    3. Chương trình con set thời gian cho bộ RTC.
    4. Chương trình con đọc và hiển thị thời gian.
    5. Chương trình con thực thi ngắt 1s.
    6. Chương trình trong main.
    Chương trình này mình đã chỉnh sửa từ ví dụ mẫu, các bạn có thể tham khảo trong file thư viện chuẩn tải về tại mục example -> RTC.
  5. Một vài thanh ghi quan trọng.
    1. RTC_CR – RTC control register.
    2. Thanh ghi này bao gồm 2 thanh ghi high và low với các bit như sau:
      • OWIE: cờ báo ngắt tràn khi bộ đếm vượt qua giá trị 2^32.
      • ALRIE: cờ báo ngắt Alarm – giống như báo thời gian báo thức trong đồng hồ hẹn giờ.
      • SECIE : cờ báo ngắt 1s xảy ra.
      • RTOFF: cờ báo bộ RTC có đang chạy hay không.
      • CNF: Cờ báo có đang trong quá trình cấu hình hay đã cấu hình xong.
      • RSF: cờ báo các thanh ghi đã được đồng bộ, thống nhất với nhau hay chưa.
      • OWF : cờ báo tràn khi bộ đếm vượt qua giá trị 2^32.
      • ALRF: cờ báo Alarm – giống như báo thời gian báo thức trong đồng hồ hẹn giờ.
      • SECF: cờ báo mỗi 1s xảy ra.
    3. RTC_DIV – RTC prescaler divider register.
    4. Thanh ghi này bao gồm 2 thanh ghi high và low 20 bit, duy trì clock cho bộ đếm.
    5. RTC_CNT – RTC counter register.
    6. Thanh ghi này 32bit chứa giá trị bộ đếm của couter. Muốn biết thời gian cần đọc giá trị từ thanh ghi này về.
    7. RTC_ALR – RTC alarm register.
    8. Thanh ghi này 32 bit chứa giá trị hẹn giờ(Alarm) của bộ thời gian thực, khi bộ đếm bằng giá trị của thanh ghi này thì có cờ ngắt báo là đến giá trị alarm(nếu được cấu hình ngắt.)

  6. Bài tập.
    1. Cấu hình sử dụng bộ RTC sử thạch anh ngoài(LSE, HSE – thạch anh 32.768khz, 8Mhz), sử dụng backup data để kiểm tra xem đã cấu hình bộ RTC hay chưa, Cho phép ngắt 1s để cứ 1s in thời gian lên máy tính thông quan UART. LED ở chân PB9 sẽ hiển thị quá trình ngắt 1s bằng cách chớp - tắt ở chu kì 2s.
    2. Cấu hình sử dụng bộ RTC sử thạch anh nội LSI. Cho phép ngắt 1s để cứ 1s in thời gian lên máy tính thông quan UART. LED ở chân PB9 sẽ hiển thị quá trình ngắt 1s bằng cách chớp - tắt ở chu kì 2s.
    3. Cấu hình sử dụng bộ RTC sử thạch anh nội LSI. Thời gian được hiển thị lên máy tính thông qua UART. Set thời gian ban đầu là 0h:0p:0s, và ngắt alarm tại thời điểm 0h:2p:0s.


Link tải chương trình bài tập 1