Exynos_4412——RTC实验

news2024/9/22 5:46:35

目录

一、ADC小作业

二、RTC简介

三、Exynos_4412下的RTC控制器

四、RTC中的寄存器

五、RTC编程

六、RTC小作业


一、ADC小作业

电压在1501mv~1800mv时,LED2、LED3、LED4、LED5点亮
电压在1001mv~1500mv时,LED2、LED3、LED4点亮
电压在501mv~1000mv时,LED2、LED3点亮
电压在0mv~500mv时,LED2闪烁

LED电路图和寄存器:

C工程与寄存器封装_宇努力学习的博客-CSDN博客

ADC电路图和寄存器:

Exynos_4412——ADC实验_宇努力学习的博客-CSDN博客

#include "exynos_4412.h"


void delay(unsigned int time)
{
	while(time --);
}

int main()
{
    unsigned int adc_value;
	unsigned int n = 0;
    //12
    ADCCON = ADCCON | (1 << 16);
    //使能ADC分频器
    ADCCON = ADCCON | (1 << 14);
    //100/(19+1)=5MHz 5 / 5 = 1MHz
    ADCCON = ADCCON & (~(0xFF << 6)) | (19 << 6);
    //关闭待机模式
    ADCCON = ADCCON & (~(1 << 2));
    //关闭通过读使能AD转换
    ADCCON = ADCCON & (~(1 << 1));

    ADCMUX = 3;

	GPX2.CON = GPX2.CON & (~(0xF << 28)) | (0x1 << 28);
	GPX1.CON = GPX1.CON & (~(0xF)) | (0x1);
	GPF3.CON = GPF3.CON & (~(0xFF << 16)) | (0x11 << 16);

    while(1)
    {
        //开始
        ADCCON = ADCCON | 1;
        while(!(ADCCON & (1 << 15)));
        //读取
        adc_value = ADCDAT & 0xFFF;
        // 1800mV/2^12=1800/4096=0.44
        adc_value = adc_value * 0.44;
		if(adc_value >= 0 & adc_value <= 500)
			n = 1;
		if(adc_value >= 501 & adc_value <= 1000)
			n = 2;
		if(adc_value >= 1001 & adc_value <= 1500)
			n = 3;
		if(adc_value >= 1501 & adc_value <= 1800)
			n = 4;
		switch(n)
		{
			case 1:
				GPX2.DAT = GPX2.DAT | (1 << 7);//LED2_ON
				delay(1000000);
				GPX2.DAT = GPX2.DAT & (~(1 << 7));//LED2_OFF
				delay(1000000);
				GPX1.DAT = GPX1.DAT & (~1);//LED3_OFF
				GPF3.DAT = GPF3.DAT & (~(1 << 4));//LED4_OFF
				GPF3.DAT = GPF3.DAT & (~(1 << 5));//LED5_OFF
				break;
			case 2:
				GPX2.DAT = GPX2.DAT | (1 << 7);//LED2_ON	
				GPX1.DAT = GPX1.DAT | 1;//LED3_ON
				GPF3.DAT = GPF3.DAT & (~(1 << 4));//LED4_OFF
				GPF3.DAT = GPF3.DAT & (~(1 << 5));//LED5_OFF
				break;
			case 3:
				GPX2.DAT = GPX2.DAT | (1 << 7);//LED2_ON
				GPX1.DAT = GPX1.DAT | 1;//LED3_ON
				GPF3.DAT = GPF3.DAT | (1 << 4);//LED4_ON
				GPF3.DAT = GPF3.DAT & (~(1 << 5));//LED5_OFF
				break;
			case 4:
				GPX2.DAT = GPX2.DAT | (1 << 7);//LED2_ON
				GPX1.DAT = GPX1.DAT | 1;//LED3_ON
				GPF3.DAT = GPF3.DAT | (1 << 4);//LED4_ON
				GPF3.DAT = GPF3.DAT | (1 << 5);//LED5_ON
				break;
			default:
				GPX2.DAT = GPX2.DAT & (~(1 << 7));//LED2_OFF
				GPX1.DAT = GPX1.DAT & (~1);//LED3_OFF
				GPF3.DAT = GPF3.DAT & (~(1 << 4));//LED4_OFF
				GPF3.DAT = GPF3.DAT & (~(1 << 5));//LED5_OFF
				break;
		}

        printf("adc_value = %d mV\n",adc_value);
    }
    return 0;
}

