I2C通信协议
一、RTC_Init()
1.1 RTC_HandleTypeDef
- Instance:指向 RTC 外设寄存器基地址
- Init:包含初始化 RTC 所需的参数
- Lock:用于锁定和解锁 RTC 外设
- State:定义 RTC 的状态
1.2 RTC_InitTypeDef
- HourFormat:设置 RTC 的小时制格式
RTC_HOURFORMAT_24
:使用 24 小时制
RTC_HOURFORMAT_12
:使用 12 小时制
- AsynchPrediv:设置 RTC 外设的异步预分频器
通常设置为 127
- SynchPrediv:RTC 的同步预分频器
通常设置为 255
- OutPut:选择将哪个信号输出到 RTC 输出引脚
RTC_OUTPUT_DISABLE
:禁用 RTC 输出
RTC_OUTPUT_ALARMA
:闹钟 A 输出
RTC_OUTPUT_ALARMB
:闹钟 B 输出
RTC_OUTPUT_WAKEUP
:唤醒信号输出
- OutPutPolarity:配置输出信号的极性
RTC_OUTPUT_POLARITY_HIGH
:输出高电平
RTC_OUTPUT_POLARITY_LOW
:输出低电平
- OutPutType:配置 RTC 输出引脚的类型
RTC_OUTPUT_TYPE_OPENDRAIN
:开漏模式
RTC_OUTPUT_TYPE_PUSHPULL
:推挽模式
1.3 HAL_RTC_Init()
HAL_RTC_Init(RTC_HandleTypeDef *hrtc)
调用函数初始化1.1 1.2的配置
1.4 RTC事件设置
1.4.1 RTC_TimeTypeDef
- Hours:小时
0 到 23
或 1 到 12
- Minutes:分钟
0 到 59
- Seconds:秒钟
0 到 59
- TimeFormat:指示时间是 12 小时制还是 24 小时制
RTC_HOURFORMAT_12
:12 小时制
RTC_HOURFORMAT_24
:24 小时制
SubSeconds:表示秒钟的更高精度
SecondFraction:表示时间的分数部分
DayLightSaving:指示是否启用了夏令时
RTC_DAYLIGHTSAVING_SUB1H
:夏令时减去 1 小时
RTC_DAYLIGHTSAVING_ADD1H
:夏令时加上 1 小时
RTC_DAYLIGHTSAVING_NONE
:不使用夏令时
- StoreOperation:是否在某些操作中存储 RTC 时间
RTC_STOREOPERATION_RESET
:重置 RTC 存储操作
RTC_STOREOPERATION_SET
:设置 RTC 存储操作
1.4.2 HAL_RTC_SetTime()设置时间
HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
hrtc:指向
RTC_HandleTypeDef
结构体的指针sTime:1.4.1配置的结构体
Format:RTC 日期和时间格式
RTC_FORMAT_BIN
:二进制格式
RTC_FORMAT_BCD
:BCD 格式
1.4.3 RTC_DateTypeDef
- WeekDay:当前日期是星期几
- Month:当前日期的月份
- Date:当前月份中的日期
- Year:当前年份(2023年为23)
1.4.4 HAL_RTC_SetDate()设置日期
HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
hrtc:指向
RTC_HandleTypeDef
结构体的指针sTime:1.4.3配置的结构体
Format:RTC 日期和时间格式
RTC_FORMAT_BIN
: 二进制格式
RTC_FORMAT_BCD
:BCD 格式
1.5 设置闹钟
1.5.1 RTC_AlarmTypeDef
- AlarmTime:指定 RTC 闹钟的时间部分
- AlarmMask:设置 RTC 闹钟触发时应忽略哪些时间部分
RTC_ALARMMASK_NONE
:不忽略任何字段
RTC_ALARMMASK_DATEWEEKDAY
:忽略日期和星期字段
RTC_ALARMMASK_HOURS
:忽略小时字段
RTC_ALARMMASK_MINUTES
:忽略分钟字段
RTC_ALARMMASK_SECONDS
:忽略秒字段
RTC_ALARMMASK_ALL
:忽略所有字段
- AlarmSubSecondMask:设置 RTC 闹钟触发时应忽略的子秒部分
- AlarmDateWeekDaySel:选择闹钟基于日期还是星期几触发
RTC_ALARMDATEWEEKDAYSEL_DATE
:选择日期触发闹钟
RTC_ALARMDATEWEEKDAYSEL_WEEKDAY
:选择星期几触发闹钟
- AlarmDateWeekDay:
- 如果选择了日期触发,则此字段指定具体的日期(1 到 31)
- 如果选择了星期触发,则此字段指定星期几(如
RTC_WEEKDAY_MONDAY
表示星期一)
- Alarm:指定闹钟的类型或其他相关配置
RTC_ALARM_A
:闹钟A
RTC_ALARM_B
:闹钟B
1.5.2 RTC_TimeTypeDef
同1.2配置
1.6 HAL_RTC_SetAlarm_IT()
HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)
设定1.5.2的配置
hrtc:指向
RTC_HandleTypeDef
结构体的指针sAlarm:指向
RTC_AlarmTypeDef
结构体的指针Format:指时间格式
调用此函数初始化1.5中的配置
1.7 唤醒定时器
HAL_RTCEx_SetWakeUpTimer_IT(RTC_HandleTypeDef *hrtc, uint32_t WakeUpCounter, uint32_t WakeUpClock)
- hrtc:指向 RTC 句柄的指针
- WakeUpCounter:设置唤醒定时器的计数器值
- WakeUpClock:唤醒定时器的时钟源
RTC_WAKEUPCLOCK_RTCCLK_DIV16
:分频为 16
RTC_WAKEUPCLOCK_RTCCLK_DIV8
:分频为 8
RTC_WAKEUPCLOCK_RTCCLK_DIV4
:分频为 4
RTC_WAKEUPCLOCK_RTCCLK_DIV2
:分频为 2
RTC_WAKEUPCLOCK_CK_SPRE_16BITS
: 16 位的分频时钟作为唤醒时钟源
RTC_WAKEUPCLOCK_CK_SPRE_17BITS
:选择 17 位的分频时钟作为唤醒时钟源
二、唤醒中断
2.1 RTC_WKUP_IRQHandler()
1 | void RTC_WKUP_IRQHandler(void) |
2.2 回调函数
1 | void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc) |
三、闹钟时间中断
3.1 RTC_Alarm_IRQHandler()
1 | void RTC_Alarm_IRQHandler(void) |
3.2 闹钟回调函数
1 | void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) |
1 | // RTC_TimeTypeDef nowTime; |