一、理论准备
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的晶振,不出意外都是需要加上的。
上一篇:STM8S——Universal asynchronous receiver transmitter (UART)
下一篇:STM8S——Flash program memory and data EEPROM
推荐阅读
史海拾趣
面对日益激烈的市场竞争,爱浦电子始终坚持创新驱动的发展战略。公司不断投入研发资金,引进先进技术和设备,推动产品创新和技术升级。同时,爱浦电子还积极探索新的应用领域和市场机会,拓展产品的应用范围。这些创新举措为公司未来的发展奠定了坚实的基础,也为整个电子行业的发展注入了新的活力。
爱浦电子自成立以来,一直致力于模块电源技术的研发与创新。在成立初期,公司便凭借其专业的研发团队和先进的生产设备,成功研发出多款具有竞争力的模块电源产品。随着技术的不断进步,爱浦电子不断对产品进行升级和优化,以满足市场日益增长的需求。公司不仅通过了ISO9001质量管理体系认证,还成功获得了CE、RoHS等国际认证,进一步提升了产品的品质和竞争力。
在产品质量得到保障的同时,爱浦电子也积极开展市场拓展和品牌建设工作。公司积极参加国内外电子展会和技术交流活动,与众多行业伙伴建立了紧密的合作关系。此外,爱浦电子还注重品牌形象的塑造,通过统一的对外标识和全新的VI企业形象,提升了公司整体形象。这些努力使得爱浦电子在市场上逐渐树立起了良好的口碑和品牌形象。
爱浦电子自成立以来,一直致力于模块电源技术的研发与创新。在成立初期,公司便凭借其专业的研发团队和先进的生产设备,成功研发出多款具有竞争力的模块电源产品。随着技术的不断进步,爱浦电子不断对产品进行升级和优化,以满足市场日益增长的需求。公司不仅通过了ISO9001质量管理体系认证,还成功获得了CE、RoHS等国际认证,进一步提升了产品的品质和竞争力。
作为一家有社会责任感的企业,柯爱亚积极参与各种公益活动。公司不仅捐款捐物支持灾区重建、教育事业等公益事业,还组织员工参与志愿者活动,为社会做出了积极贡献。这些行为展现了柯爱亚作为一家优秀企业的社会担当和良好形象。
请注意,以上故事框架仅供参考,具体内容需要根据柯爱亚公司的实际发展历程进行编写。
作为一家有社会责任感的企业,柯爱亚积极参与各种公益活动。公司不仅捐款捐物支持灾区重建、教育事业等公益事业,还组织员工参与志愿者活动,为社会做出了积极贡献。这些行为展现了柯爱亚作为一家优秀企业的社会担当和良好形象。
请注意,以上故事框架仅供参考,具体内容需要根据柯爱亚公司的实际发展历程进行编写。
摘要:变频器是工业自动化系统中的基本拖动设备。当应用环境非常恶劣,不适合于人在现场对变频器直接进行控制时就需要对变频器进行远程控制。主要介绍了如何用VC编写控制软件对变频器进行联网控制。 关键词:变频器;控制软件;联网控制 0 ...… 查看全部问答∨ |
近年来随着微电子技术的不断发展,半导体技术和集成电路技术也在迅速发展。目前,IC卡已经深入到社会生活的各个角落,各种各样的卡大大方便了人们的生活,如银行使用的信用卡、公交车使用的交通卡、食堂使用的就餐卡 ...… 查看全部问答∨ |
小弟新手,急求红外防盗报警器的资料,希望高手帮帮忙,谢谢了!!! 小弟新手,急求【红外线防盗报警器的设计资料】,希望高手哥哥姐姐们帮帮忙,谢谢了!!!有的话可以邮箱我,lijunchong@qq.com,小弟不胜感激!!… 查看全部问答∨ |
$(\'flv_s66\').innerHTML=(mobileplayer() ? \"\" : AC_FL_RunContent(\'width\', \'400\', \'height\', \'300\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', \'http://player.youku.com/player.php/sid/XMz ...… 查看全部问答∨ |
ModelSim Altera仿真效果图如下:Udal341芯片L3接口控制如图1,在Mode_L3为低时(地址模式),每个Sysclk_L3的上升沿给Data_L3送一个数据,依次为01101000(低位在前);之后,再将Mode_L3拉高(数据传输模式),每个Sysclk_L3的上升沿给Data_L3送 ...… 查看全部问答∨ |
各位高手,我用过一批国产开关电源,带铅蓄电池充放电功能的。在现场使用中常常有坏的情况,容易在出现停电、天气变化时好多被损坏,严重的地区有1/3坏的。 电源返回来可以修好,主要就是坏了PWM芯片、芯片供电串联 ...… 查看全部问答∨ |