一.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_H12; |
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 |
(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 uint32_t |
(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
写操作
读操作
原文地址:https://www.cnblogs.com/zjlbk/p/11552397.html