- Đồng hồ thời gian thực LPCxxx là một lịch biểu chính xác đến năm 2099 và không hoạt động với tần sô Pclk. RTC tiêu thụ một năng lƣợng thấp. RTC có một tập các thanh ghi cảnh báo đƣợc sử dụng để lƣu trữ ngày tháng hoặc giá trị cụ thể trong thanh ghi đếm thời gian (time-count register).
Hinh 3.13.
- RTC hoạt động ở xung nhịp chuẩn với tần số 32.7 KHz. Để có đƣợc số này thì Pclk cần đƣợc kết nối tới bộ chia tần tham chiếu.
Trang 68
Hình 3.14. Tạo xung clock cho RTC
- Để đảm bảo xung clock đƣợc tạo ra chính xác từ Pclk, prescaler đƣợc lập trình bởi 2 thanh ghi PREINT và PREFRAC. Tính toán giá trị cho mỗi thanh ghi nhƣ sau:
PREINT = (int)(pclk/32768)-1
PREFRAC = pclk – ((PREINT+1) x 32768
Với một xung Pclk 30MHz thì:
PREINT = (int)( 30,000,000/32768)-1 = 914
PREFRAC = 30,000,000 – ((914+1) x 32768) = 17280
Các giá trị có thể đƣợc lập trình trực tiếp vào thanh ghi prescaler của RTC, sau đó cho phép xung clock trong thanh ghi điều khiển clock và các bộ đếm timer sẽ bắt đầu,
PREINT = 0x00000392; //Thiết lập prescaler RTC với tần số Pclk //là 30.000 MHz
PREFRAC = 0x00004380;
CCR = 0x00000001; //Bắt đầu RTC
Có 8 thanh ghi đếm thời gian (time-counter), mỗi thanh ghi chứa một con số thời gian đơn có thể đƣợc đọc bất kỳ lúc nào. Ngoài ra, có một tập các thanh ghi tổng hợp biểu diễn cùng giá trị thời gian trong 3 từ cho phép tất cả các thông tin đƣợc đọc trong 3 thao tác.
Trang 69
Hình 3.15. Các thanh ghi tổng hợp của RTC
- RTC có thể sinh ra một sự kiện ngắt. Có 2 bộ tạo ngắt, Ngƣời lập trình có thể tạo ra ngắt khi giá trị của thanh ghi time-counter đƣợc tăng lên, hoặc khi bộ giây đƣợc cập nhật hoặc khi năm đƣợc tăng lên. Thanh ghi ngắt cho chép 8 ngắt có thể.
- Cách thứ 2 có thể sinh ra ngắt RTC các thanh ghi cảnh báo. Mỗi thanh ghi time- counter có một thanh ghi cảnh báo (Alarm register), và có thể cảnh báo trong khoảng thời gian hiện tại đến năm 2099 một cách chính xác.
- Thanh ghi Alarm Mask điều khiển sự so sánh. Thanh ghi ngắt location có 2 bít đƣợc sử dụng để cho biết nguyên nhân sinh ra ngắt.
Thí dụ minh họa: int main(void) {
VPBDIV = 0x00000002;
IODIR1 = 0x00FF0000; // Thiết lập các chân đầu ra nối với led IOSET1 = 0x00020000;
PREINT = 0x00000392; //Thiết lập RTC prescaler với Pclk 30MHz PREFRAC = 0x00004380;
CIIR = 0x00000001; //Cho phép ngắt khi đến số giây ALSEC = 0x00000003; //Thiết lập thanh ghi cảnh báo 3
AMR = 0x000000FE; //Cho phép cảnh báo theo số giây Alarm CCR = 0x00000001; //Khởi động RTC
VICVectAddr13 = (unsigned)RTC_isr; //Lấy địa chỉ chƣơng trình phục vụ ngắt VICVectCntl13 = 0x0000002D; //Thiết lập kệnh
Trang 70 while(1);
}
void RTC_isr(void){ unsigned led;
if(ILR&0x00000001) //Kiểm tra ngắt RTC {
led = IOPIN1; //Đọc trạng thái của các chân vào ra IO IOCLR1 = led&0x00030000; //tắt LED
IOSET1 = ~led&0x00030000; // bật LED ILR = 0x00000001; //xóa ngắt
}
if(ILR & 0x00000002) {
IOSET1 = 0x00100000; //set led 0.7 ILR = 0x00000002; //xóa thanh ghi ngắt }
VICVectAddr = 0x00000000; /*Giả lập kết thúc ngắt */ }