stm32 RTC时钟

//注意,因为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,要打开LSERCC_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:使能唤醒定时器

 

你可能感兴趣的:(stm32 RTC时钟)