65.9K
CodeProject 正在变化。 阅读更多。
Home

在 PIC24 上使用实时时钟和日历 (RTCC) 模块

2023 年 5 月 8 日

CPOL

1分钟阅读

viewsIcon

4853

使用 RTCC 模块在 PIC24 上设置和获取当前时间的代码

本文分享了我编写的,用于在 PIC24 上使用实时时钟和日历 (RTCC) 模块来设置和获取当前时间的源代码。它已经在 PIC24FJ64GA002 上测试过,但只需稍作修改即可在其他类似的 PIC 上工作。我决定在这里发布它,因为我在互联网上找到关于这方面的信息非常少。

首先,在你过于兴奋并认为你不再需要像 DS1307 这样的外部 RTC 模块之前,请注意,与 DS1307 不同,RTCC 模块没有用于保持时间的电池——它与 PIC 共享电源。因此,为了使其在较长时间内运行,你可能需要在不使用时将 PIC 置于待机状态,以在保持 RTCC 运行的同时节省电力。

以下代码将启用 RTCC 模块的辅助振荡器

__builtin_write_OSCCONL(OSCCON | 0x02);

以下函数会将指定日期和时间值写入 RTCC 模块

void setRTCTime(unsigned char year, unsigned char month, unsigned char day, 
unsigned char weekday, unsigned char hour, unsigned char minute, unsigned char second)
{
    // Enable RTCC Timer Access

    /*
        NVMKEY is a write only register that is used to prevent 
        accidental writes/erasures of Flash or EEPROM memory. 
        To start a programming or an erase sequence, the following steps must be
        taken in the exact order shown:
        1. Write 0x55 to NVMKEY.
        2. Write 0xAA to NVMKEY.
    */
    NVMKEY = 0x55;
    NVMKEY = 0xAA;
    RCFGCALbits.RTCWREN = 1;

    // Disable RTCC module
    RCFGCALbits.RTCEN = 0;

    // Write to RTCC Timer
    RCFGCALbits.RTCPTR = 3;             // RTCC Value Register Window Pointer bits
    RTCVAL = bin2bcd(year);             // Set Year (#0x00YY)
    RTCVAL = (bin2bcd(month) << 8) + bin2bcd(day);    // Set Month and Day (#0xMMDD)
    RTCVAL = (bin2bcd(weekday) << 8) + bin2bcd(hour); // Set Weekday and Hour (#0x0WHH).
                                                      // Weekday from 0 to 6  
    RTCVAL = (bin2bcd(minute) << 8) + bin2bcd(second);// Set Minute and Second (#0xMMSS)

    // Enable RTCC module
    RCFGCALbits.RTCEN = 1;

    // Disable RTCC Timer Access
    RCFGCALbits.RTCWREN = 0;
}

以下代码将获取当前的 RTCC 时间

// Wait for RTCSYNC bit to become ‘0’
while(RCFGCALbits.RTCSYNC==1);

// Read RTCC timekeeping register
RCFGCALbits.RTCPTR=3;

year = bcd2bin(RTCVAL);

unsigned int month_date=RTCVAL;
month = bcd2bin(month_date >> 8);
day = bcd2bin(month_date & 0xFF);

unsigned int wday_hour=RTCVAL;
weekday = bcd2bin(wday_hour >> 8);
hour = bcd2bin(wday_hour & 0xFF);

unsigned int min_sec=RTCVAL;
minute = bcd2bin(min_sec >> 8);
second = bcd2bin(min_sec & 0xFF);

日期和时间值内部存储为 二进制编码十进制数 (BCD)。我已经编写了函数 bcd2binbin2bcd 来协助进行值的转换。包含 BCD 转换函数的完整源代码可以从 这里 下载。

© . All rights reserved.