目录
前言
本博文介绍mini2440开发板,在keil5平台上进行RTC开发的一些基本配置。
一、RTC配置
滴答时间设置为1s,每秒通过串口发送日期时间。闹钟时间设置在0秒,当秒数读到0时,通过串口发送"闹钟响了!"。
代码
#include "S3C2440.h"
#include "led.h"
#include "uart.h"
//RTC滴答中断处理函数
void __irq RTC_Tick_Handler(void)
{
unsigned char date[12] = "2000-00-00 ";
unsigned char time[9] = "00:00:00";
//清除滴答中断位
SRCPND = (1<<8);
INTPND = (1<<8);
RTCCON = 1;//RTC读写使能,BCD时钟、计数器、无复位
//读取年
if(BCDYEAR > 15)
{
date[2] = '0' + ((BCDYEAR & 0xf0) >> 4);
date[3] = '0' + (BCDYEAR & 0x0f);
}
else
{
if(BCDYEAR >= 10)
{
date[2] = '1';
date[3] = '0' + (BCDYEAR - 10);
}
else
{
date[2] = '0';
date[3] = '0' + (BCDYEAR & 0x0f);
}
}
//读取月
date[5] = '0' + ((BCDMON & 0x10) >> 4);
date[6] = '0' + (BCDMON & 0x0f);
//读取日
date[8] = '0' + ((BCDDATE & 0x30) >> 4);
date[9] = '0' + (BCDDATE & 0x0f);
//读取时
time[0] = '0' + ((BCDHOUR & 0x30) >> 4);
time[1] = '0' + (BCDHOUR & 0x0f);
//读取分
time[3] = '0' + ((BCDMIN & 0x70) >> 4);
time[4] = '0' + (BCDMIN & 0x0f);
//读取秒
time[6] = '0' + ((BCDSEC & 0x70) >> 4);
time[7] = '0' + (BCDSEC & 0x0f);
RTCCON = 0;//RTC读写禁止,BCD时钟、计数器、无复位
//串口发送日期
UART0_puts(date);
UART0_puts(time);
}
//RTC闹钟中断处理函数
void __irq RTC_Alarm_Handler(void)
{
//清除中断位
SRCPND = (1<<30);
INTPND = (1<<30);
//串口发送
UART0_puts("闹钟响了!");
}
//R设置RTC时间2022年12月12日01:40:00,星期一
void RTC_Set_Time(void)
{
RTCCON = 1;//RTC读写使能,BCD时钟、计数器、无复位
BCDYEAR = 0x22;
BCDMON = 0x12;
BCDDATE = 0x12;
BCDDAY = 0X1; //设置时间
BCDHOUR = 0X1;
BCDMIN = 0X40;
BCDSEC = 0X00;
RTCCON = 0;//RTC读写禁止,BCD时钟、计数器、无复位
}
//读取RTC时间
void RTC_Read_Time(void)
{
unsigned char date[12] = "2000-00-00 ";
unsigned char time[9] = "00:00:00";
RTCCON = 1;//RTC读写使能,BCD时钟、计数器、无复位
//读取年
if(BCDYEAR > 15)
{
date[2] = '0' + ((BCDYEAR & 0xf0) >> 4);
date[3] = '0' + (BCDYEAR & 0x0f);
}
else
{
if(BCDYEAR >= 10)
{
date[2] = '1';
date[3] = '0' + (BCDYEAR - 10);
}
else
{
date[2] = '0';
date[3] = '0' + (BCDYEAR & 0x0f);
}
}
//读取月
date[5] = '0' + ((BCDMON & 0x10) >> 4);
date[6] = '0' + (BCDMON & 0x0f);
//读取日
date[8] = '0' + ((BCDDATE & 0x30) >> 4);
date[9] = '0' + (BCDDATE & 0x0f);
//读取时
time[0] = '0' + ((BCDHOUR & 0x30) >> 4);
time[1] = '0' + (BCDHOUR & 0x0f);
//读取分
time[3] = '0' + ((BCDMIN & 0x70) >> 4);
time[4] = '0' + (BCDMIN & 0x0f);
//读取秒
time[6] = '0' + ((BCDSEC & 0x70) >> 4);
time[7] = '0' + (BCDSEC & 0x0f);
RTCCON = 0;//RTC读写禁止,BCD时钟、计数器、无复位
//串口发送日期
UART0_puts(date);
UART0_puts(time);
}
//RTC滴答设置
void RTC_Tick_Init(void)
{
//清除滴答中断位
SRCPND = (1<<8);
INTPND = (1<<8);
INTMSK &= ~(1<<8); //使能滴答中断
pISR_TICK = (unsigned)RTC_Tick_Handler;//中断处理函数
/*
滴答时间周期 = (时间计数+1)/128 = (127+1)/128 = 1s
*/
TICNT |= ((1<<7) | (0x7f<<0));//使能中断,时间计数设置为127
}
//RTC闹钟设置
void RTC_Alarm_Init(void)
{
RTCCON = 1;//RTC读写使能,BCD时钟、计数器、无复位
ALMSEC = 0;//秒闹钟设置为0,当秒数为0时,触发中断
RTCALM |= ((1<<6) | (1<<0));//使能全局闹钟,使能秒闹钟
RTCCON = 0;//RTC读写禁止,BCD时钟、计数器、无复位
//清除闹钟中断位
SRCPND = (1<<30);
INTPND = (1<<30);
INTMSK &= ~(1<<30);//使能闹钟中断
pISR_RTC = (unsigned)RTC_Alarm_Handler;//中断处理函数
}
实验结果