历史上的今天

今天是:2024年11月19日(星期二)

2019年11月19日 | M41T11-RTC(实时时钟)

发布者:梦想学院 来源: eefocus关键字:M41T11  RTC  实时时钟  STM8 手机看文章 扫描二维码
随时随地手机看文章

一、理论准备


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)将数组内容通过串口格式化输出到终端里,为了获取实时时间,死循环读取并输出到串口,通过终端中不停的打印信息,可以看到时间的变化。


三、核心代码:


 在我的代码中,发送操作需要中断,并且从地址的发送已经在中断里实现自动发送;


 1 //real-time clock 

 2   

 3   

 4   //set ST 1

 5   I2C_ITConfig((I2C_IT_TypeDef)(I2C_IT_EVT | I2C_IT_BUF) , ENABLE);

 6   enableInterrupts();

 7   Tx_Idx = 0;

 8   NumOfBytes =2;

 9   TxBuffer[0]=0x00;

10   TxBuffer[1]=0x80;

11   I2C_Send();

12   disableInterrupts();

13   

14   //set ST 0 and set the right time

15   __IO uint8_t i,j;

16   for(i=0;i<8;i++){

17     

18     I2C_ITConfig((I2C_IT_TypeDef)(I2C_IT_EVT | I2C_IT_BUF) , ENABLE);

19     enableInterrupts();

20     

21     Tx_Idx = 0;

22     NumOfBytes =2;

23     TxBuffer[0]=i;  //address

24     TxBuffer[1]=timeData[i];

25     I2C_Send();

26     

27     disableInterrupts();

28   }

29   

30   //issue read adddress

31   while(1) {

32     for(i=0;i<7;i++){

33       

34       I2C_ITConfig((I2C_IT_TypeDef)(I2C_IT_EVT | I2C_IT_BUF) , ENABLE);

35       enableInterrupts();

36       

37       Tx_Idx = 0;

38       NumOfBytes =1;

39       TxBuffer[0]=i;   //address

40       I2C_Send();

41       

42       Rx_Idx = 0; 

43       NumByteToRead =1; 

44       I2C_Read(); 

45       curtime[i] = RxBuffer[0];

46       uart2str(uartbuff,curtime[i],2,16,'0');   //output press times

47       printf("%s: ",uartbuff); 

48     

49       disableInterrupts();

50     }

51     printf("nr",uartbuff); 

52   }

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  实时时钟  STM8 引用地址:M41T11-RTC(实时时钟)

上一篇:STM8S——Universal asynchronous receiver transmitter (UART)
下一篇:STM8S——Flash program memory and data EEPROM

推荐阅读

