STM32F4学习笔记10——RTC实时时钟

发布者:science56最新更新时间:2017-09-20 来源: eefocus关键字:STM32F4  RTC  实时时钟 手机看文章 扫描二维码
随时随地手机看文章

RTC实时时钟 
实时时钟 (RTC) 是一个独立的 BCD 定时器/计数器。RTC 提供一个日历时钟、两个可编程 闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志。RTC 还包含用于管理低功耗模 式的自动唤醒单元。 
两个 32 位寄存器包含二进码十进数格式 (BCD) 的秒、分钟、小时(12 或 24 小时制)、星 期几、日期、月份和年份。此外,还可提供二进制格式的亚秒值。 
系统可以自动将月份的天数补偿为 28、29(闰年)、30 和 31 天。并且还可以进行夏令时 补偿。 
其它 32 位寄存器还包含可编程的闹钟亚秒、秒、分钟、小时、星期几和日期。 
此外,还可以使用数字校准功能对晶振精度的偏差进行补偿。 
上电复位后,所有 RTC 寄存器都会受到保护,以防止可能的非正常写访问。 
无论器件状态如何(运行模式、低功耗模式或处于复位状态),只要电源电压保持在工作范围内,RTC 便不会停止工作。

RTC主要特性 
● 包含亚秒、秒、分钟、小时(12/24 小时制)、星期几、日期、月份和年份的日历。 
● 软件可编程的夏令时补偿。 
● 两个具有中断功能的可编程闹钟。可通过任意日历字段的组合驱动闹钟。 
● 自动唤醒单元,可周期性地生成标志以触发自动唤醒中断。 
● 参考时钟检测:可使用更加精确的第二时钟源(50 Hz 或 60 Hz)来提高日历的精确度。 
● 利用亚秒级移位特性与外部时钟实现精确同步。 
● 可屏蔽中断/事件: 
— 闹钟 A 
— 闹钟 B 
— 唤醒中断 
— 时间戳 
— 入侵检测 
● 数字校准电路(周期性计数器调整) 
— 精度为 5 ppm 
— 精度为 0.95 ppm,在数秒钟的校准窗口中获得 
● 用于事件保存的时间戳功能(1 个事件) 
● 入侵检测: 
— 2 个带可配置过滤器和内部上拉的入侵事件 
● 20 个备份寄存器(80 字节)。发生入侵检测事件时,将复位备份寄存器。 
● 复用功能输出 (RTC_OUT),可选择以下两个输出之一: 
— RTC_CALIB:512 Hz 或 1 Hz 时钟输出(LSE 频率为 32.768 kHz)。 
可通过将 RTC_CR 寄存器中的 COE[23] 位置 1 来使能此输出。该输出可连接到器件 RTC_AF1 功能。 
— RTC_ALARM(闹钟 A、闹钟 B 或唤醒)。 
可通过配置 RTC_CR 寄存器的 OSEL[1:0] 位选择此输出。该输出可连接到器件RTC_AF1 功能。 
● RTC 复用功能输入: 
— RTC_TS:时间戳事件检测。该输入可连接到器件 RTC_AF1 和 RTC_AF2 功能。 
— RTC_TAMP1:TAMPER1 事件检测。该输入可连接到器件 RTC_AF1 和 RTC_AF2功能。 
— RTC_TAMP2:TAMPER2 事件检测。 
— RTC_REFIN:参考时钟输入(通常为市电,50 Hz 或 60 Hz)。 
RTC实时时钟框图 
对于 STM32F4xx 器件,RTC_AF1 和 RTC_AF2 复用功能分别与 PC13 和 PI8 相连。

RTC功能说明 
时钟和预分频器 
RTC时钟源RTCCLK通过时钟控制器LSE时钟,LSI振荡器时钟一级HSE时钟三者中选者。可编程预分频器阶段可以生成1Hz的时钟,用于更新日历。为最大程度价格低功耗,预分频器分为两个可编程的预分频器: 
· 一个通过RTC_PRER寄存器的PREDIV_A位配置的7位异步分频器。 
· 一个通过RTC_PRER寄存器的PREDIV_S位配置的15位同步预分频器。 
为了最大程度的降低功耗,推荐将异步预分频器配置为较高的值。 
要使用频率为 32.768 kHz 的 LSE 获得频率为 1 Hz 的内部时钟 (ck_spre),需要将异步预分 频系数设置为 128,并将同步预分频系数设置为 256。 
分频系数的最小值为 1,最大值为 2^22。 
这对应于约为 4 MHz 的最大输入频率。 
fck_apre 可根据以下公式得出: 
这里写图片描述 
ck_apre 时钟用于为二进制 RTC_SSR 亚秒递减计数器提供时钟。当该计数器计数到 0 时, 会使用 PREDIV_S 的内容重载 RTC_SSR。 
fck_spre 可根据以下公式得出: 
这里写图片描述 
ck_spre 时钟既可以用于更新日历,也可以用作 16 位唤醒自动重载定时器的时基。为获得较 短的超时周期,还可以将 16 位唤醒自动重载定时器与经可编程的 4 位异步预分频器分频的 RTCCLK 一同运行。

