学习笔记:RTC时钟_rtc 为什么要重置备份域

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

电源复位时,他们也不会被复位。
此外,BKP控制寄存器用来管理侵入检测和RTC校准功能。
复位后,对备份寄存器和RTC的访问被禁止,并且备份域被保护以防止可能存在的意外的写操
作。执行以下操作可以使能对备份寄存器和RTC的访问。
● 通过设置寄存器RCC_APB1ENR的PWREN和BKPEN位来打开电源和后备接口的时钟
● 电源控制寄存器(PWR_CR)的DBP位来使能对后备寄存器和RTC的访问。

7.配置RTC寄存器

1.查询RTOFF位,直到变1
2.置CNF为1,开始配置
3.开始操作
4.退出配置模式(清除标志位)
5.等待写操作完成

8.实例:用RTC配置一个闹钟

一):分析
1.RTC初始化
  (1).初始化BKP时钟:
  BKP时钟,pwr时钟


   RCC\_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);
   PWR\_BackupAccessCmd(ENABLE);

(2).初始化RTC时钟
根据开发板选择相应时钟,一般的可选择lse时钟或者lsi时钟,在选择LSE时钟时,要先启动LSE时钟在RTC选择LSE时钟
example 引用LSI时钟(大约40khz)

BKP\_DeInit();
		 RCC\_LSICmd(ENABLE);//使能LSI
		 delay\_ms(100);
		 RCC\_RTCCLKConfig(RCC_RTCCLKSource_LSI);//RTC时钟选择LSI
		 RCC\_RTCCLKCmd(ENABLE);

(3)开启相应中断
a.开起中断要操作相应的RTC寄存器,所以要先等待上一次写完成
RTC_WaitForLastTask();
RTC_WaitForSynchro();

FOR EXAMPLE:开启秒中断和闹钟中断

       RTC\_WaitForLastTask();
		 RTC\_WaitForSynchro();
		 RTC\_ITConfig(RTC_IT_SEC,ENABLE);//秒中断
		 RTC\_WaitForLastTask();
		 
		 RTC\_WaitForLastTask();
		 RTC\_WaitForSynchro();
		 RTC\_ITConfig(RTC_IT_ALR,ENABLE);//闹钟中断
		 RTC\_WaitForLastTask();

(4)配置分频值

RTC\_SetPrescaler(40000);//1hz


(5)配置计数器的初始值
本例封装了一个函数来配置初始值

      RTC\_WaitForLastTask();
		 RTC\_SETTIME(value);//³õʼ»¯¼ÆÊýÆ÷Öµ
		 RTC\_ExitConfigMode();

\*\*\*\*\*\*/
	void RTC\_SETTIME(u32 CounterValue)
{
     RCC\_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);
     PWR\_BackupAccessCmd(ENABLE);
	 RTC\_SetCounter(CounterValue);
     RTC\_WaitForLastTask();
  }	 

(6)init函数结束,但是还要配置中断函数
a. 中断分组

static void RTC\_NVIC\_Config(void)
{	
  NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;		//RTCÈ«¾ÖÖжÏ
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;	//ÏÈÕ¼ÓÅÏȼ¶1λ,´ÓÓÅÏȼ¶3λ
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;	//ÏÈÕ¼ÓÅÏȼ¶0λ,´ÓÓÅÏȼ¶4λ
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;		//ʹÄܸÃͨµÀÖжÏ
	NVIC\_Init(&NVIC_InitStructure);		//¸ù¾ÝNVIC\_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèNVIC¼Ä´æÆ÷
}

b.中断服务函数
(注意:中断服务函数是定义好的不可更改名称)

 void RTC\_IRQHandler(void)
{
  if(RTC\_GetITStatus(RTC_IT_SEC)!=RESET)//秒中断
	{
     RTC\_GETTIME();
  }
	if(RTC\_GetITStatus(RTC_IT_ALR)==SET)//闹钟中断
	{
		 RTC\_ClearITPendingBit(RTC_IT_ALR);
     ALARM();
  }
   RTC\_ClearITPendingBit(RTC_IT_SEC);
	RTC\_WaitForLastTask();
 
}

c.闹钟函数:ALARM();
自己定义的函数,放在了beep.c中,作用就是让闹钟到时间后蜂鸣器嚎叫

void ALARM(void)
{
  beep\_con(1);
	delay\_ms(1000);
	beep\_con(0);


}

(7)闹钟配置
因为要写一个闹钟,所以要先配置相应寄存器

void RTC\_SERALRM(u32 CounterValue)//ÄÖÖÓ
{
     RCC\_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);
    PWR\_BackupAccessCmd(ENABLE);
	   RTC\_SetAlarm(CounterValue);
    RTC\_WaitForLastTask();


}

闹钟配置和时间初始化差不多,都要开启PWR和BKP时钟,然后设置值(u32型)然后等待写结束
(8)获取时间函数
我们要将时间显示在lcd屏幕上,做一个数据可视化处理,所以要将计数器中的值读出,并显示,因此定义了一个结构体

typedef struct
{
vu8 hour;
vu8 min;
vu8 sec;

}_calendar_obj;
extern _calendar_obj calendar;


然后通过获取计数器值经过计算赋予结构体值显示在LCD屏幕上

void RTC\_GETTIME(void)
{
	 u32 time=0;
   RCC\_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);
   PWR\_BackupAccessCmd(ENABLE);
   time=RTC\_GetCounter();//获取计数器值
   calendar.hour=time/3600;
	 calendar.min=(time%3600)/60;
	 calendar.sec=(time%3600)%60;
	 
	
}

(9)主函数

#include "stm32f10x.h"
#include "lcd.h"
#include "key.h"
#include "stdio.h"
#include "beep.h"
#include "delay.h"
#include "rtc.h"
u32 TimingDelay = 0;

void Delay\_Ms(u32 nTime);
void xianshisec(u8 val)
{
  uint8\_t temp[20];
	sprintf(temp,"sec=%d",val);
   LCD\_DisplayStringLine(Line0,temp);
}
void xianshimin(u8 val)
{
  uint8\_t temp[20];
	sprintf(temp,"min=%d",val);
   LCD\_DisplayStringLine(Line1,temp);
}
void xianshihour(u8 val)
{
  uint8\_t temp[20];
	sprintf(temp,"hour=%d",val);
   LCD\_DisplayStringLine(Line2,temp);
}
//Main Body
int main(void)
{

	float num=0;
	int keya=0;
  u8 t=0;
	
	NVIC\_PriorityGroupConfig(NVIC_PriorityGroup_2);
	beep\_init();
	delay\_init();
	RTC\_INIT(0x00000000);
	STM3210B\_LCD\_Init();


![img](https://img-blog.csdnimg.cn/img_convert/31e1f73878b4c3e3c3817c7a5c7e10df.png)
![img](https://img-blog.csdnimg.cn/img_convert/fd2527430dee2e88ab3b8fb2cade90d5.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**

**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

片转存中...(img-tbePqOJU-1715802564382)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**

**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

  • 20
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值