2019年9月19日星期四(STM32 rtc实时时钟 i2c协议)

陌路散爱 提交于 2021-01-08 20:17:19

一.RTC(实时时钟)

1.背景

    时间在计算机系统中是一个非常重要的参数,在很多应用场景下都需要使用时间。RTC就是一个专门记录时间的设备,本质上是一个1Hz定时器。

    为了计时准确,计时系统掉电也要能够正常计时。为了到达这个目的,RTC需要独立的时钟源,独立的供电电源

    stm32f407的RTC的时钟源是低速晶振(LSE---32.768KHz),使用纽扣电池单独供电

 

 

 

 

2.stm32f407的RTC

 

        RTC进行2次预分频,一次7位异步和15位的同步,最终得到1hz的时钟,为了降低功耗,异步预分频器尽量设置较大的值

 

        RTC的中断属于外部中断,按照外部中断的方法配置

 

3.RTC编程实现

(1)使能PWR时钟

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

(2)使能RTC寄存器访问

    PWR_BackupAccessCmd(ENABLE);

(3)选择RTC时钟源(LSE)

    RCC_LSEConfig(RCC_LSE_ON);//使能LSE时钟

    while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)!=SET);//等待LSE就绪

    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);//选择LSE作为RTC时钟源

    RCC_RTCCLKCmd(ENABLE);//使能RTC时钟

(4)等待所有RTC寄存器就绪

    RTC_WaitForSynchro();

(5)初始化RTC(分频系数/时间格式)

    ErrorStatus RTC_Init(RTC_InitTypeDef* RTC_InitStruct)

 typedef struct
{
  uint32_t RTC_HourFormat;   /*!< 12/24小时格式  @ref RTC_Hour_Formats */
 
  uint32_t RTC_AsynchPrediv; /*!< 异步分频系数 0x7f lower than 0x7F */
 
  uint32_t RTC_SynchPrediv;  /*!< 同步分频系数 0xff lower than 0x7FFF */
}RTC_InitTypeDef;

(6)设置日期和时间

    ErrorStatus RTC_SetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct)

  typedef struct
{
  uint8_t RTC_Hours;    /*!< 时 */

  uint8_t RTC_Minutes;  /*!< 分 */
 
  uint8_t RTC_Seconds;  /*!< 秒 */

  uint8_t RTC_H12;      /*!< 上午/下午 AM/PM @ref RTC_AM_PM_Definitions */
}RTC_TimeTypeDef;

    ErrorStatus RTC_SetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct)   

  typedef struct
{
  uint8_t RTC_WeekDay; /*!< 星期 @ref RTC_WeekDay_Definitions */
 
  uint8_t RTC_Month;   /*!< 月 @ref RTC_Month_Date_Definitions*/

  uint8_t RTC_Date;     /*!< 日 */
 
  uint8_t RTC_Year;     /*!< 年 */
}RTC_DateTypeDef;

(7)往RTC备份寄存器中写入一个数据

    RTC_WriteBackupRegister(RTC_BKP_DR0, 0x8888);


(8)获取时间和日期

    void RTC_GetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct)

    void RTC_GetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct)


 如果使用闹钟功能,需要以下步骤:

(1)设置闹钟时间

    void RTC_SetAlarm(uint32_t RTC_Format, uint32_t RTC_Alarm, RTC_AlarmTypeDef* RTC_AlarmStruct)

    参数:

        RTC_Format - 时间格式(RTC_Format_BCD)

        RTC_Alarm - 哪个闹钟(RTC_Alarm_A)

        RTC_AlarmStruct - 闹钟时间结构体

 typedef struct
{
  RTC_TimeTypeDef RTC_AlarmTime;     /*!< 闹钟时间 */

  uint32_t RTC_AlarmMask;            /*!< 闹钟时间中要屏蔽的成员 */

  uint32_t RTC_AlarmDateWeekDaySel;  /*!< 选择星期匹配/日期匹配 @ref RTC_AlarmDateWeekDay_Definitions */
 
  uint8_t RTC_AlarmDateWeekDay;      /*!< 闹钟 星期/日期  @ref RTC_WeekDay_Definitions */
}RTC_AlarmTypeDef;

(2)清除闹钟中断标识,使能闹钟中断

    RTC_ClearITPendingBit(RTC_IT_ALRA);

    RTC_ITConfig(RTC_IT_ALRA, ENABLE);

(3)初始化外部中断(上升沿触发 外部中断线17)

    EXTI_Init(.....);

(4)初始化NVIC(中断号-RTC_Alarm_IRQn)

    NVIC_Init(...);

(5)使能闹钟

    RTC_AlarmCmd(RTC_Alarm_A, ENABLE);

二.IIC

1.概念

    IIC(I2C)属于两线式串行总线,由飞利浦公司开发用于微控制器和外围设备进行通信一种总线(板间通信)

    IIC由数据线(SDA)和时钟线(SCL)组成的串行总线,可用于发送和接收数据,属于半双工通信,IIC通信速度为 100Kbps(400Kbps)

2.IIC线路连接

    IIC通信除了SCL和SDA以外,一般还有电源线(VCC)和地(GND)。IIC属于一主多从的总线结构(一个主设备(Master),多个从设备(slave))

    通信由主设备发起,从设备被动响应,实现数据传输

    

3.IIC通信协议

(1)SCL和SDA接上拉电阻,默认高电平,表示总线是空闲状态

(2)从设备地址(7bit)

    用来区分总线上不同的从设备,从设备地址有固定部分和可配置部分 

(3)起始信号

    SCL保持高电平,SDA由高向低跳变

 

(4)停止信号

    SCL保持高电平,SDA由低向高跳变

 

(5)应答信号 ----- 收到有效数据向对方响应的信号

    发送方每发送一个字节(8位),在第9个时钟周期释放数据线,接收对方的应答

    有效应答为低电平(ACK),表示对方接收成功;无效应答为高电平(NACK),表示对方没有接收成功

(6)数据传输的实现

    由SCL和SDA配合实现的,在SCL为高电平期间,保持SDA数据稳定(这段时间是对方读取数据时间)

    在SCL为低电平期间,可以改变SDA的电平(这段时间是设置要发送的数据时间)

 

        在IIC参考时钟的控制下,按照上述方法一位一位一次发送每一位数据

4.IIC协议通信过程

1)主设备发送起始信号

2)主设备发送从设备地址(高7bit)和读/写信号(低1bit)

    1表示读,0表示写

3)等待从设备响应(ACK)

-------------------------读--------------------------

4)发送读数据 寄存器/内部 地址(由从设备)
5)等待ACK
6)主设备发送起始信号,主设备发送从设备地址和读信号
7)读取从设备发送过来的数据

-----------------------写---------------------------

4)发送写数据 寄存器/内部 地址(由从设备)
5)等待ACK
6)发送要写的数据

5.IIC通信的实现

1)使用GPIO模拟实现

    如果芯片上没有IIC控制器,或者控制接口不够用,使用IO口模拟实现IIC通信协议

    手动控制IO口,实现IIC的信号和数据传输

2)使用IIC控制器

    IIC控制器将IIC协议中的固定部分实现,我们只需要将IIC协议中的可变部分(从设备地址 数据)提供给控制器

    控制器自动按照IIC协议实现传输    

6.at24c02

    at24c02是一种eeprom,电擦除的存储芯片,存储的数据掉电不丢失,实际应用中用来存储版本信息,更新信息等等

1)原理图

 

 

 

 

 

 

 

 

 

 

 

  

2)AT24C02说明手册

 

从设备地址

 

    1010000 = 0x50

写操作

 

读操作

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!