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





0/5 (0投票)
使用 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)。我已经编写了函数 bcd2bin
和 bin2bcd
来协助进行值的转换。包含 BCD 转换函数的完整源代码可以从 这里 下载。