实时时钟和日历 
RTC 日历时间和日期寄存器可通过与 PCLK1(APB1 时钟)同步的影子寄存器来访问。这 些时间和日期寄存器也可以直接访问,这样可避免等待同步的持续时间。 
● RTC_SSR 对应于亚秒 
● RTC_TR 对应于时间 
● RTC_DR 对应于日期 
每隔两个 RTCCLK 周期,便将当前日历值复制到影子寄存器,并将 RTC_ISR 寄存器的 RSF 位置 1。在停机和待机模式下不会执行复制操作。退出这两种模式 时,影子寄存器会在最长 2 个 RTCCLK 周期后进行更新。 
当应用读取日历寄存器时,它会访问影子寄存器的内容。也可以通过将 RTC_CR 寄存器的 BYPSHAD 控制位置 1 来直接访问日历寄存器。默认情况下,该位被清零,用户访问影子寄 存器。 
在 BYPSHAD=0 模式下读取 RTC_SSR、RTC_TR 或 RTC_DR 寄存器时,APB 时钟频率 (fAPB) 必须至少为 RTC 时钟频率 (fRTCCLK) 的 7 倍。 
影子寄存器通过系统复位来复位。

可编程闹钟 
RTC 单元提供两个可编程闹钟,即闹钟 A 和闹钟 B。 
可通过将 RTC_CR 寄存器中的 ALRAE 和 ALRBE 位置 1 来使能可编程闹钟功能。如果日历 亚秒、秒、分钟、小时、日期或日分别与闹钟寄存器 RTC_ALRMASSR/RTC_ALRMAR 和RTC_ALRMBSSR/RTC_ALRMBR 中编程的值相匹配,则 ALRAF 和 ALRBF 标志会被置为 1。可通过 RTC_ALRMAR 和 RTC_ALRMBR 寄存器的 MSKx 位以及 RTC_ALRMASSR 和 RTC_ALRMBSSR 寄存器的 MASKSSx 位单独选择各日历字段。可通过 RTC_CR 寄存器中 的 ALRAIE 和 ALRBIE 位使能闹钟中断。 
闹钟 A 和闹钟 B(如果已通过 RTC_CR 寄存器中的位 OSEL[0:1] 使能)可连接到 RTC_ALARM 输出。可通过 RTC_CR 寄存器的 POL 位配置 RTC_ALARM 极性。 
注意: 如果选择秒字段(RTC_ALRMAR 或 RTC_ALRMBR 中的 MSK0 位复位),则 RTC_PRER 
寄存器中设置的同步预分频器分频系数必须至少为 3,才能确保闹钟正确地运行。

周期性自动唤醒 
周期性唤醒标志由 16 位可编程自动重载递减计数器生成。唤醒定时器范围可扩展至 17 位。 
可通过 RTC_CR 寄存器中的 WUTE 位来使能此唤醒功能。 
唤醒定时器的时钟输入可以是: 
● 2、4、8 或 16 分频的 RTC 时钟 (RTCCLK)。 
当 RTCCLK 为 LSE (32.768 kHz) 时,可配置的唤醒中断周期介于 122 μs 和 32 s 之间,且分辨率低至 61 μs。 
● ck_spre(通常为 1 Hz 内部时钟) 
当 ck_spre 频率为 1 Hz 时,可得到的唤醒时间为 1s 到 36h 左右,分辨率为 1 秒。这一较大的可编程时间范围分为两部分: 
— WUCKSEL [2:1] = 10 时为 1s 到 18h。 
— WUCKSEL [2:1] = 11 时约为 18h 到 36h。在后一种情况下,会将 216 添加到 16 位计数器当前值。完成初始化序列后(请参见第 577 页的编程唤醒定时器),定时器开始递减计数。在低功耗模式下使能唤醒功能时,递减计数保持有效。此外,当计数器计数到 0 时,RTC_ISR 寄存器的 WUTF 标志会置 1,并且唤醒寄存器会使用其重载值(RTC_WUTR 寄存器值)动重载。之后必须用软件清零 WUTF 标志。 
通过将 RTC_CR2 寄存器中的 WUTIE 位置 1 来使能周期性唤醒中断时,它会使器件退出低 功耗模式。 
如果已通过 RTC_CR 寄存器中的位 OSEL[0:1] 使能周期性唤醒标志,则该标志可连接到 RTC_ALARM 输出。可通过 RTC_CR 寄存器的 POL 位配置 RTC_ALARM 极性。 
系统复位以及低功耗模式(睡眠、停机和待机)对唤醒定时器没有任何影响。

RTC的初始化和配置 
RTC 寄存器访问 
RTC 寄存器为 32 位寄存器。除了当 BYPSHAD=0 时对日历影子寄存器执行的读访问之外, APB 接口会在访问 RTC 寄存器时引入 2 个等待周期。 
RTC 寄存器写保护 
系统复位后,可通过 PWR 电源控制寄存器 (PWR_CR) 的 DBP 位保护 RTC 寄存器以防止 非正常的写访问。必须将 DBP 位置 1 才能使能 RTC 寄存器的写访问。 
上电复位后,所有 RTC 寄存器均受到写保护。通过向写保护寄存器 (RTC_WPR) 写入一个 密钥来使能对 RTC 寄存器的写操作。 
要解锁所有 RTC 寄存器(RTC_ISR[13:8]、RTC_TAFCR 和 RTC_BKPxR 除外)的写保护, 需要执行以下步骤: 
1.将“0xCA”写入 RTC_WPR 寄存器。 
2. 将“0x53”写入 RTC_WPR 寄存器。 
写入一个错误的关键字会再次激活写保护。 
保护机制不受系统复位影响。 
复位 RTC 
日历影子寄存器(RTC_SSR、RTC_TR 和 RTC_DR)以及 RTC 状态寄存器 (RTC_ISR) 的 某些位通过所有可用的系统复位源复位为各自的默认值。 
相反,以下寄存器则通过上电复位来复位为各自的默认值并且不受系统复位的影响:RTC 当 前日历寄存器、RTC 控制寄存器 (RTC_CR)、预分频器寄存器 (RTC_PRER)、RTC 校准寄 存器(RTC_CALIBR 或 RTC_CALR)、RTC 移位寄存器 (RTC_SHIFTR)、RTC 时间戳寄 存器(RTC_TSSSR、RTC_TSTR 和 RTC_TSDR)、RTC 入侵和复用功能配置寄存器 (RTC_TAFCR)、RTC 备份寄存器 (RTC_BKPxR)、唤醒定时器寄存器 (RTC_WUTR) 以及 闹钟 A 和闹钟 B 寄存器(RTC_ALRMASSR/RTC_ALRMAR 和 RTC_ALRMBSSR/ 
RTC_ALRMBR)。 
此外,如果复位源不是上电复位源,则发生系统复位时,RTC 会继续工作。发生上电复位 时,RTC 会停止工作,并且所有 RTC 寄存器都会设置为各自的复位值。 
RTC 同步 
RTC 可与高精度的远程时钟同步。在读取亚秒字段后(RTC_SSR 或 RTC_TSSSR),即 可计算远程时钟的时间与 RTC 之间的精准偏差。之后,可使用 RTC_SHIFTR 对 RTC 的时 钟进行零点几秒的“平移”,经过调整后可消除此偏差。 
RTC_SSR 包含同步预分频器计数器的值。这样,便可计算分辨率低至 1/(PREDIV_S + 1) 秒的 RTC 的准确时间。因此,可通过增大同步预分频器的值 (PREDIV_S[14:0]) 来提高 分辨率。将 PREDIV_S 设置为 0x7FFF 时,可得到允许的最大分辨率(30.52 μs,时钟频率 为 32768 Hz)。 
但是,提高 PREDIV_S 意味着必须降低 PREDIV_A 才能将同步预分频器的输出维持在 1 Hz。 这样,异步预分频器的输出频率会增大,RTC 的动态功耗也会相应增加。 
可以使用 RTC 平移控制寄存器 (RTC_SHIFTR) 对 RTC 进行微调。可以用大小为 1/ 
(PREDIV_S + 1) 秒的分辨率对 RTC_SHIFTR 进行写操作,将时钟平移(延迟或提前)最长 1 秒。在这种平移操作中,会将 SUBFS[14:0] 值加到同步预分频器计数器 SS[15:0] 中:这将使时钟产生延迟。如果同时将 ADD1S 位置 1,则会增加一秒,与此同时减去的时间为零点几秒,因此将使时钟提前。 
注意: 初始化平移操作前,用户必须检查确认 SS[15] = 0,以确保不会发生上溢。 
对 RTC_SHIFTR 寄存器执行写操作以启动平移操作时,硬件会将 SHPF 标志置 1 以指示平 移操作挂起。完成平移操作时,硬件会将将该位清零。 
注意: 该同步功能与参考时钟检测功能不兼容:当 REFCKON=1 时,固件不能对 RTC_SHIFTR 执 
行写操作。 
Error StatusRTC_DeInit(void)功能:重定义RTC寄存器到他们的复位值,这个函数不能复位RTC时钟源跟RTC备份数据寄存器。 
ErrorStatus RTC_Init(RTC_InitTypeDef*RTC_InitStruct)功能:根据RTC参数配置RTC例子,RTC分频器寄存器是写保护的,只能在初始化模式才能写。 
void RTC_StructInit(RTC_InitTypeDef*RTC_InitStruct)功能:将RTC_InitStruct成员全部初始化成为复位值。 
void RTC_WriteProtectionCmd(FunctionalState NewState)功能:使能或禁止写保护。所有的RTC寄存器都是写保护的除(RTC_ISR[13:8],RTC_TAFCR,RTC_BKBxR)。写入错误的秘钥将从新激活写保护,写保护机制不收系统复位影响。 
ErrorStatue RTC_EnterInitMode(viod)功能:进入RTC初始化模式,RTC初始化模式是写保护模式,调用这个函数之前要先调用函数RTC_WriteProtectionCmd(DISABLE)。 
void RTC_ExitInitMode(void)功能:退出RTC初始化模式,当初始化时序完成后,4个RTCCLK时钟后日历才开始工作。RTC初始化模式是写保护的,调用这个函数之前要先调用函数RTC_WriteProtectionCmd(DISABLE)。 
ErrorStatus RTC_WaitForSynchro(void)功能:等待直到RTC时间和日期寄存器与APB时钟同步。RTC同步·模式是写保护的,使用前要先调用函数RTC_WriteProtectionCmd(DISABLE)。 
ErrorStatus RTC_RefClockCmd(FunctionalState NewState)使能或禁止RTC参考时钟。

时间和日期初始化和配置 
要编程包括时间格式和预分频器配置在内的初始时间和日期日历值,需按照以下顺序操作: 
1.将 RTC_ISR 寄存器中的 INIT 位置 1 以进入初始化模式。在此模式下,日历计数器将停 止工作并且其值可更新。 
2. 轮询 RTC_ISR 寄存器中的 INITF 位。当 INITF 置 1 时进入初始化阶段模式。大约需要 2 个 RTCCLK 时钟周期(由于时钟同步)。 
3. 要为日历计数器生成 1 Hz 时钟,应首先编程 RTC_PRER 寄存器中的同步预分频系数, 然后编程异步预分频系数。即使只需要更改这两个字段中之一,也必须对 RTC_PRER 寄存器执行两次单独的写访问。 
4. 在影子寄存器(RTC_TR 和 RTC_DR)中加载初始时间和日期值,然后通过 RTC_CR 寄存器中的 FMT 位配置时间格式(12 或 24 小时制)。 
5. 通过清零 INIT 位退出初始化模式。随后,自动加载实际日历计数器值,在 4 个 RTCCLK 时钟周期后重新开始计数。 
当初始化序列完成之后,日历开始计数。 
注意:系统复位后,应用可读取 RTC_ISR 寄存器中的 INITS 标志,以检查日历是否已初始化。如 果该标志为 0,表明日历尚未初始化,因为年份字段设置为其上电复位时的默认值 (0x00)。 
要在初始化之后读取日历,必须首先用软件检查 RTC_ISR 寄存器的 RSF 标志是否置 1。 
ErrorStatus RTC_SetTime(uint32_tRTC_Format,RTC_TimeTypeDef*RTC_TimeStruct)功能:设置当前RTC时间 
void RTC_TimeStructInit(RTC_TimeTypeDef*RTC_TimeStruct)功能:初始化RTC_TimeStruct结构体成员到复位值 
void RTC_GetTime(uint32_t RTC_Format,RTC_TimeTypeDef*RTC_TimeStruct)功能得到RTC时间。 
uint_32t RTC_GetSubSecond(void)功能:得到亚秒 
ErrorStatus RTC_SetDate(uint32_t RTC_Format,RTC_DateTypeDef*RTC_DateStruct) 
void RTC_DateStructInit(RTC_DateTypeDef*RTC_DateStruct) 
void RTC_GetDate(uint32_t RTC_Format,RTC_DateTypeDef*RTC_DateStruct)这几个函数都是设置日期的,功能与设置时间的函数是一样的。