二、RTC简介

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

比如以前的手机,扣掉电池在安上时间就不准了,而现在的电子产品不会出现这个问题是因为他有备用电源。由于它只有一个RTC电路所以功耗很低,一般都是一个小的纽扣电池甚至一个电容就够了。

三、Exynos_4412下的RTC控制器

4412下的RTC还支持闹钟功能

它支持BCD number 年月日、星期、时分秒

https://baike.baidu.com/item/BCD%E7%A0%81/826461?fromtitle=bcd&fromid=13009167&fr=aladdin

举个栗子:

12 用二进制表示是   1100    用BCD码表示就是       0001  0010

支持闰年

支持告警功能即闹钟中断和低功耗模式 低功耗包括:空闲、深度空闲、停止、深度停止、休眠

支持滴答定时器,

支持独立电源引脚(RTCVDD)

滴答定时器还支持实时操作系统工作

这些东西32用的比较多,4412一般只用它来获取时间

32.768KHz的时钟 经过一个2^15的分频器(32768)就获得了一个1Hz的时钟,来给秒使用

四、RTC中的寄存器

 它有三块,用BCD码分别表示百位十位和个位,千位默认是2就行,估计这个单片机都用不到3开头那年。或者我也活不到那个时候啊,哈哈哈

 

 

 注意:  三星把星期和日的地址写反了

 

对于RTCCON这个寄存器我们只需要关注他的第0位就行,其它位使用默认设置。

这其实就是一把锁,只有把锁打开了我们才能修改时间,这是为了防止有些野指针,把内容修改了。

五、RTC编程

还是先解压一个工程

由于板子并没有备用电源,所以我们要先校准一下时间:

由于BCD转化成10进制看起来怪怪的,所以我们要写一个转化函数,这里我偷懒一下,以为16进制和BCD需要转化的10进制刚好相等,直接写16进制数

同样读取的时候也需要我们写这样一个转化函数,这里再偷个懒

#include "exynos_4412.h"

int main()
{
    //使能RTC控制
    RTCCON = RTCCON | 1;
    //校准时间
    RTC.BCDYEAR = 0x023; //000000100011  2023
    RTC.BCDMON  = 0x1;   //1
    RTC.BCDDAY  = 0x5;   //5
    RTC.BCDWEEK = 0x4;   //星期四
    RTC.BCDHOUR = 0x11;  //11
    RTC.BCDMIN  = 0x32;  //32
    RTC.BCDSEC  = 0x50;  //50s

    //关闭RTC控制
    RTCCON = RTCCON & 0;

    while(1)
    {
        printf("%x-%x-%x %x %x:%x:%x\n",RTC.BCDYEAR,RTC.BCDMON,RTC.BCDDAY,RTC.BCDWEEK,RTC.BCDHOUR,RTC.BCDMIN,RTC.BCDSEC);
    }

	return 0;
}

 但是程序跳动的太快了,所以我们改一下让他一秒钟打印一次

#include "exynos_4412.h"

int main()
{
	unsigned int Oldsec = 0, Newsec = 0;
    //使能RTC控制
    RTCCON = RTCCON | 1;
    //校准时间
    RTC.BCDYEAR = 0x023; //000000100011  2023
    RTC.BCDMON  = 0x1;   //1
    RTC.BCDDAY  = 0x5;   //5
    RTC.BCDWEEK = 0x7;   //星期四
    RTC.BCDHOUR = 0x11;  //11
    RTC.BCDMIN  = 0x32;  //32
    RTC.BCDSEC  = 0x50;  //50s

    //关闭RTC控制
    RTCCON = RTCCON & 0;

    while(1)
    {
		Newsec = RTC.BCDSEC;
		if(Newsec != Oldsec)
		{
        	printf("%x-%x-%x %x %x:%x:%x\n",RTC.BCDYEAR,RTC.BCDMON,RTC.BCDDAY,RTC.BCDWEEK,RTC.BCDHOUR,RTC.BCDMIN,RTC.BCDSEC);
		
			Oldsec = Newsec;				

		}   
	}

	return 0;
}

 手动填个20看起来更好看一些

六、RTC小作业

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

