本文介绍: RTC(Real Time Clock)即实时时钟,它是一个可以系统提供精确时间基准的元器件,RTC一般采用精度较高的晶振作为时钟源,有些RTC为了在主电源掉电时还可以工作需要外加电池供电实时时钟(RTC)单元可以系统断电时使用用电池进行运行。尽管电源关闭,备用电可以存储秒、分钟、小时、星期几、日期月份年份时间数据。RTC单元与外部32.768 kHz晶体一起工作,并执行报警功能。INTP 中断挂起计时器RTCCON 控制寄存器

目录

1 RTC简介

​编辑2 Exynos4412下的RTC控制器

2.1 概述

2.2 特征

2.3 功能框图

3 寄存器介绍

3.1 概述

3.2 BCD格式的年月日寄存器

3.3 INTP中断挂起寄存器

3.4 RTCCON控制寄存器 

3.5 CURTICCNT 作为嘀嗒定时器使用的寄存器

4 RTC编程

5 练习


1 RTC简介

RTC(Real Time Clock)即实时时钟,它是一个可以系统提供精确时间基准的元器件,RTC一般采用精度较高的晶振作为时钟源,有些RTC为了在主电源掉电时还可以工作需要外加电池供电

2 Exynos4412下的RTC控制器

2.1 概述

实时时钟(RTC)单元可以系统断电时使用备用电池进行运行。尽管电源关闭,备用电池可以存储秒、分钟、小时、星期几、日期、月份和年份时间数据。RTC单元与外部32.768 kHz晶体一起工作,并执行报警功能。 

2.2 特征

 

注:BCD码 即4位二进制表示一位十进制数。如12,0001 0010

2.3 功能框图

clock divider分配器分频系数是2^15=32768正好提供1hz,相当于1秒给秒使用

其余内容详细介绍,主要是对晶振引脚、瑞年计数器介绍

3 寄存器介绍

3.1 概述

INTP 中断挂起计时器

RTCCON 控制寄存器

TICCNT 作为嘀嗒定时器使用寄存器(主要是RTOS时候使用,其余不太用)

RTCALM 闹铃控制寄存器

ALM寄存器是主要闹钟的寄存器

BCD寄存器是最主要的使用时间的寄存器

CURTICCNT 作为嘀嗒定时使用寄存器(一般不太使用

3.2 BCD格式的年月日寄存

注意:芯片手册中星期与日的寄存地址写反了,需要兑换一下,闹钟与时钟的寄存器一样不详细介绍

星期:2位标识1-7

 例

日:[5:4]位标识日的十位,[3:0]位表示日的个位

月:[4]位表示月份十位,[3:0]位表示月份个位 

年:例2023中,寄存器只可记录023即最大到百位,对应[11:0]位,3个BCD码二进制数。

3.3 INTP中断挂起寄存

3.4 RTCCON控制寄存器 

 

CTLEN:1使能RTC,0关闭RTC。要去修改时间需要先使能RTC,否则修改不了时间

3.5 CURTICCNT 作为嘀嗒定时使用寄存

4 RTC编程

interface.c

#include "exynos_4412.h"

int main()
{
	unsigned int OldSec = 0, NewSec = 0;

	/*使能RTC控制*/
	RTCCON = RTCCON | 1;
	/*校准时间信息*/
	RTC.BCDYEAR = 0x023;
	RTC.BCDMON  = 0x12;
	RTC.BCDDAY  = 0x7;
	RTC.BCDWEEK = 0x31;
	RTC.BCDHOUR = 0x23;
	RTC.BCDMIN  = 0x59;
	RTC.BCDSEC  = 0x50;
	/*禁止RTC控制*/
	RTCCON = RTCCON &  (~(1));

	while(1)
	{
		NewSec = RTC.BCDSEC;
		if(OldSec != NewSec)
		{
			printf("20%x-%x-%x %x %x:%x:%xn",RTC.BCDYEAR, RTC.BCDMON, RTC.BCDWEEK, RTC.BCDDAY, RTC.BCDHOUR, RTC.BCDMIN, RTC.BCDSEC);	
			OldSec = NewSec;
		}
	}
	return 0;
}

注:改进部分可以一个int int_to_bcd(int time)格式函数

5 练习

编程实现通过LED状态显示当前电压范围,并打印产生低压警报时的时间

注:
电压在1501mv~1800mv时,LED2、LED3、LED4、LED5点亮
电压在1001mv~1500mv时,LED2、LED3、LED4点亮
电压在501mv~1000mv时,LED2、LED3点亮
电压在0mv~500mv时,LED2闪烁,且每隔一秒钟向终端打印一次当前的电压值及当前的时间

代码



#include "exynos_4412.h"



void Delay(unsigned int Time)

{

	while(Time--);

}


void Led_init(void)
{
	GPX2.CON = GPX2.CON & (~(0xF << 28)) | (0x1 << 28); //LED2 GPX2_7 output

	GPX1.CON = GPX1.CON & (~0xF) | 0x1;                 //LED3 GPX1_0 output

	GPF3.CON = GPF3.CON &amp; (~(0xF &lt;&lt; 16)) | (0x1 &lt;< 16); //LED4 GPF3_4 output

	GPF3.CON = GPF3.CON &amp; (~(0xF << 20)) | (0x1 << 20); //LED5 GPF3_5 output
}



void Led_on(int num)

{

	switch(num)

	{

		case 2:

			GPX2.DAT = GPX2.DAT | (1 << 7);

		case 3:

			GPX1.DAT = GPX1.DAT | (1 << 0);

		case 4:

			GPF3.DAT = GPF3.DAT | (1 << 4);

		case 5:

			GPF3.DAT = GPF3.DAT | (1 << 5);

		default:

			break;

	}

}


void Adc_init(void)
{

	/*设置ADC精度为12bit*/

	ADCCON = ADCCON | (1 << 16);

	/*使能ADC分频器*/

	ADCCON = ADCCON | (1 << 14);

	/*设置ADC分频值 ADC时钟频率=PLCK/(19+1)=5MHZ ADC转换频率=5MHZ/5=1MHZ*/

	ADCCON = ADCCON &amp; (~(0xFF << 6)) | (19 << 6);

	/*关闭待机模式,使能正常模式*/

	ADCCON = ADCCON &amp; (~(1 << 2));

	/*关闭通过读使能AD转换*/

	ADCCON = ADCCON &amp; (~(1 << 1));

	/*选择转换通道,3通道*/

	ADCMUX = 3;
}

void Led_off(int num)

{

	switch(num)

	{

		case 2:

			GPX2.DAT = GPX2.DAT &amp; ~(1 << 7);

		case 3:

			GPX1.DAT = GPX1.DAT &amp; ~(1 << 0);

		case 4:

			GPF3.DAT = GPF3.DAT &amp; ~(1 << 4);

		case 5:

			GPF3.DAT = GPF3.DAT &amp; ~(1 << 5);

		default:

			break;

	}

}




int main()

{

	unsigned int AdcValue;

	unsigned int OldSec = 0, NewSec = 0;
	
	Adc_init();
	Led_init();


	/*使能RTC控制*/
	RTCCON = RTCCON | 1;
	/*校准时间信息*/
	RTC.BCDYEAR = 0x023;
	RTC.BCDMON  = 0x12;
	RTC.BCDDAY  = 0x7;
	RTC.BCDWEEK = 0x31;
	RTC.BCDHOUR = 0x23;
	RTC.BCDMIN  = 0x59;
	RTC.BCDSEC  = 0x50;
	/*禁止RTC控制*/
	RTCCON = RTCCON &amp;  (~(1));
	



	while(1)

	{

		/*开始转换*/

		ADCCON = ADCCON | 1;

		/*等待转换完成*/

		while(!(ADCCON &amp; (1 << 15)));

		/*读取转换结果*/

		AdcValue = ADCDAT &amp; 0xFFF;

		/*将结果转换成实际的电压值mv*/

		AdcValue = AdcValue * 0.44;

		
		NewSec = RTC.BCDSEC;


		if((AdcValue &gt;= 0) &amp;& (AdcValue <= 500))

		{

			Led_on(2);

			Led_off(3);

			Led_off(4);

			Led_off(5);
			
			/*打印转换结果*/
			if(OldSec != NewSec)
			{
				printf("20%x-%x-%x %x %x:%x:%x,AdcValue = %dmvn",RTC.BCDYEAR, RTC.BCDMON, RTC.BCDWEEK, RTC.BCDDAY, RTC.BCDHOUR, RTC.BCDMIN, RTC.BCDSEC,AdcValue);	
				OldSec = NewSec;
			}

		}

		else if ((AdcValue &gt; 500) && (AdcValue <= 1000))

		{

			Led_on(2);

			Led_on(3);

			Led_off(4);

			Led_off(5);

		}

		else if ((AdcValue &gt; 1000) && (AdcValue <= 1500))

		{

			Led_on(2);

			Led_on(3);

			Led_on(4);	

			Led_off(5);	

		}

		else if((AdcValue &gt; 1500) && (AdcValue <= 1800))

		{

			Led_on(2);

			Led_on(3);

			Led_on(4);	

			Led_on(5);

		}

		

	

	}

	return 0;

}

实验效果

原文地址:https://blog.csdn.net/m0_60718520/article/details/134792917

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_43790.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注