STM32使用RTC+BKP+PWR+EXTI

待机模式:唤醒后复位,从头开始执行主函数,所有时钟关闭,仅有RTC时钟开启
停止模式:除RTC时钟外,所有外设时钟关闭,但保存数据和运行到的位置(PC值),唤醒后需要等时钟同步
睡眠模式:外设时钟开启,CPU时钟关闭,保存数据和运行到的位置(PC值)

 

void RTC_Init(uint32_t count)
{
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能BPK PWR时钟
  
	NVIC_InitTypeDef NVIC_InitStruct;
  NVIC_InitStruct.NVIC_IRQChannel =RTC_IRQn;
  NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStruct);
	
	PWR_BackupAccessCmd(ENABLE); //系统复位后,会自动禁止访问后备寄存器和 RTC,以防止对后备区域(BKP)的意外写操作,使能 RTC 和后备寄存器以进行写入访问
	BKP_DeInit();//复位备份区域,(可选)
	//BKP_TamperPinCmd(DISABLE);
  RCC_LSICmd(ENABLE);
  while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);//检查指定的 RCC 标志位设置与否,等待低速晶振就绪

  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); //选择 LSE 作为 RTC 时钟  
  RCC_RTCCLKCmd(ENABLE); //使能 RTC 时钟
	RTC_WaitForLastTask(); //等待最近一次对 RTC 寄存器的写操作完成
  RTC_WaitForSynchro(); //等待 RTC 寄存器同步
 
  RTC_SetPrescaler(39999);//设置 RTC 时钟分频数 晶振32.768KHz 
	RTC_WaitForLastTask(); //等待最近一次对 RTC 寄存器的写操作完成
  
  RTC_SetCounter(count);//最后在配置完成之后
	RTC_WaitForLastTask(); //等待最近一次对 RTC 寄存器的写操作完成
	
	RTC_ITConfig(RTC_IT_SEC,ENABLE); //使能 RTC 秒中断
	RTC_WaitForLastTask(); //等待最近一次对 RTC 寄存器的写操作完成
	
### STM32 RTC 实时时钟模块标准库示例代码 对于STM32单片机而言,实现RTC(实时时钟)功能不仅依赖于硬件本身的支持,还需要通过软件编程来完成具体的配置与操作。为了帮助开发者更好地理解和使用RTC模块,在官方提供的标准库中有详细的函数定义和支持实例。 #### 初始化RTC并设置时间日期 下面是一个简单的例子,展示了如何利用STM32标准库初始化RTC,并设定初始的时间和日期: ```c #include "stm32f4xx.h" void RTC_Init(void){ /* 使能电源接口与时钟 */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /* 进入备份区域访问模式 */ PWR_BackupAccessCmd(ENABLE); /* 复位BKP寄存器 */ BKP_DeInit(); /* 开启LSE振荡器 */ RCC_LSEConfig(RCC_LSE_ON); while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET); //等待LSE稳定 /* 配置RTC预分频系数为32768-1 */ RTC_SetPrescaler(32767); /* 启动RTC计数 */ RTC_StartCounter(); } void Set_RTC_TimeDate(void){ RTC_TimeTypeDef RTC_TimeStructure; RTC_DateTypeDef RTC_DateStructure; /* 设置时间为:当前秒、分钟、小时 */ RTC_TimeStructure.RTC_H12 = RTC_H12_24; RTC_TimeStructure.RTC_Hours = 15; //假设现在是下午三点整 RTC_TimeStructure.RTC_Minutes = 30; RTC_TimeStructure.RTC_Seconds = 0; /* 将上述参数写入RTC */ RTC_SetTime(RTC_Format_BIN,&RTC_TimeStructure); /* 设置日期为:年份、月份、日、星期几 */ RTC_DateStructure.RTC_Year = 23; //假设今年是2023年的第23年 RTC_DateStructure.RTC_Month = 5; //五月 RTC_DateStructure.RTC_Date = 20; //二十号 RTC_DateStructure.RTC_WeekDay = RTC_Weekday_Friday;//周五 /* 将上述参数写入RTC */ RTC_SetDate(RTC_Format_BIN,&RTC_DateStructure); } ``` 此段代码实现了基本的RTC初始化过程以及时间和日期的初次设定[^3]。 #### 定义闹钟中断服务程序 当需要在特定时刻触发某些事件时,可以配置RTC产生相应的报警信号。这里给出一段用于处理闹钟中断的服务程序模板: ```c void EXTI0_IRQHandler(void){ if (EXTI_GetITStatus(EXTI_Line0)!=RESET){ /* 清除外部中断标志位 */ EXTI_ClearITPendingBit(EXTI_Line0); /* 执行用户自定义的任务逻辑 */ /* 取消挂起状态下的闹钟A中断请求 */ RTC_ClearITPendingBit(RTC_IT_ALRA); } } ``` 这段代码片段描述了一个典型的闹钟中断处理器框架,其中包含了清除相关中断源的操作[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值