编程闹钟 
要对可编程的闹钟(闹钟 A 或闹钟 B)进行编程或更新,必须执行类似的步骤: 
1.将 RTC_CR 寄存器中的 ALRAE 或 ALRBE 位清零以禁止闹钟 A 或闹钟 B。 
2. 轮询 RTC_ISR 寄存器中的 ALRAWF 或 ALRBWF 位,直到其中一个置 1,以确保闹钟 寄存器可以访问。大约需要 2 个 RTCCLK 时钟周期(由于时钟同步)。 
3. 编程闹钟 A 或闹钟 B 寄存器(RTC_ALRMASSR/RTC_ALRMAR 或 RTC_ALRMBSSR/RTC_ALRMBR)。 
4. 将 RTC_CR 寄存器中的 ALRAE 或 ALRBE 位置 1 以再次使能闹钟 A 或闹钟 B。 
注意:约 2 个 RTCCLK 时钟周期(由于时钟同步)后,将执行对 RTC_CR 寄存器的更改。 
void RTC_SetAlarm(uint32_t RTC_Format, uint32_t RTC_Alarm, RTC_AlarmTypeDef*RTC_AlarmStruct)功能:RTC闹钟时间配置。 
void RTC_AlarmStructInit(RTC_AlarmTypeDef*RTC_AlarmStruct)功能初始化RTC_AlarmTypeDef类型的结构体成员到复位值。 
void RTC_GetAlarm(uint32_t RTC_Format, uint32_t RTC_Alarm, RTC_AlarmTypeDef*RTC_AlarmStruct)功能:得到RTC闹钟数值。 
ErrorStatus RTC_AlarmCmd(uint32_t RTC_Alarm,FunctionalState NewState)功能:禁止或使能RTC闹钟。 
void RTC_AlarmSubSecondConfig(uint32_t RTC_Alarm,uint32_t RTC_AlarmSubSecondValue,uint32_t RTC_AlarmSubSecondMask)功能配置RTC AlarmA/B的亚秒 
RTC_GetAlarmSubSecond(uint32_t RTC_Alarm)功能:得到RTC的亚秒时间。

编程唤醒定时器 
要配置或更改唤醒定时器的自动重载值(RTC_WUTR 中的 WUT[15:0]),需要按照以下顺 序操作: 
1.清零 RTC_CR 中的 WUTE 以禁止唤醒定时器。 
2. 轮询 RTC_ISR 中的 WUTWF,直到该位置 1,以确保可以访问唤醒自动重载定时器和 WUCKSEL[2:0] 位。大约需要 2 个 RTCCLK 时钟周期(由于时钟同步)。 
3. 编程唤醒自动重载值 WUT[15:0],并选择唤醒时钟(RTC_CR 中的 WUCKSEL[2:0] 位)。 将 RTC_CR 寄存器中的 WUTE 位置 1 以再次使能定时器。唤醒定时器重新开始递减 计数。

void RTC_WakeUpClockConfig(uint32_t RTC_WakeUpClock)功能:配置RTC唤醒时钟源 
void RTC_SetWakeUpCounter(uint32_t RTC_WakeUpCounter)功能:配置RTC唤醒计数,使用这个函数前要保证RTC唤醒被禁止RTC_WakeUpCmd(DISABLE) 
uint32_t RTC_GetWakeUpCounter(void)功能:得到唤醒定时器的计数值 
ErrorStatus RTC_WakeUpCmd(FunctionalState NewState)功能:使能或禁止唤醒定时器

时间戳功能 
将 RTC_CR 寄存器的 TSE 位置 1 可使能时间戳。 
当在 TIMESTAMP 备用功能映射到的引脚上检测到时间戳事件时,日历会保存到时间戳寄存 器(RTC_TSSSR、RTC_TSTR 和 RTC_TSDR)中。发生时间戳事件时,RTC_ISR 寄存 器中的时间戳标志位 (TSF) 将置 1。 
通过将 RTC_CR 寄存器中的 TSIE 位置 1,可在发生时间戳事件时生成中断。 
如果在时间戳标志 (TSF) 已置 1 的条件下检测到新的时间戳事件,则时间戳上溢标志 (TSOVF) 将置 1,而时间戳寄存器(RTC_TSTR 和 RTC_TSDR)将保持上一事件的结果。 
注意:由于同步过程,TSF 将在时间戳事件后 2 个 ck_apre 周期置 1。 
将 TSOVF 置 1 时不存在延迟。这意味着,如果两个时间戳事件接连发生,则 TSOVF 可能 为“1”而 TSF 仍为“0”。因此,建议只在检测到 TSF 为“1”后再轮询 TSOVF。 
注意: 如果在 TSF 位清零后紧接着发生时间戳事件,则 TSF 和 TSOVF 位都将置 1。为防止在时间戳事件发生的同时屏蔽该事件,除非已将 TSF 位读取为“1”,否则应用程序不得将“0”写入 TSF 位。 
此外,入侵事件可能导致时间戳被记录。有关 TAMPTS 控制位的说明,请参见第 23.6.17 节: RTC 入侵和复用功能配置寄存器 (RTC_TAFCR)。如果时间戳事件与配置为过滤模式的入侵 事件(TAMPFLT 设置为非零值)使用同一引脚,则必须通过将 RTC_TAFCR 寄存器中的 TAMPTS 置“1”来选择入侵检测事件的时间戳模式。 
时间戳复用功能 
时间戳复用功能 (RTC_TS) 可映射到 RTC_AF1 或 RTC_AF2,具体取决于 RTC_TAFCR 寄存器中 TSINSEL 位的值(请参见第 23.6.17 节:RTC 入侵和复用功能配置寄存器 (RTC_TAFCR))。如果 RTC_AF1 用作过滤模式的 TAMPER(TAMPFLT 设置为非零值),则不允许将时间戳事件映射到 RTC_AF2 上。 
void RTC_TimeStampCmd(uint32_t RTC_TimeStampEdge,FunctionalState NewState)功能:使能或禁止RTC的时间戳。 
void RTC_GetTimeStamp(uint32_t RTC_Format,RTC_TimeTypeDef*RTC_StampTimeStruct,RTC_DateTypeDef**RTC_StampDateStruct)功能:永遇得到时间戳的数值。 
unit32_t RTC_GetTimeStampSubSecond(void)功能:用于得到时间戳的亚秒时间。

