Keil5 平台 S3C2440裸机程序开发-----RTC

目录

前言

一、RTC配置

二、源码


前言

本博文介绍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;//中断处理函数
}

实验结果

二、源码

下载

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值