M41T11-RTC(实时时钟)
一、理论准备
1. 主要器件:STM8单片机、M41T11时钟IC、32.768kHz晶振等。
2. 外围设备:烧录工具ST-Link/v2、串口、5v供电SATA线。
3. 主要思想:通过单片机对时钟IC进行写入和读取操作。
主设备:STM8单片机。提供SCL、SDA线,用于发送和读取数据,这里需要熟悉I2C协议;
从设备:M41T11时钟IC。内部有56Byte的NVRAM,前8个Byte寄存储找我们想要得到的数据。
(一)、M41T11引脚示意图及解释如下:
问题简单化了,我们只需要找到访问该时钟IC的方法,读取它的前8Byte即可解决问题。
对以上寄存器表做说明:
(1)读出来的数据为BCD码,所谓BCD码也就是binary-coded decimal format,例如读出Address 0的数据为0x56,及表示56秒;
(2)其中Address 0的D7位为ST(Stop bit),可以理解为时钟IC的使能位,当ST=1时停止,ST=0时开始;因此为了确保时钟IC处于工作状态,在上电后应该首先对时钟IC做Reset操作(即先使ST=1,后置ST=0);
(3)Address 3存储Day(day of week)表示星期几,Address 4存储Date(day of month)表示几号;
(4)Address 7为控制寄存器默认为0xAF,其中默认OUT为1、FT为0;
(5)校验:当FT=1时,且在第7脚(FT/OUT)外加一个上拉电阻时,只要时钟IC正常工作(32.768kHz),就可以用示波器测得FT/OUT脚为512kHz左右;
(6)对于只需要实现简单的读取实时时间,寄存器中其他标志位暂时不做说明。
(二)、时钟IC作为从设备的地址
由图中可以看出,从地址由两部分组成,由7bit的“1101000”和1bit的R/W位共同组成一个Byte;
当为write mode时,R/W=0;当为read mode时,R/W=1;
所以当要写数据进时钟IC时,从地址为0xD0;当要读时钟IC中的数据时,从地址为0xD1;
值得注意的是,我的代码中没有体现,因为我的I2C内部实现了函数I2C_Send7bitAddress(SLAVE_ADDRESS, I2C_DIRECTION_TX);其中SLAVE_ADDRESS为“1101000”,I2C_DIRECTION_TX相当于R/W;
4. Write mode:
(1)发送slave address 0xD0(时钟IC作为从设备的slave address为0xD0);
(2)发送时钟IC的寄存器地址,如发送Address 0的地址0x00;
(3)发送要写入的数据,如设置ST为1,则发送数据0x80;
5. Read mode:
(1)发送slave address 0xD0;
(2)发送时钟IC的寄存器地址;
(3)想要得到的数据已经被传送后存到I2C的数据寄存器中,因此直接拿I2C->DR中的内容即可;
想要得到实时时间,需要读取前8Byte,只需重复Read mode 8次。
通过以上讲解,解决问题的思路应该相当清晰了,因此
二、解决步骤:
(1)关闭时钟IC:通过Write mode先将Address 0置0x80(最高位ST=1);
(2)打开时钟IC并初始化:
- uint8_t timeData[7]={0x58,0x59,0x23,0x07,0x30,0x05,0x17};
- 将寄存器的前7Byte初始化为timeData中的值,代表初始化时间为17年5月30日星期二23:59:58;
- 为了检验读取的正确性,不对第8位做初始化;
- 由于Address 0被初始化为0x58,最高位ST为0,所以时钟已经开启;
(3)Read mode 8次,对寄存器地址为0x00~0x06的寄存器做读操作,将每次读到的内容存放到 uint8_t curtime[8]数组中;
(4)将数组内容通过串口格式化输出到终端里,为了获取实时时间,死循环读取并输出到串口,通过终端中不停的打印信息,可以看到时间的变化。
三、核心代码:
在我的代码中,发送操作需要中断,并且从地址的发送已经在中断里实现自动发送;
//real-time clock //set ST 1
I2C_ITConfig((I2C_IT_TypeDef)(I2C_IT_EVT | I2C_IT_BUF) , ENABLE);
enableInterrupts();
Tx_Idx = ;
NumOfBytes =;
TxBuffer[]=0x00;
TxBuffer[]=0x80;
I2C_Send();
disableInterrupts(); //set ST 0 and set the right time
__IO uint8_t i,j;
for(i=;i<;i++){ I2C_ITConfig((I2C_IT_TypeDef)(I2C_IT_EVT | I2C_IT_BUF) , ENABLE);
enableInterrupts(); Tx_Idx = ;
NumOfBytes =;
TxBuffer[]=i; //address
TxBuffer[]=timeData[i];
I2C_Send(); disableInterrupts();
} //issue read adddress
while() {
for(i=;i<;i++){ I2C_ITConfig((I2C_IT_TypeDef)(I2C_IT_EVT | I2C_IT_BUF) , ENABLE);
enableInterrupts(); Tx_Idx = ;
NumOfBytes =;
TxBuffer[]=i; //address
I2C_Send(); Rx_Idx = ;
NumByteToRead =;
I2C_Read();
curtime[i] = RxBuffer[];
uart2str(uartbuff,curtime[i],,,''); //output press times
printf("%s: ",uartbuff); disableInterrupts();
}
printf("\n\r",uartbuff);
}
RTC
函数解释:
uart2str(uartbuff,curtime[i],2,16,'0')为格式转换函数,意思是将curtime[i]以2位16进制输出,数据先存放在uartbuff中,再用printf打印到终端;
I2C_ITConfig((I2C_IT_TypeDef)(I2C_IT_EVT | I2C_IT_BUF) , ENABLE)为打开全局中断;
enableInterrupts()为打开中断;
disableInterrupts()为关闭中断;
Tx_Idx为写指针,指向当前要写入的位置,写后加一;Rx_Idx为读指针,指向当前要读取的位置,读后加一;
NumOfBytes为待写入数据的个数,写后减一;NumByteToRead为待读取数据的个数,读后减一;
TxBuffer[ ]为待写入的数据,RxBuffer[ ]为待读取的数据(即为I2C->DR的返回值);
I2C_Send()为发送数据函数,I2C_Read()为读取数据函数,详细实现见STM8单片机的I2C(TwoBoards、DataExchange、Master)实现实例;
四、串口输出:
从左到右输出的分别是寄存器0~6的内容,即显示的是:
17年5月30日星期二23:59:58;
17年5月31日星期二23:59:59;
17年5月31日星期三00:00:00;
五、校验
(1)第7脚(FT/OUT)外加一个上拉电阻,即在FT/OUT脚和VCC供电脚之间加一个上拉电阻;
(2)修改Control Register(Address 7)中的FT 为1,即将默认的0xAF改为0xEF,同理用write mode将0xEF写入即可;
(3)用示波器检测第二脚(OSCO:Oscillator output)是否达到32.768kHz;
(4)若达到,再用示波器检测FT/OUT脚时候达到512kHz左右;若达到则验证正确。
注意事项:M41T11需要在32.768kHz的条件下才能正常工作,若用示波器测试OSCO(第2脚)输出频率达不到32.768kHz则需要在OSCI和OSCO间加一个32.768kHz的晶振,不出意外都是需要加上的。
M41T11-RTC(实时时钟)的更多相关文章
- stm32——RTC实时时钟
stm32——RTC实时时钟 一.关于时间 2038年问题 在计算机应用上,2038年问题可能会导致某些软件在2038年无法正常工作.所有使用UNIX时间表示时间的程序都将将受其影响,因为它们以自19 ...
- 第43章 RTC—实时时钟
第43章 RTC—实时时钟 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fireg ...
- 教你在树莓派使用上RTC实时时钟,不用再担心断电后时间归零的问题,开机后自动同步RTC时钟!!!
准备工作:1.系统建议使用官方最新的镜像文件 2.RTC时钟模块板(I2C接口)建议使用DS1307时钟模块,或者RTC时钟模块RTC时钟模块: 大家知道arduino的电平是5V,树莓派是3.3V, ...
- 第43章 RTC—实时时钟—零死角玩转STM32-F429系列
第43章 RTC—实时时钟 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fireg ...
- RTC实时时钟驱动
RTC(Real-Time Clock)实时时钟为操作系统提供了一个可靠的时间,并且在断电的情况下,RTC实时时钟也可以通过电池供电,一直运行下去. RTC通过STRB/LDRB这两个ARM指令向CP ...
- RTC实时时钟
作者:宋老师,华清远见嵌入式学院讲师. 1.1 RTC介绍 在 一个嵌入式系统中,通常采用RTC 来提供可靠的系统时间,包括时分秒和年月日等,而且要求在系统处于关机状态下它也能够正常工作(通常采用后备 ...
- RTC实时时钟-备份区域BKP--原理讲解
RTC(Real Time Clock):实时时钟 BCD码:用4位2进制来表示10以内的十进制的形式. RTC的时钟源:LSE(32.768KHZ).HSE_RTC.LSI.经过一个精密校准(RTC ...
- stm32 rtc 实时时钟
STM32的实时时钟是一个独立的定时器 通常会在后备区域供电端加一个纽扣电池,当主电源没有电的时,RTC不会停止工作 若VDD电源有效,RTC可以触发秒中断.溢出中断和闹钟中断 备份寄存器BKP 备份 ...
- 【iCore3 双核心板】例程十:RTC实时时钟实验——显示日期和时间
实验指导书及代码包下载: http://pan.baidu.com/s/1jHuZcnc iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
- 【iCore4 双核心板_ARM】例程十:RTC实时时钟实验——显示时间和日期
实验现象: 核心代码: int main(void) { /* USER CODE BEGIN 1 */ RTC_TimeTypeDef sTime; RTC_DateTypeDef sDate; ; ...
随机推荐
- 初识JS
今儿我遇到一特别恐怖的事儿,JS 刚开始的我看到JS感觉是懵逼的,翻开第一页,感觉是棒棒哒,再看第二页,感觉是easy的,看到第三页是恐怖的,当看到的第四页的时候,我感觉今年的清明节是为我准备的 废话 ...
- Google Firebase Unity接入的坑
就说跑demo碰到的坑吧 https://firebase.google.com/docs/unity/setup 这是Firebase Unity的setup指南 大概写写步骤: 1. Fireba ...
- 在spring boot环境中使用fastjson + redis的高速缓存技术
因为项目需求,需要在spring boot环境中使用redis作数据缓存.之前的解决方案是参考的http://wiselyman.iteye.com/blog/2184884,具体使用的是Jackso ...
- Spring+SpringMVC+Mybaties整合之配置文件如何配置及内容解释--可直接拷贝使用--不定时更改之2017/4/27
以下配置可直接使用,只需更改包名. 关于内部标签的解释及用法,都以注解形式在代码内部说明.个人原创,转载需注明出处. 1,web.xml.添加jar包后首先需要配置WEB-INF下的web.xml文件 ...
- 【响应式】foundation栅格布局的“尝鲜”与“填坑”
提到响应式,就不得不提两个响应式框架--bootstrap和foundation.在标题上我已经说明白啦,今天给大家介绍的是foundation框架. 何为"尝鲜"?就是带大伙 ...
- 做一个常规的banner图——负边距的使用、banner图的拼法
在这之前,首先要了解如何设置块级元素在块级元素水平居中 方法: 设置子容器为定位元素 水平居中 left:50%:margin-left:-width/2: 垂直居中 top:50%:margin-t ...
- IE报vuex requires a Promise polyfill in this browser问题解决
使用Vuex, IE浏览器报错 因为使用了 ES6 中用来传递异步消息的的Promise,而IE低版本的浏览器不支持. ##解决方法 第一步: 安装 babel-polyfill . babel-po ...
- Elasticsearch 默认配置 IK 及 Java AnalyzeRequestBuilder 使用
摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 春夏秋冬失去了你,我怎么过一年四季- 民谣歌词 』 本文提纲 一.什么是 Ela ...
- Spring Cloud 学习笔记(一)——入门、特征、配置
[TOC] 0 放在前面 0.1 参考文档 http://cloud.spring.io/spring-cloud-static/Brixton.SR7/ https://springcloud.cc ...
- Jfinal中Db类的的使用
Jfinal提供了两种操作数据库的组件,分别是Model类和DB类,可以极大地减少代码量,提高开发效率. Db类提供了在Model类之外更丰富的的数据库操作能力,使用Db类以及嵌套的Record类时, ...