[STM32F3] 内部RTC实现定时中断及断电工况下的定时脉冲输出

[复制链接]
707|4
 楼主| 慢醇 发表于 2022-10-18 23:34 | 显示全部楼层 |阅读模式
利用STM32内部RTC实现定时中断及断电工况下的定时脉冲输出
背景
功能描述
实现过程
背景
利用内部RTC替换外部RTC,RTC采用单独的电源供电,实现在单片机主电源VDD断电情况下,单片机的一个特殊引脚能够输出固定频率的脉冲信号。这样做保证了低功耗情况下,单片机依旧能够定时完成一些特定任务。

功能描述
用内部RTC实现秒级精度任务执行。 例如: 每1S进行一次LED灯的闪烁。每10S完成一次串口输出等。下图为使用内部RTC产生秒中断,串口打印一次数据。

用内部RTC实现定时任务执行。 例如:每隔30分钟进行一次传感器数据采集。
在前面所述两点的情况下,实现在STM32 VDD电源关闭情况下(即仅保留RTC电源),实现固定引脚的定时脉冲输出。下图为切断STM32电源后,用示波器观察引脚1S脉冲输出。

22717634ec78a2fa64.png


评论

版权声明:本文为CSDN博主「何时杖而看南雪」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_41861711/article/details/119008717  发表于 2022-10-18 23:35
 楼主| 慢醇 发表于 2022-10-18 23:37 | 显示全部楼层
要点:

如果需要产生秒中断或者定时中断,在RTC初始化函数中进行秒中断或定时中断的配置,注意中断初始化开启RTC闹钟中断。
如果需要在开机或断电状态下利用RTC完成I/O的定时脉冲输出。需要断开入侵检测引脚,设置该引脚为RTC闹钟输出或秒输出 该引脚为入侵检测引脚,STM32F103为PC13脚。
备注 : 没有出现的函数不重要,重要的函数已经进行备注。源工程代码已上传至资源工程代码,
有任何问题欢迎私信讨论。
 楼主| 慢醇 发表于 2022-10-18 23:42 | 显示全部楼层
  1. void RTC_Init(void)
  2. {
  3.         if(BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)  //从指定的后备寄存器中读出数据:读出了与写入的指定数据不相等
  4.         {
  5.                 RTC_Config();
  6.                 //将系统初始化的时间写入RTC
  7.                 DateGetRTC_Sec(System_Date);  
  8.                 Adjust_RTCCounter();
  9.                 TimeGetRTC_Sec(System_Time);
  10.                 Adjust_RTCCounter();
  11.         //        RTC_ExitConfigMode(); //退出配置模式
  12.                 BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);  //向指定的后备寄存器中写入用户程序数据
  13.         }
  14.   else
  15.         {
  16.                 RTC_WaitForSynchro();                                                                //单步调试时  程序有时会陷入这个死循环!!!!!
  17. //                RTC_ITConfig(RTC_IT_SEC, ENABLE);
  18.                 RTC_WaitForLastTask();
  19.                 /* Enable PWR and BKP clocks */
  20.                 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
  21.                 RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);
  22.                 /* Allow access to BKP Domain */
  23.                 PWR_BackupAccessCmd(ENABLE);
  24.                 /* 禁止 Tamper 引脚 */
  25.           /* 要输出 RTCCLK/64 到 Tamper 引脚,  tamper 功能必须禁止 */       
  26.           BKP_TamperPinCmd(DISABLE);
  27.           /* 使能 RTC 时钟输出到 Tamper 引脚 */
  28.           BKP_RTCOutputConfig(BKP_RTCOutputSource_Second);
  29.                 /*等待寄存器同步*/
  30.                 RTC_WaitForSynchro();               
  31.                 /*允许RTC秒中断*/
  32.                 RTC_ITConfig(RTC_IT_SEC, ENABLE);               
  33.                 /*等待上次RTC寄存器写操作完成*/
  34.                 RTC_WaitForLastTask();
  35.         }
  36.        
  37.         GetRTC_Date();
  38.   GetRTC_Time();
  39.        
  40. }



 楼主| 慢醇 发表于 2022-10-18 23:48 | 显示全部楼层
  1. //RTC配置
  2. void RTC_Config(void)
  3. {
  4.         /* Enable PWR and BKP clocks */
  5.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);  //使能PWR和BKP外设时钟  
  6.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);
  7.         /* Allow access to BKP Domain */
  8.         PWR_BackupAccessCmd(ENABLE);         //使能后备寄存器访问
  9.         /* Reset Backup Domain */
  10.         // 禁用入侵检测引脚
  11.         BKP_TamperPinCmd(DISABLE);
  12.         BKP_RTCOutputConfig(BKP_RTCOutputSource_Second); //使能入侵检测管脚输出RTC秒脉冲
  13.        
  14.         BKP_DeInit();     //复位备份区域
  15.         //使用外部高速晶振 128分频
  16.         //RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128);
  17.         //使用外部32768晶振
  18.         RCC_LSEConfig(RCC_LSE_ON);      //设置外部低速晶振(LSE),使用外设低速晶振
  19.         while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);           //检查指定的RCC标志位设置与否,等待低速晶振就绪
  20.   RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);   //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟
  21.         /* Enable RTC Clock */
  22.         RCC_RTCCLKCmd(ENABLE);                    //使能RTC时钟
  23.         /* Wait for RTC registers synchronization */
  24.         RTC_WaitForSynchro();       //等待RTC寄存器同步  
  25.         /* Wait until last write operation on RTC registers has finished */
  26.         RTC_WaitForLastTask();  //等待最近一次对RTC寄存器的写操作完成
  27.         /* Enable the RTC Second */
  28.         RTC_ITConfig(RTC_IT_SEC, ENABLE);          //使能RTC秒中断
  29.         /* Wait until last write operation on RTC registers has finished */
  30.         RTC_WaitForLastTask();  //等待最近一次对RTC寄存器的写操作完成
  31.         /* Set RTC prescaler: set RTC period to 1sec */
  32.         /* RTC period = RTCCLK/RTC_PR = (8000000Hz)/128/(62499+1) */
  33.         //RTC_SetPrescaler(62499);
  34. //        RTC_EnterConfigMode();///允许配置
  35.         RTC_SetPrescaler(32767);       //设置RTC预分频的值
  36.         /* Wait until last write operation on RTC registers has finished */
  37.         RTC_WaitForLastTask();  //等待最近一次对RTC寄存器的写操作完成
  38. }

您需要登录后才可以回帖 登录 | 注册

本版积分规则

134

主题

1382

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部