本来只是路过,写详细一点。我看楼主浮躁得不得了。现在什么都不要做了,先去看几遍《不要做浮躁的嵌入式工程师》这篇文章,想清楚了,再动手吧。我做了个实例,不用ST的库来点LED,解答你的问题我的 KeilMDK 3.5我的STM32板子奋斗版是 ,IC 是 STM32F103VET6调试工具 JLINK V8LED 接在 PB5 ,高电平点亮既然楼主说一定懂C语言了,那么对于下面...
/*AVR相位修正PWM定时器0发生模式*//*PWM波的产生机理是定时器0的TCNT0由0到255,在由255到0,不断地计数,当在0-255计数时TCNT0=OCR0时在OC0引脚上出现低电平,*//*当在255-0计数时TCNT0=OCR0时在OC0引脚上出现高电平,当由0加到255,再由255减到0时,产生溢出中断,可以再终端服务中修改OCR0的值,以改变占空比,比用引脚模拟要准确*//*另外值得说的是相...
  随着全球能源短缺和大气污染问题日益严峻以及社会环保意识不断增强,新能源电动汽车行业的发展成为解决此类问题的关键点。ABB电动交通解决方案应用而生,基于安全性和可靠性,全力打造场景化充电方案,满足市场各类需求。 “新基建” 下的充电桩将不再是独立的桩,而是充电基础设施与通信技术有机的融合,利用新的技术来提升充电基础设施的利用率...
2021EdgeX中国挑战赛闭幕,英特尔赋能开发者,加速智能边缘场景化落地2021年11月19日,上海——2021EdgeX中国挑战赛昨日圆满落幕,以“数智共创转型共融”为主题的闭幕式颁奖典礼于上海汽车会展中心举行。本次大赛由Linux基金会、上海市科委、北京市科委、中关村管委会等机构联合主办,英特尔、阿里云、百度云、紫竹ET、EMQ映云科技、InnoSpace、IOTech、...

史海拾趣

问答坊 | AI 解惑

基于VC环境的变频器联网控制

摘要:变频器是工业自动化系统中的基本拖动设备。当应用环境非常恶劣,不适合于人在现场对变频器直接进行控制时就需要对变频器进行远程控制。主要介绍了如何用VC编写控制软件对变频器进行联网控制。 关键词:变频器;控制软件;联网控制   0  ...…

查看全部问答∨

基于TI射频标签多协议芯片及Microchip

     近年来随着微电子技术的不断发展,半导体技术和集成电路技术也在迅速发展。目前,IC卡已经深入到社会生活的各个角落,各种各样的卡大大方便了人们的生活,如银行使用的信用卡、公交车使用的交通卡、食堂使用的就餐卡 ...…

查看全部问答∨

异步串口通信

紧急求助各位大侠,为何我从串口读取信息的时候老发生溢出错误,UFSTAT1的值为0X100(即接收FIFO已满,但接收数据量为零)我用是44BOX,给串口发信息的是GSM模块,当串口需要接收的信息稍多的时候,首先会触发串口中断,可是在串口中断函数内部,UF ...…

查看全部问答∨

C51中断处理过程

说明:由于转发的帖子是在很久前浏览网页的时候收藏下来的,作者与源地址已经无从考究,请作者见谅! C51中断处理过程        C51编译器支持在C源程序中直接开发中断过程,因此减轻了使用汇编语言的繁琐工作,提高了开发效率 ...…

查看全部问答∨

关于c52与摄像头

欲制作一通过c52实现参数设置功能并实现数据的存取操作的不使用usb摄像头的远程实时监控系统 在网上搜索时发现ov7620摄像头模块价格较低,但不知是否适用于此单片机,或建议我一些性价比较高的并适用于c52的摄像头模块··· 知道的兄弟请解我疑 ...…

查看全部问答∨

能给出tonardo下memshow()的代码吗?

在网上找过但是没找到,many thanks!…

查看全部问答∨

小弟新手,急求红外防盗报警器的资料,希望高手帮帮忙,谢谢了!!!

小弟新手,急求【红外线防盗报警器的设计资料】,希望高手哥哥姐姐们帮帮忙,谢谢了!!!有的话可以邮箱我,lijunchong@qq.com,小弟不胜感激!!…

查看全部问答∨

新手DIY的宿舍管理系统

$(\'flv_s66\').innerHTML=(mobileplayer() ? \"\" : AC_FL_RunContent(\'width\', \'400\', \'height\', \'300\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', \'http://player.youku.com/player.php/sid/XMz ...…

查看全部问答∨

uda1341的驱动不起来

ModelSim Altera仿真效果图如下:Udal341芯片L3接口控制如图1,在Mode_L3为低时(地址模式),每个Sysclk_L3的上升沿给Data_L3送一个数据,依次为01101000(低位在前);之后,再将Mode_L3拉高(数据传输模式),每个Sysclk_L3的上升沿给Data_L3送 ...…

查看全部问答∨

开关电源损坏的奇怪原因

    各位高手,我用过一批国产开关电源,带铅蓄电池充放电功能的。在现场使用中常常有坏的情况,容易在出现停电、天气变化时好多被损坏,严重的地区有1/3坏的。     电源返回来可以修好,主要就是坏了PWM芯片、芯片供电串联 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved