RTC实时时钟

BKP(备份寄存器)

1. 什么是BKP?

备份寄存器是42个16位的寄存器,可用来存储84个字节的用户应用程序数据。他们处在备份域里,当VDD电 源被切断,他们仍然由VBAT维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会 被复位。

此外, BKP控制寄存器用来管理侵入检测和RTC校准功能。

复位后,对备份寄存器和RTC的访问被禁止,并且备份域被保护以防止可能存在的意外的写操作。执行以下 操作可以使能对备份寄存器和RTC的访问:

通过设置寄存器RCC_APB1ENR的PWREN和BKPEN位来打开电源和后备接口的时钟

电源控制寄存器(PWR_CR)的DBP位来使能对后备寄存器和RTC的访问。

用户数据存储容量:

20字节(中容量和小容量)/ 84字节(大容量和互联型)

2. BKP框图

小实验:读写BKP

实验目的 读写BKP

/------------------------RTC.h------------------------/

#include "sys.h"

void rtc_init(void);
uint16_t rtc_read_bkr(uint8_t bkrx);
void rtc_write_bkp(uint8_t bkrx,uint16_t data);

/------------------------RTC.c------------------------/

rtc初始化
RTC_HandleTypeDef rtc_handle = {0};

void rtc_init(void)
{
    //备份寄存器和RTC的访问    1PWREN,BKPEN
    __HAL_RCC_PWR_CLK_ENABLE();
    __HAL_RCC_BKP_CLK_ENABLE();
    //对DBPDBP位来使能  pwr
    HAL_PWR_EnableBkUpAccess();

    //RTC部分
    rtc_handle.Instance = RTC;            //寄存器选择
    rtc_handle.Init.AsynchPrediv = 32767;
    rtc_handle.Init.OutPut      = RTC_OUTPUTSOURCE_NONE;
    HAL_RTC_Init(&rtc_handle);
}
指定读取的寄存器
uint16_t rtc_read_bkr(uint8_t bkrx)
{
    uint32_t data = 0;                          //接收返回值
    data = HAL_RTCEx_BKUPRead(&rtc_handle,bkrx);//句柄,指定读哪个寄存器
    return (uint16_t)data;                      //返回寄存器读出值
}

写的是哪个寄存器  写的数据是16位的数据

void rtc_write_bkp(uint8_t bkrx,uint16_t data)
{
    //句柄 哪个寄存器 写数据
    HAL_RTCEx_BKUPWrite(&rtc_handle,bkrx,data);

}

/---------------------------------main.c---------------------------------/

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "rtc.h"
int main(void)
{
    HAL_Init();                         /* 初始化HAL库 */
    stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
    led_init();	/* LED初始化 */
		uart1_init(115200);
		rtc_init();
//			led1_on();
//			led1_off();
	printf("helloworld!\r\n");
	rtc_write_bkp(1,0xA5A5);
	printf("读出来的值为:%X\r\n",rtc_read_bkr(1));
		
    while(1)
    { 
      		
    }
}

十四、RTC

1. 什么是RTC?

实时时钟是一个独立的定时器。 RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历 的功能。修改计数器的值可以重新设置系统当前的时间和日期。

RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待机模式唤醒后, RTC的设置 和时间维持不变。

复位后,对备份寄存器和RTC的访问被禁止,并且备份域被保护以防止可能存在的意外的写操作。执行以下 操作可以使能对备份寄存器和RTC的访问:

  •         通过设置寄存器RCC_APB1ENR的PWREN和BKPEN位来打开电源和后备接口的时钟
  •          电源控制寄存器(PWR_CR)的DBP位来使能对后备寄存器和RTC的访问。

32位的可编程计数器,可对应Unix时间戳的秒计数器。

Unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。

20位的可编程预分频器,可适配不同频率的输入时钟。

可选择三种RTC时钟源:

  1. HSE时钟除以128(通常为8MHz/128)
  2. LSE振荡器时钟(通常为32.768KHz)
  3. LSI振荡器时钟(40KHz) 

2. RTC框图 

 3. 寄存器及库函数

1.主要功能函数
设置日历参数
HAL_RTC_GetDate(&hrtc,&RTC_DateStruct,RTC_FORMAT_BIN);
HAL_RTC_GetTime(&hrtc,&RTC_TimeStruct,RTC_FORMAT_BIN);
获取日历参数
HAL_RTC_SetTime(&hrtc, &RTC_Time, RTC_FORMAT_BIN);
HAL_RTC_SetDate(&hrtc, &RTC_Date, RTC_FORMAT_BIN);

其中,第一个参数为RTC结构体,第二个参数为Time和Date结构体,第三个参数可设置为:RTC_FORMAT_BIN或RTC_FORMAT_BCD

周期性唤醒中断
void RTC_WKUP_IRQHandler(void)
                        
原文链接:https://blog.csdn.net/weixin_44064233/article/details/108326975

只有在电源控制寄存器(PWR_CR)中的DBP位置’1’

位15 RTCEN:RTC时钟使能 (RTC clock enable)

RTCSEL[1:0]:RTC时钟源选择 (RTC clock source selection)

位9:800:无时钟; 01:LSE振荡器作为RTC时钟; 10:LSI振荡器作为RTC时钟; 11:HSE振荡器在128分频后作为RTC时钟。

不打开没有意义

LSEON:外部低速振荡器使能由软件置’1’或清’0’

0:外部32kHz振荡器关闭; 1:外部32kHz振荡器开启。

16.4.1 RTC控制寄存器高位(RTC_CRH)

RTC_CNT、RTC_ALR或RTC_PRL

等到为1是才能操作

16.4.3 RTC预分频装载寄存器(RTC_PRLH/RTC_PRLL)—20位的寄存器0~3低 0~15 

仅当RTOFF值为’1’时允许进行写操作

16.4.4 RTC预分频器余数寄存器(RTC_DIVH / RTC_DIVL)

与预分配装载寄存器差不多

HAL_RTC_Init

HAL_RTC_GetTime

HAL_RTC_GetDate

HAL_RTC_SetDate

HAL_RTC_SetTime

HAL_RTC_SetAlarm_IT

__HAL_RTC_ALARM_GET_FLAG  .h里面

获取时间是将cnt读出来

4. RTC驱动步骤

注意事项:

必须设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式后,才能写入RTC_PRL、RTC_CNT、 RTC_ALR寄存器

对RTC任何寄存器的写操作,都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的 RTOFF状态位,判断RTC寄存器是否处于更新中。仅当RTOFF状态位是1时,才可以写入RTC寄存器

小实验1:读写RTC时间实验

/-----------------rtc.h------------------------------/

#include "sys.h"
#include "time.h"
#include "uart1.h"
void rtc_init(void);
uint16_t rtc_read_bkr(uint8_t bkrx);
void rtc_write_bkp(uint8_t bkrx,uint16_t data);
void rtc_set_time(struct tm time_data);
void rtc_get_time(void);

/-----------------rtc.c------------------------------/

rtc初始化
RTC_HandleTypeDef rtc_handle = {0};

//rtc初始化
void rtc_init(void)
{
	//备份寄存器和RTC的访问   1PWREN,BKPEN
	__HAL_RCC_PWR_CLK_ENABLE();
	__HAL_RCC_BKP_CLK_ENABLE();
	//对DBPDBP位来使能   pwr
	HAL_PWR_EnableBkUpAccess();
	
	//RTC部分
	rtc_handle.Instance   = RTC;      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值