#include "exynos_4412.h"

void RTC_Init()
{
	//使能RTC控制
    RTCCON = RTCCON | 1;
    //校准时间
    RTC.BCDYEAR = 0x023; //000000100011  2023
    RTC.BCDMON  = 0x1;   //1
    RTC.BCDDAY  = 0x5;   //5
    RTC.BCDWEEK = 0x4;   //星期四
    RTC.BCDHOUR = 0x11;  //11
    RTC.BCDMIN  = 0x32;  //32
    RTC.BCDSEC  = 0x50;  //50s

    //关闭RTC控制
    RTCCON = RTCCON & 0;

}
void ADC_Init()
{
	//12
    ADCCON = ADCCON | (1 << 16);
    //使能ADC分频器
    ADCCON = ADCCON | (1 << 14);
    //100/(19+1)=5MHz 5 / 5 = 1MHz
    ADCCON = ADCCON & (~(0xFF << 6)) | (19 << 6);
    //关闭待机模式
    ADCCON = ADCCON & (~(1 << 2));
    //关闭通过读使能AD转换
    ADCCON = ADCCON & (~(1 << 1));

    ADCMUX = 3;

}
void LED_Init()
{
	GPX2.CON = GPX2.CON & (~(0xF << 28)) | (0x1 << 28);
	GPX1.CON = GPX1.CON & (~(0xF)) | (0x1);
	GPF3.CON = GPF3.CON & (~(0xFF << 16)) | (0x11 << 16);
}
int main()
{
	unsigned int Oldsec = 0, Newsec = 0;	
	unsigned int adc_value;
	unsigned int n = 0;
	unsigned int flag = 1;
    RTC_Init();
	ADC_Init();
	LED_Init();

    while(1)
    {
		Newsec = RTC.BCDSEC;
		//开始
        ADCCON = ADCCON | 1;
        while(!(ADCCON & (1 << 15)));
        //读取
        adc_value = ADCDAT & 0xFFF;
        // 1800mV/2^12=1800/4096=0.44
        adc_value = adc_value * 0.44;
		if(adc_value >= 0 & adc_value <= 500)
			n = 1;
		if(adc_value >= 501 & adc_value <= 1000)
			n = 2;
		if(adc_value >= 1001 & adc_value <= 1500)
			n = 3;
		if(adc_value >= 1501 & adc_value <= 1800)
			n = 4;
		switch(n)
		{
			case 1:								
				GPX1.DAT = GPX1.DAT & (~1);//LED3_OFF
				GPF3.DAT = GPF3.DAT & (~(1 << 4));//LED4_OFF
				GPF3.DAT = GPF3.DAT & (~(1 << 5));//LED5_OFF
				if(Newsec != Oldsec)
				{
					if(flag == 1)
					{
        				printf("20%x-%x-%x %x %x:%x:%x  adc_value = %d mV\n",RTC.BCDYEAR,RTC.BCDMON,RTC.BCDDAY,RTC.BCDWEEK,RTC.BCDHOUR,RTC.BCDMIN,RTC.BCDSEC,adc_value);
						GPX2.DAT = GPX2.DAT | (1 << 7);//LED2_ON
						flag = 0;						
					}else{
						GPX2.DAT = GPX2.DAT & (~(1 << 7));//LED2_OFF
						printf("20%x-%x-%x %x %x:%x:%x  adc_value = %d mV\n",RTC.BCDYEAR,RTC.BCDMON,RTC.BCDDAY,RTC.BCDWEEK,RTC.BCDHOUR,RTC.BCDMIN,RTC.BCDSEC,adc_value);
						flag = 1;
					}	
					Oldsec = Newsec;			
				} 
				break;
			case 2:
				GPX2.DAT = GPX2.DAT | (1 << 7);//LED2_ON	
				GPX1.DAT = GPX1.DAT | 1;//LED3_ON
				GPF3.DAT = GPF3.DAT & (~(1 << 4));//LED4_OFF
				GPF3.DAT = GPF3.DAT & (~(1 << 5));//LED5_OFF
				break;
			case 3:
				GPX2.DAT = GPX2.DAT | (1 << 7);//LED2_ON
				GPX1.DAT = GPX1.DAT | 1;//LED3_ON
				GPF3.DAT = GPF3.DAT | (1 << 4);//LED4_ON
				GPF3.DAT = GPF3.DAT & (~(1 << 5));//LED5_OFF
				break;
			case 4:
				GPX2.DAT = GPX2.DAT | (1 << 7);//LED2_ON
				GPX1.DAT = GPX1.DAT | 1;//LED3_ON
				GPF3.DAT = GPF3.DAT | (1 << 4);//LED4_ON
				GPF3.DAT = GPF3.DAT | (1 << 5);//LED5_ON
				break;
			default:
				GPX2.DAT = GPX2.DAT & (~(1 << 7));//LED2_OFF
				GPX1.DAT = GPX1.DAT & (~1);//LED3_OFF
				GPF3.DAT = GPF3.DAT & (~(1 << 4));//LED4_OFF
				GPF3.DAT = GPF3.DAT & (~(1 << 5));//LED5_OFF
				break;
		}  
	}
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/141526.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是芯片老化测试?芯片老化测试系统NSAT-2000解决方案

随着半导体电子技术的进步&#xff0c;老化测试已成为保证产品质量的关键流程。除了半导体元件外&#xff0c;PCB、IC 和处理器部件也都需要在老化条件下进行测试。本篇文章纳米软件Namisoft小编将带大家分享一下关于芯片老化测试系统的相关知识。 一、什么是芯片老化测试&…

开发工具篇第十二讲:常用开发库 - Lombok工具库详解

开发工具篇第十二讲&#xff1a;常用开发库 - Lombok工具库详解 Lombok是一款非常实用Java工具&#xff0c;可用来帮助开发人员消除Java的冗长代码&#xff0c;尤其是对于简单的Java对象&#xff08;POJO&#xff09;。实际上我并不推荐使用Lombok&#xff08;不主动使用它&…

CANoe测试TC8

OPEN联盟发布的TC8是目前行业内关于车载以太网的标准测试规范之一。 CANoe环境需要硬件和软件: 硬件是CANoe设备&#xff0c;用来连接电脑和DUT&#xff0c;TC8测试的是以太&#xff0c;那么CANoe设备必须支持以太才行&#xff0c;目前VN5640以上都是支持的。 软件需要安装CANo…

对git rebase 和git merge的理解

一、是什么 在使用 git 进行版本管理的项目中&#xff0c;当完成一个特性的开发并将其合并到 master 分支时&#xff0c;会有两种方式&#xff1a; git mergegit rebase git rebase 与 git merge都有相同的作用&#xff0c;都是将一个分支的提交合并到另一分支上&#xff0c;…

物联网技术在地下综合管廊智能化建设中的应用实例分析

摘 要:物联网是21世纪传感技术、通信技术、信息技术的应用大集成利用物联网技术实现地下综合管廊的智能化管理符合经济和城市规划发展的需要分析了物联网技术的特点及地下综合管廊建设中物联网技术的应用并结合物联网技术在地下综合管廊建设的应用实例对物联网技术在地下综合…

Qt扫盲-Windows任务栏使用总结

Qt扫盲-Windows任务栏使用总结一、概述二、覆盖图标和进度指示器三、跳转列表四、缩略图工具栏一、概述 任务栏为用户提供了访问桌面上打开的应用程序的权限。Windows自动在任务栏上创建用于访问应用程序窗口的按钮。 从 Windows 7到Windows10 都有效果。就是在任务栏上的一个…

基于springboot框架个人博客管理系统

一、项目简介 本项目是一套基于springboot框架实现的个人博客管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&a…

头歌:UDP Ping程序实现 客户端创建UDP套接字

头歌平台&#xff1a;头歌实践教学平台 (educoder.net)创建数据包套接字套接字 Socket 实质上提供了主机间进程通信的连接点。进程通信之前&#xff0c;双方首先必须各自创建一个连接点,否则是没有办法建立联系并相互通信的。一个完整的 Socket {协议,本地地址,本地端口,远程地…

在 React 中使用 i18next

1. 安装依赖 npm i i18next react-i18next i18next-browser-languagedetectori18next 提供了翻译的基本能力。react-i18next 是 i18next 的一个插件&#xff0c;用来降低 react 的使用成本。i18next-browser-languagedetector 是用来检测浏览器语言的插件。 2. 在src下创建i18…

.net core 中使用confluent kafka构建生产者

创建.net 6 API安装依赖包 创建kafka生产者 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Confluent.Kafka; using Confluent.Kafka.Admin; using KafkaHelper.Config; using Microsoft.Exte…

Cuk拓扑产生负压

1、基础拓扑的输入输出电流连续情况 1>Buck电路 图中绿色波形为输入端的电流&#xff08;测的图中MOS上的电流&#xff09;&#xff0c;蓝色的输出端的电流&#xff08;图中电感L4的电流&#xff09;&#xff0c;可以看出输入端电流不连续&#xff0c;输出端电流连续。 2&…

Revit中项目特别大如何将项目完整的体现在图纸中?

一、Revit中项目特别大如何将项目完整的体现在图纸中? 遇到项目特别大&#xff0c;在一张图纸是放置不下时&#xff0c;如图1所示&#xff0c;怎样才能将项目完整的体现在图纸当中? 在遇到特别大的项目可能会在图纸中放不下&#xff0c;在这种情况下我们要用拼接线来处理。在…

【JavaEE】SSM框架

文章目录一、Spring1、Spring相关概念1.1 Spring Framework系统架构1.2 核心概念(lOC、lOC容器、Bean、DI)2、入门案例2.1 IOC入门案例2.2 DI入门案例3、lOC相关内容3.1 bean配置3.2 bean实例化3.3 bean的生命周期3.3.1 控制bean生命周期执行的方法3.3.2 bean销毁时机4、DI相关…

AI智能分析在智慧电厂的典型应用

电力供应是整个社会生产、人民生活的基本保证之一。智慧电力作为城市智能化发展的客观需求&#xff0c;是智慧城市的重要基础&#xff0c;也是智慧城市建设的一项重要内容。 智慧能源用最前沿技术淋漓尽致地表达着对未来能源发展趋势的理解与实践。智慧电力将多项创新成果应用于…

【前端】Vue项目:旅游App-(6)city:隐藏TabBar的2种方法

文章目录目标过程与代码方法1&#xff1a;通过路由隐藏方法2&#xff1a;用样式隐藏对方法2封装总代码修改的文件common.cssindex.jscity.vue目标 city页是点击上篇“广州”位置所跳转的页面。此页面要隐藏TabBar。 过程与代码 city页要隐藏TabBar。我们这里有两种隐藏的方法…

【Effective Objective - C】—— 读书笔记(五)

【Effective Objective - C】—— 读书笔记&#xff08;五&#xff09; 内存管理 文章目录【Effective Objective - C】—— 读书笔记&#xff08;五&#xff09;内存管理29.理解引用计数引用计数工作原理属性存取方法中的内存管理自动释放池保留环要点30.以ARC简化引用计数使…

Qt扫盲-QSystemTrayIcon理论总结

QSystemTrayIcon理论总结一、概述二、使用对象三、使用四、常用函数介绍1. 静态函数2. 公共槽函数3. 信号一、概述 现代操作系统通常在桌面上提供一个特殊的区域&#xff0c;称为系统托盘或通知区域&#xff0c;长期运行的应用程序可以在这里显示图标和短消息。什么意思呢&…

【Spring】1. Java对象序列化和反序列化

1. 概念 1.1 序列化 将数据结构或对象转换成二进制字节流的过程 1.2 反序列化 序列化的反过程把二进制字节流恢复为数据结构或对象的过程1.3 序列化的目的&#xff1a; 通过网络传输对象或者说是将对象存储到文件系统、数据库、内存中。 2. 为什么要进行序列化&#xff1f;&…

【Linux】Linux开发工具(一)——vim工具

作者&#xff1a;一个喜欢猫咪的的程序员 专栏&#xff1a;《Linux》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 目录 1.什么是vim 1.1什么是vim 1.2vim和vi的区别&#xff1a; 2.vim基础 2.…

字符串的模式匹配

字符串的模式匹配引言应用方法一 暴力匹配算法 (C语言实现)程序实现暴力算法思想暴力算法的时间复杂度方法二 KMP 算法程序实现KMP 算法思想KMP 算法的时间复杂度暴力匹配算法 vs KMP 算法next 数组的训练KMP 算法的优化next 数组 转换成 nextval 数组的思想引言 在我们日常生…