zoukankan      html  css  js  c++  java
  • 2019年9月19日星期四(STM32 rtc实时时钟 i2c协议)

    一.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

    写操作

     

    读操作

     

  • 相关阅读:
    暑假周进度总结(一)
    第十七周进度总结
    大二下学期软件工程概论总结
    第十六周进度总结
    程序员修炼之道读书笔记(三)
    程序员修炼之道读书笔记(二)
    《程序员修炼之道》读书笔记(一)
    第十五周进度总结
    python之路--day6---文件处理
    python之路--day6--字符编码
  • 原文地址:https://www.cnblogs.com/zjlbk/p/11552397.html
Copyright © 2011-2022 走看看