入侵检测 
有两个入侵检测输入可用。这两个输入既可配置为边沿检测,也可配置为带过滤的电平检测。 
RTC 备份寄存器 
备份寄存器 (RTC_BKPxR) 包括20 个 32 位寄存器,用于存储 80 字节的用户应用数据。这 些寄存器在备份域中实现,可在 VDD 电源关闭时通过 VBAT 保持上电状态。备份寄存器不会 在系统复位或电源复位时复位,也不会在器件从待机模式唤醒时复位。 
发生入侵检测事件时,将复位备份寄存器。 
入侵检测初始化 
两个入侵检测输入分别与 RTC_ISR2 寄存器中的标志TAMP1F/TAMP2F 相关联。可通过将 RTC_TAFCR 寄存器中相应的 TAMP1E/TAMP2E 位置 1 来使能各输入。 
入侵检测事件会复位所有备份寄存器 (RTC_BKPxR)。 
通过将 RTC_TAFCR 寄存器中的 TAMPIE 位置 1,可在发生入侵检测事件时生成中断。 
入侵事件的时间戳 
当 TAMPTS 置“1”时,任何入侵事件都会导致时间戳事件的发生。在这种情况下,如同发 生正常时间戳事件一样,RTC_ISR 中的 TSF 位或 TSOVF 位会置 1。在 TSF 或 TSOVF 置 1 的同时,受影响的入侵标志寄存器(TAMP1F、TAMP2F)也会随之置 1。 
对入侵输入的边沿检测 
如果 TAMPFLT 位为“00”,则在观测到上升沿或下降沿时(根据相应的 TAMPxTRG 位), TAMPER 引脚会生成入侵检测事件 (RTC_TAMP[2:1])。选择边沿检测时,会禁止入侵输入 上的内部上拉电阻。 
注意: 为避免丢失入侵检测事件,用于边沿检测的信号与 TAMPxE 使用逻辑与操作来检测入侵事件, 
以避免丢失在使能 TAMPERx 引脚前发生的入侵事件。 
● 当 TAMPxTRG = 0 时:如果 TAMPERx 复用功能在使能入侵检测之前已变为高电平 
(TAMPxE 位置 1),则使能 TAMPERx 后便会立即检测到入侵事件,即使在 TAMPxE 
置 1 后 TAMPERx 引脚上未出现上升沿。 
● 当 TAMPxTRG = 1 时:如果 TAMPERx 复用功能在使能入侵检测之前已变为低电平, 
则使能 TAMPERx 后便可立即检测到入侵事件(即使在 TAMPxE 置 1 后 TAMPERx 引 
脚上未出现下降沿)。 
检测到入侵事件并清零后,应当在重新编程备份寄存器 (RTC_BKPxR) 之前禁止 TAMPERx 复用功能,然后再重新使能(TAMPxE 置 1)。这可防止应用在 TAMPERx 值仍指示入侵检 测时,对备份寄存器执行写操作。这相当于对 TAMPERx 复用功能的电平检测。 
注意:当 VDD 电源关闭时,入侵检测仍有效。要避免意外复位备份寄存器,应将 TAMPER 复用功 能映射到的引脚从外部连接到正确的电平。 
对入侵输入的带过滤电平检测 
通过将 TAMPFLT 设置为非零值可执行带过滤的电平检测。在 TAMPxTRG 位 (TAMP1TRG/ 
TAMP2TRG) 指定的电平连续出现 2、4 或 8 个(取决于 TAMPFLT 值)采样时生成入侵检 测事件。 
除非通过将 TAMPPUDIS 置 1 禁止入侵输入,否则在入侵输入的状态被采样前,将通过 I/O 内部上拉电阻对这些输入预充电。预充电的持续时间由 TAMPPRCH 位确定,允许增大入侵 输入上的电容。 
可使用 TAMPFREQ 确定用于电平检测的采样频率,以便使入侵检测延迟与上拉电阻功耗之 间达到最佳平衡。 
注意:有关上拉电阻的电气特性,请参见数据手册。 
void RTC_TamperTriggerConfig(uint32_T RTC_Tamper,uint32_t RTC_TamperTrigger)功能:Tamper引脚的触发方式 
void RTC_TamperCmd(uint32_t RTC_Tamper,FunctionalState NewState)功能:使能过或者禁止入侵检测 
void RTC_TamperFilterConfig(uint32_t TamperFilter) 
void RTC_TamperSamplingFreqConfig(uint32_t RTC_TamperSamplingFreq) 
void RTC_TamperPinsPrechargeDuration(uint32_t RTC_TamperPrechargeDuration) 
void RTC_TimeStampOnTamperDetectionCmd(FunctionalState NewState) 
void RTC_TamperPullUpCmd(FunctionalState NewState) 
void RTC_WriteBackupRegister(uint32_t RTC_BKP_DR, uint32_t Data)功能:写数据到RTC备份数据寄存器 
uint32_t RTC_ReadBackupRegister(uint32_t RTC_BKP_DR) 功能:从备份数据寄存器读出数据。 
void RTC_TamperPinSelection(uint32_t RTC_TamperPin)功能:选择RTC Tamper引脚。 
void RTC_TimeStampPinSelection(uint32_t RTC_TimeStampPin)功能:选择RTC TimeStamp引脚

