练习:
设置RTC,读取日期和时间打印出来,验证断电后时间是否还在
添加一个蓝牙命令,读取当前日期时间
5.RTC的闹钟配置
//关闭RTC寄存器写保护
(1)关闭闹钟
RTC_AlarmCmd(RTC_Alarm_A, DISABLE);
(2)设置闹钟参数
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; /*!< 闹钟时间掩码 @ref RTC_AlarmMask_Definitions */
uint32_t RTC_AlarmDateWeekDaySel; /*!< 日期/星期选择 @ref RTC_AlarmDateWeekDay_Definitions */
uint8_t RTC_AlarmDateWeekDay; /*!< 日期 1-31 range.
星期 @ref RTC_WeekDay_Definitions */
}RTC_AlarmTypeDef;
(3)清除中断标志
RTC_ClearITPendingBit(RTC_IT_ALRA);
(4)使能闹钟A中断
RTC_ITConfig(RTC_IT_ALRA, ENABLE);
(5)外部中断初始化
EXTI_Init(...);
(6)初始化NVIC
NVIC_Init(...);
(7)启动闹钟
RTC_AlarmCmd(RTC_Alarm_A, ENABLE);
(8)实现RTC闹钟中断处理函数
void RTC_Alarm_IRQHandler(void)
{
//清除闹钟中断标志
RTC_ClearITPendingBit(RTC_IT_ALRA);
//清除外部中断标志
EXTI_ClearITPendingBit(EXTI_Line17);
}
练习:
修改闹钟时间掩码,测试闹钟触发情况
二十三.IIC
1.概念
IIC(I2C)是一种串行的通信方式,属于两线式的半双工,飞利浦公司发明的用于连接微控制器和外部设备的一种总线。
IIC由数据线(SDA)和时钟线(SCL)构成总线,可以在CPU和外设之间实现数据的双向传输,传输速度100K ~ 400K bps
2.物理连接
IIC属于一主多从(Master-Slave)的传输模式,主设备一般都是CPU,IIC总线的传输永远由主设备发起,从设备被动响应。IIC通信中使用从设备地址来区分不同的从设备。IIC传输一次传输1字节。
IIC外设和开发板连接一般都是4根线,VCC GND SCL SDA
3.IIC通信协议
SCL和SDA默认高电平,表示总线空闲
(1)起始信号 ------- 开始通信
保持SCL为高电平,SDA从高向低跳变
(2)停止型号 ------ 结束通信
保持SCL为高电平,SDA从低向高跳变
(3)应答信号(ACK)
在发送完一个字节之后的第9个时钟周期由接收者控制数据线进行应答(低电平表示有效应答,高电平表示无效应答)。
(4)数据传输
数据的接收者在SCL为高电平读取SDA的电平作为该位数据,因此在SCL为高电平时SDA要保持电平稳定,在SCL为低电平时改变SDA。
4.IIC总线的传输步骤
(1)主设备发送起始信号
(2)主设备发送从设备地址(7位)+读写信号(1表示读,0表示写)
如果从设备在位(地址匹配),向主设备发送ACK(有效应答)
(3)主设备按照从设备的要求和从设备通信
通过从设备的说明手册
(4)通信完成之后主设备发送停止信号
5.at24c02 ---------- eeprom
at24c02是一款eeprom芯片,eeprom是电擦除的掉电数据不丢失的存储芯片,和外部通过IIC接口进行通信(读/写)。
(1)原理图
写保护(关闭),A0,A1,A2接地,对应的地址位为0
IIC的SCL和SDA连接到了CPU的PB8 PB9
(2)at24c02的说明手册
从设备地址:
读写操作:
(3)IIC通信的编程实现
1)使用GPIO模拟IIC时序进行传输
2)使用芯片内部的IIC控制器进行传输(如果有的话)
只需要将数据交给IIC控制器(发送),从控制器直接读取数据(接收)
(4)at24c02按页写和连续读
练习:
添加蓝牙命令,实现at24c02的字节读写
eepromread:0x10:*
eepromwrite:0x10:0x55:*
strtok函数 ------ 分割字符串
char *strtok(char s[],char *delim);
//第一个参数是要分割的字符串,第二个参数是分隔符
//返回第一个子串,自此调用返回下一个子串(此时第一个参数传NULL)
//返回NULL表示子串取完了
作业:
通过蓝牙命令修改时间
发送命令
settime:17:35:50:*
//1.使能PWR时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
//2.使能RTC寄存器的写操作
PWR_BackupAccessCmd(ENABLE);
//5.关闭RTC写保护,等待就绪
RTC_WaitForSynchro();
//设置时间
RTC_SetTime(xxx);