//注意,因为RCT的中断并没有直接连接到 NVIC ,它的中断应该了外中断,所以在配置 初始化时,应该要配置外中断
应用外部低速时间 32.768KHz 异步分频128 同步分频 256 32768 / (128*256 ) = 1Hz
RTC模块和时钟配置是在后备区域,即在系统复位或者待机模式唤醒后RTC的设置和时间维持不变,只要后备区域供电正常,RTC将一直工作下去。但是在系统复位之后会自动禁止访问后备区域和RTC,以防止意外操作,所以在设置时间之前,要先取消后备区域写保护。
1.0 初始化
2.0 设置时钟
3.0 设置闹钟功能
4.0 设置 RTC 周期性唤醒中断
日历时间(RTC_TR)和日期(RTC_DR)寄存器 (BCD
STM32F4 的 RTC 日历时间(RTC_TR)和日期(RTC_DR)寄存器,用于存储时间和日期(也可以用于设置时间和日期) , 可以通过与 PCLK1 (APB1 时钟) 同步的影子寄存器来访问,这些时间和日期寄存器也可以直接访问,这样可避免等待同步的持续时间。
每隔 2 个 RTCCLK 周期,当前日历值便会复制到影子寄存器,并置位 RTC_ISR 寄存器的RSF 位。我们可以读取 RTC_TR 和 RTC_DR 来得到当前时间和日期信息,不过需要注意的是:时间和日期都是以 BCD 码的格式存储的,读出来要转换一下,才可以得到十进制的数据。
uint16_t RTC_BinToBcd4(uint16_t Value)
{
return ((Value / 1000) << 12) + ((Value / 100 % 10) << 8) +
((Value % 100 / 10) << 4) + (Value % 10);
}
预装载寄存器 影子寄存器
影子寄存器在这里实际上才是在比较的时候起作用的,也就是为预装载寄存器做缓冲,目的是为了当预装载寄存器ARR中的值更新后,影子寄存器仍然保持原来的值(这是在ARPE=1的情况下),参与比较操作的是影子寄存器,所以这样不会影响到计数器的工作误差。它在更新事件发生之后影子寄存器的值才从ARR寄存器那里获得更新,它也有同步的作用,使所有的相关寄存器数值都同时更新。 当ARPE为0时,影子寄存器是立即更新的,不等待更新事件 的发生。
● 复用功能输出 (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_TR)
RTC 日期寄存器 (RTC_DR)
RTC 控制寄存器 (RTC_CR)
RTC 初始化和状态寄存器 (RTC_ISR)
RTC 预分频器寄存器 (RTC_PRER)
RTC 唤醒定时器寄存器 (RTC_WUTR)
RTC 校准寄存器 (RTC_CALIBR)
RTC 闹钟 A 寄存器 (RTC_ALRMAR)
RTC 闹钟 B 寄存器 (RTC_ALRMBR)
RTC 写保护寄存器 (RTC_WPR)
RTC 亚秒寄存器 (RTC_SSR)
中断与事件
中断是软件处理
事件是硬件处理
①使能PWR时钟:RCC_APB1PeriphClockCmd();
② 使能后备寄存器访问: PWR_BackupAccessCmd();
③ 配置RTC时钟源,使能RTC时钟:
RCC_RTCCLKConfig();
RCC_RTCCLKCmd();
如果使用LSE,要打开LSE:RCC_LSEConfig(RCC_LSE_ON);
④ 初始化RTC(同步/异步分频系数和时钟格式):RTC_Init ();
⑤ 设置时间:RTC_SetTime ();
⑥设置日期:RTC_SetDate();
1)使能电源时钟,并使能 RTC 及 RTC 后备寄存器写访问。
要访问 RTC 和 RTC 备份区域就必须先使能电源时钟, 然后使能 RTC即后备区域访问。电源时钟使能,通过 RCC_APB1ENR 寄存器来设置;RTC 及 RTC 备份寄存器的写访问,通过 PWR_CR 寄存器的 DBP 位设置。库函数设置方法为:
//使能 PWR 时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
//使能后备寄存器访问
PWR_BackupAccessCmd(ENABLE);
2 )开启外部低速振荡器择 ,选择 RTC 时钟,并使能。
这个步骤,只需要在 RTC 初始化的时候执行一次即可,不需要每次上电都执行,这些操作都是通过 RCC_BDCR 寄存器来实现的。
开启 LSE 的库函数为:
RCC_LSEConfig(RCC_LSE_ON);//LSE 开启
同时,选择 RTC 时钟源以及使能时钟函数为:
//设选择 LSE 作为 RTC 时钟
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
//使能 RTC 时钟
RCC_RTCCLKCmd(ENABLE);
3)初始化 RTC,设置 RTC 的分频,以及配置 RTC 参数。
初始化参数结构体 RTC_InitTypeDef
typedef struct
{
uint32_t RTC_HourFormat;
uint32_t RTC_AsynchPrediv;
uint32_t RTC_SynchPrediv;
}RTC_InitTypeDef;
RTC_HourFormat设置RTC时间格式: 24小时制:RTC_HourFormat_24
12小时制: RTC_HourFormat_12
RTC_AsynchPrediv 设置RTC的异步预分频系数:(PREDV_A),因为异步预分频系数是 7 位,所以最大值为 0x7F,所以不能超过这个值。
RTC_SynchPrediv设置RTC的同步预分频系数:(PREDIV_S),因为同步预分频系数也是 15 位,所以最大值为 0x7FFF,不能超过这个值。
在设置 RTC 相关参数之前, 会先取消 RTC 写保护,这个操作通过向寄存器RTC_WPR 写入 0XCA 和 0X53 两个数据实现。所以 RTC_Init 函数体开头会有下面两行代码用来取消 RTC 写保护:
RTC->WPR = 0xCA;
RTC->WPR = 0x53;
在取消写保护之后,我们要对 RTC_PRER、RTC_TR 和 RTC_DR 等寄存器的写操作,必须进入 RTC 初始化模式,才可以进行,库函数中进入初始化模式的函数为:
ErrorStatus RTC_EnterInitMode(void);
进入初始化模式之后,RTC_init 函数才去设置 RTC->CR 以及 RTC->PRER 寄存器的值。在设置完值之后,我们还要退出初始化模式,函数为:
void RTC_ExitInitMode(void)
最后再开启 RTC 写保护,往 RTC_WPR 寄存器写入值 0xFF 即可。
库函数中:可以直接调用:
RTC_DeInit();
4)设置 RTC 的时间。
库函数中,设置 RTC 时间的函数为:
ErrorStatus RTC_SetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct);
第一个参数 RTC_Format,用来设置输入的时间格式为 BIN 格式还是BCD 格式, 可选值为 RTC_Format_BIN 和 RTC_Format_BCD。
初始化参数结构体 RTC_TimeTypeDef 的定义:
typedef struct
{
uint8_t RTC_Hours; //小时
uint8_t RTC_Minutes; //分钟
uint8_t RTC_Seconds; //秒钟
uint8_t RTC_H12; //上午或下午RTC_H12_AM RTC_H12_PM
}RTC_TimeTypeDef;
位 31:24 保留,必须保持复位值。
位 23 COE:校准输出使能 (Calibration output enable)
该位使能 RTC_CALIB 输出
0:禁止校准输出
1:使能校准输出
位 22:21 OSEL[1:0]:输出选择 (Output selection)
这些位用于选择要连接到 RTC_ALARM 输出的标志
00:禁止输出
01:使能闹钟 A 输出
10:使能闹钟 B 输出
11:使能唤醒输出
位 20 POL:输出极性 (Output polarity)
该位用于配置 RTC_ALARM 输出的极性
0:当 ALRAF/ALRBF/WUTF 置 1 时(取决于 OSEL[1:0]),该引脚为高电平
1:当 ALRAF/ALRBF/WUTF 置 1 时(取决于 OSEL[1:0]),该引脚为低电平
位 19 COSEL:校准输出选择 (Calibration output selection)
当 COE=1 时,该位可选择 RTC_CALIB 上输出的信号。
0:校准输出为 512 Hz
1:校准输出为 1 Hz
在 RTCCLK 为 32.768 kHz 且预分频器为其默认值(PREDIV_A=127 且 PREDIV_S=255)
的条件下,这些频率有效。请参见第 23.3.14 节:校准时钟输出。
位 18 BKP:备份 (Backup)
用户可对此位执行写操作以记录是否已对夏令时进行更改。
位 17 SUB1H:减少 1 小时(冬季时间更改)(Subtract 1 hour (winter time change))
当该位在初始化模式以外的模式下置 1 时,如果当前小时不是 0,则日历时间将减少 1 小
时。此位始终读为 0。
当前小时为 0 时,将此位置 1 没有任何作用。
0:无作用。
1:将当前时间减少 1 小时。这可用于冬季时间更改。
位 16 ADD1H:增加 1 小时(夏季时间更改)(Add 1 hour (summer time change))
当该位在初始化模式以外的模式下置 1 时,日历时间将增加 1 小时。此位始终读为 0。
0:无作用。
1:将当前时间增加 1 小时。这可用于夏季时间更改
位 15 TSIE:时间戳中断使能 (Timestamp interrupt enable)
0:禁止时间戳中断
1:使能时间戳中断
位 14 WUTIE:使能唤醒定时器使能 (Wakeup timer interrupt enable)
0:禁止唤醒定时器中断
1:使能唤醒定时器中断
位 13 ALRBIE:闹钟 B 中断使能 (Alarm B interrupt enable)
0:闹钟 B 中断禁止
1:闹钟 B 中断使能
位 12 ALRAIE:闹钟 A 中断使能 (Alarm A interrupt enable)
0:禁止闹钟 A 中断
1:使能闹钟 A 中断
位 11 TSE:时间戳使能 (Time stamp enable)
0:禁止时间戳
1:使能时间戳
位 10 WUTE:唤醒定时器使能 (Wakeup timer enable)
0:禁止唤醒定时器
1:使能唤醒定时器