RTC 中断 
所有 RTC 中断均与 EXTI 控制器相连。 
要使能 RTC 闹钟中断,需按照以下顺序操作: 
1.将 EXTI 线 17 配置为中断模式并将其使能,然后选择上升沿有效。 
2. 配置 NVIC 中的 RTC_Alarm IRQ 通道并将其使能。 
3. 配置 RTC 以生成 RTC 闹钟(闹钟 A 或闹钟 B)。 
要使能 RTC 唤醒中断,需按照以下顺序操作: 
1.将 EXTI 线 22 配置为中断模式并将其使能,然后选择上升沿有效。 
2. 配置 NVIC 中的 RTC_WKUP IRQ 通道并将其使能。 
3. 配置 RTC 以生成 RTC 唤醒定时器事件。 
要使能 RTC 入侵中断,需按照以下顺序操作: 
1.将 EXTI 线 21 配置为中断模式并将其使能,然后选择上升沿有效。 
2. 配置 NVIC 中的 TAMP_STAMP IRQ 通道并将其使能。 
3. 配置 RTC 以检测 RTC 入侵事件。 
要使能 RTC 时间戳中断,需按照以下顺序操作: 
1.将 EXTI 线 21 配置为中断模式并将其使能,然后选择上升沿有效。 
2. 配置 NVIC 中的 TAMP_STAMP IRQ 通道并将其使能。 
3. 配置 RTC 以检测 RTC 时间戳事件。 
RTC中断控制位 
void RTC_ITConfig(uint32_t RTC_IT,FunctionalState NewState)功能:使能或禁止RTC中断 
FlagStatus RTC_GetFlagStatus(unit32_t RTC_FLAG)功能:查询RTC标志,主要用于非中断函数 
void RTC_ClearFlag(uint32_t RTC_FLAG)功能:清除RTC标志,主要用于非中断函数 
ITStatus RTC_GetITStatus(uint32_t RTC_IT)功能:查询RTC中断标志,主要用于中断函数 
void RTC_ClearITPendingBit(uin32_t RTC_IT)功能:清除RTC中断标志,主要用于中断函数 
static uint8_t RTC_ByteToBcd2(uint8_t Value)功能:用于bcd和二进制数的互转 
static uint8_t RTC_Bcd2ToByte(uint8_t Value)功能:用于bcd和二进制数的互转

RTC低功耗模式RTC低功耗模式对RTC的影响


关键字:STM32F4  RTC  实时时钟 引用地址:STM32F4学习笔记10——RTC实时时钟

上一篇:STM32F4学习笔记11——CRC循环冗余校验
下一篇:STM32F4学习笔记9——独立看门狗与窗口看门狗

推荐阅读最新更新时间:2024-03-16 15:37

