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

    写操作

     

    读操作

     

  • 相关阅读:
    win7下的vxworks总结
    ubuntu 无法获得锁 /var/lib/dpkg/lock
    项目中用到了的一些批处理文件
    win7下安装 WINDRIVER.TORNADO.V2.2.FOR.ARM
    使用opencv统计视频库的总时长
    January 05th, 2018 Week 01st Friday
    January 04th, 2018 Week 01st Thursday
    January 03rd, 2018 Week 01st Wednesday
    January 02nd, 2018 Week 01st Tuesday
    January 01st, 2018 Week 01st Monday
  • 原文地址:https://www.cnblogs.com/zjlbk/p/11552397.html
Copyright © 2011-2022 走看看