STM32f4---TFTLCD显示实验代码(02)
第七个要介绍的函数是坐标设置函数,该函数代码如下: //设置光标位置 //Xpos:横坐标 //Ypos:纵坐标 void LCD_SetCursor(u16 Xpos, u16 Ypos) { if(lcddev.id==0X9341||lcddev.id==0X5310) { LCD_WR_REG(lcddev.setxcmd); LCD_WR_DATA(Xpos 8); LCD_WR_DATA(Xpos&0XFF); LCD_WR_REG(lcddev.setycmd); LCD_WR_DATA(Ypos 8); LCD_WR_DATA(Ypos&0XFF); }else if(lc
[单片机]
单片机实时时钟电路(LCD1602、DS1302)
一、简介 此电路主要有51单片机、LCD1602模块、DS1302芯片组成,通过LCD1062显示当前时间。 二、运行效果 三、源文件 main.c /*想要更多项目私wo!!!*/ #include reg52.h #include intrins.h #include string.h #define uint unsigned int #define uchar unsigned char sbit IO = P1^0; sbit SCLK = P1^1; sbit RST = P1^2; sbit RS = P2^0; sbit RW = P2^1; sbit EN = P2^2; uchar *
[单片机]
单片机<font color='red'>实时时钟</font>电路(LCD1602、DS1302)
cubemx+stm32f407+双Can通信
最近几天在用CUBEMX实现stm32f407zgt6的双can通讯,中间走了一些弯路,记录下来供需要的人参考借鉴,希望可以帮助大家节省开发周期。 准备工作: 一、硬件 使用启明高配版开发板,因为启明的板子上有两个can可以使用,在调试之前,需要先将can1_H连接can2_H,can1_L连接can2_L,并且需要将P15和P21跳线帽连接好。 二、软件工具 1.我使用的软件版本是CUBEMX4.27,使用的库为fw_f4_v1210。 2.keil版本 程序编写 can在网上有很多介绍,可以在网上搜索一些基础介绍,之前调试can主要是卡在了新的库包里对滤波器以及FIFO和回
[单片机]
cubemx+<font color='red'>stm32f4</font>07+双Can通信
实时时钟芯片DS1302
DS1302是一种三线制的串行时钟芯片,即CE(片选),SCLK(时钟),I/O(双向数据)。从严格意义上来说,它不是SPI总线类型的,因为SPI的数据线的输入输出是分开的,但是我们操作的时候可以用带SPI的硬件接口的MCU,比如PIC16F877的MSSP模块。 命令字节的基本格式 存储器结构 需要注意的地方: 1.在上电时,RST 必须为逻辑0直至Vcc 2.0V。同时SCLK 在RST 驱动至逻辑1 状态时必须为逻辑0。 2.数据输入是在SCLK的上升沿,数据输出是在SCLK的下降沿。 3.传输方式:低位先传输。 4.时钟运行:秒寄存器的最高位(BIT7)是作为时钟控制位,当为逻辑1时
[单片机]
使用DMA可以较好地避免将采集到的数据丢失的方法
ADC采集到的数据都存储在一个固定的寄存器中。当常规采样方式采样多个通道时候,使用DMA可以较好地避免将采集到的数据丢失。当ADC的DMA功能被使能的时候,每个通道转换完毕时都会发出一个DMA请求。DMA方式也不能完全避免数据丢失问题,要实现数据不丢失需要在DMA的同时开启OVERRUN模式,当数据丢失时就停止数据转换。我们只需要检测是否有OVR时间发生,就能解决采样数据丢失造成的问题。比如,通道错位什么的。 在STM32F4的Reference manual中可以查到ADC1 的DMA映射在DMA1、CH0、Stream0上。 【实验1、DMA方式采集单一通道数据】 配置ADC1的DMA初始化设置如下: //DMA初始化
[单片机]
STM32F407ZGT6之时钟系统介绍
时钟系统是CPU的脉搏,就像人的心跳一样。STM32F4 的时钟系统比较复杂,不像简单的51 单片机一个系统时钟就可以解决一切。STM32F4 的框图如下(可以看到相应的时钟): 1. 连至 APB2 的定时器从 TIMxCLK 提供时钟 (最高 168 MHz) ,连至 APB1 的定时器从 TIMxCLK 提供时钟 (取决于 RCC_DCKCFGR 寄存器中 TIMPRE 位的配置,最高 84 MHz 或 168 MHz)。 2. 摄像头接口和网络接口仅适用于 STM32F407xx 设备。 系统时钟图: 在STM32F4中,有5个重要的时钟源,为 HSI、 HSE、 LSI、 LSE、 PLL。 其中 P
[单片机]
<font color='red'>STM32F4</font>07ZGT6之时钟系统介绍
STM32F4使用硬件SPI驱动ADS8322
以前写过STM32F103ZET6驱动ADS8332的代码,不过是使用IO模拟SPI驱动的,在本博客前面可以查询。今天在STE_V2.1验证平台上编写了STM32F429BIT6驱动ADS8332的代码,本次使用了STM32F4的硬件SPI,使用SPI2。代码亲自测试,效果不错。鉴于在网上看到很多人在找STM32硬件SPI驱动ADS8332,在此贴出代码工大家参考。 /** * 函数功能:采集待测芯片电流取样电阻处理后的电压的ADS8332复位 * 输入参数:无 * 输出参数:无 * 全局变量:无 * 作者:LuJ * 修改日期:2015/09/02 * 备注:无 */ void DUT_Power_ADS833
[单片机]
实时时钟芯片HT1380读写c程序
/*此程序的原型是从网上下载的,经过了我的实验和修改,并成功应用*/ #include w78e58b.h #include "ht1380.h" #include "intrins.h" #define uchar unsigned char /******************************************************************** * * 名称: v_RTInputByte * 说明: * 功能: 往HT1381写入1Byte数据 * 调用: * 输入: ucDa 写入的数据 * 返回值: 无 *****************************************
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved