合泰杯(HT32F52352)RTC的应用(计时)--->掉电不丢失VBAT(代码已经实现附带源码)

news2024/11/24 21:03:39

     摘要

         在HT32F52352合泰单片机开发中,rtc在网上还是挺少人应用的,找了很久没什么资料,现在我根据手册和官方的代码进行配置理解。 RTC在嵌入式单片机中是一个很重要的应用资源。

  1. 记录事件时间戳:RTC可以记录事件发生的精确时间,方便后续分析和追溯。

  2. 定时操作:通过RTC可以实现定时操作,例如定时采集数据、定时发送信息等。

  3. 时间相关功能:RTC可以提供当前的日期和时间信息,方便系统中进行时间相关的业务逻辑。

  4. 实时显示:RTC可以在设备上实时显示当前的时间,方便用户查看。

  5. 节能功能:通过RTC可以实现设备定时开关机等节能功能,提高设备的能效。


介绍        

        我们在做项目的时候,要用到时间计时,我们刚开始用的定时器,这个比较简单,但是后来我们想到一个问题就是如果我们芯片如果卡死复位了,掉电了,那么我们整一个流程中计时功能又从头开始。基于严谨考虑我觉得使用芯片另一个芯片资源符合我要求的就是rtc时钟。怎么用呢,下面按照我们理解来实现。


硬件原理图

VBAT供电如图1,2;芯片内部图如图3,4

这里如果是画PCB可以应用如图1,2电路,如果直接用核心板那我们可以接一个3.3v电池,接到VCC-VBAT,然后接一个GND

                                图1

                                        图2

                                                                               图3

                                                                        图4

从手册和图3可知,为了确保RTC在掉电情况下继续运行,可以将低速外部时钟(LSE)接到VBAT引脚上,这样即使系统掉电,RTC可以通过接入的外部时钟继续运行。同时,在系统上电后,可以通过开启低速外部时钟(LES)来确保RTC的正常运行和准确性。这样可以有效保证RTC在掉电情况下的稳定性和准确性,确保系统能够恢复正常工作。


配置寄存器流程如图5

                                                                图5


下面是对rtc进行配置

rtc时钟中断进行初始化

void rtc_init() 
{	
  //使能备份域时钟 等待可以被操作
  CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
  CKCUClock.Bit.BKP        = 1;
  CKCU_PeripClockConfig(CKCUClock, ENABLE);
  if (PWRCU_CheckReadyAccessed() != PWRCU_OK)
  {
    while (1);
  }

  NVIC_EnableIRQ(RTC_IRQn);
 
}


时间

对时间年份,月份进行处理,官方就是严谨。主要有两个函数,第一为判断是否为闰年,第二个函数数计算当前时间。

       

//判断是否是闰年
bool IsLeapYear(u32 year)
{
  if (((year % 4 == 0) && (year % 100 != 0) ) || (year % 400 == 0) )
    return TRUE;
  else
    return FALSE;
}


//调节时间
u8 AP_Time_Adjust(Time_T* AdjustTime)
{
  u32 i, temp, secsum = 0;

  temp = AdjustTime->year - 1;
  for (i = 0; i < (AdjustTime->year - 2014); i++)
  {
    if (IsLeapYear(temp--) == TRUE)
    {
      secsum += (366 * 86400);
    }
    else
    {
      secsum += (365 * 86400);
    }
  }

  temp = 1;
  for (i = 0; i < (AdjustTime->month - 1); i++)
  {
    if (temp == 2)
    {
      if (IsLeapYear(AdjustTime->year) == TRUE)
        secsum += (29 * 86400);
      else
        secsum += (28 * 86400);
    }
    else
    {
      secsum += (Day_Per_Month[temp] * 86400);
    }
    temp++;
  }

  secsum += ((AdjustTime->day - 1) * 86400);
  secsum += (AdjustTime->hour * 3600 );
  secsum += (AdjustTime->minute * 60);
  secsum += (AdjustTime->second);

  PWRCU_WriteBackupRegister((PWRCU_BAKREG_Enum) PWRCU_BAKREG_1, secsum);
  if (PWRCU_ReadBackupRegister((PWRCU_BAKREG_Enum) PWRCU_BAKREG_1) != secsum)
  {
    return 0;
  }

  return 1;
}


//计算当前时间
u8 AP_Time_Count(Time_T* CurrentTime)
{
  u32 i, secsum = 0, temp = 0;

  secsum = PWRCU_ReadBackupRegister((PWRCU_BAKREG_Enum) PWRCU_BAKREG_1);
  secsum += RTC_GetCounter();

  temp = 0;
  while (secsum >= (365 * 86400))
  {
    if (IsLeapYear(2014 + temp))
    {
      if (secsum >= (366 * 86400))
      {
        temp++;
        secsum -= (366 * 86400);
      }
      else
      {
        break;
      }
    }
    else
    {
      temp++;
      secsum -= (365 * 86400);
    }
  }
  CurrentTime->year = 2014 + temp;

  for (i = 1; i <= 12; i++)
  {
    if (secsum >= (Day_Per_Month[i] * 86400))
    {
      if (i == 2)  // February
      {
        if (IsLeapYear(CurrentTime->year))
        {
          if (secsum >= (29 * 86400))
            secsum -= (29 * 86400);
          else
            break;
        }
        else
        {
          secsum -= (28 * 86400);
        }
      }
      else
      {
        secsum -= (Day_Per_Month[i] * 86400);
      }
    }
    else
    {
      break;
    }
  }
  CurrentTime->month = i;

  CurrentTime->day = secsum / 86400 + 1;
  secsum -= ((CurrentTime->day - 1) * 86400);

  CurrentTime->hour = secsum / 3600;
  CurrentTime->minute = (secsum % 3600) / 60;
  CurrentTime->second = (secsum % 3600) % 60;

  return 1;
}

RTC进行配置

这段代码是一个配置RTC(Real-Time Clock)的函数。函数包括以下步骤:

  1. 调用PWRCU_DeInit()函数,对电源控制单元进行复位操作,确保RTC处于初始状态。

  2. 调用RTC_LSESMConfig()函数配置外部32.768k振荡器为正常模式。

  3. 调用RTC_LSECmd()函数使能LSE(Low Speed External)时钟。

  4. 使用while循环等待LSE稳定就绪,通过CKCU_GetClockReadyStatus()函数判断外部时钟是否准备就绪。

  5. 调用RTC_ClockSourceConfig()函数配置RTC时钟源为LSE。

  6. 调用RTC_IntConfig()函数使能秒中断。

  7. 调用RTC_SetPrescaler()函数设置RTC的分频器分频系数为32768。

  8. 调用RTC_CMPCLRCmd()函数使能比较器清零功能。

void RTC_Configuration(void)
{
  
	PWRCU_DeInit();
	//配置外部32.768k振荡器
	RTC_LSESMConfig(RTC_LSESM_NORMAL);
	RTC_LSECmd(ENABLE);
	while (CKCU_GetClockReadyStatus(CKCU_FLAG_LSERDY) == RESET);
	RTC_ClockSourceConfig(RTC_SRC_LSE);


	RTC_IntConfig(RTC_INT_CSEC, ENABLE);
	RTC_SetPrescaler(RTC_RPRE_32768);

															
	RTC_CMPCLRCmd(ENABLE);
}

RTC中断函数

这里设置了一个标志位,当标志位值1是开启RTC中断。

//RTC中断
void RTC_IRQHandler(void)
{
  u8 bFlags;

  bFlags = RTC_GetFlagStatus();
  if (bFlags & 0x1)
  {
    //1s更新标志位
    CK_SECOND_Flag = 1;
  }

}

主函数

主函数主要对rtc的应用

#include "ht32.h"
#include "ht32_board.h"
#include "led.h"
#include "delay.h"
#include "USART.h"
#include "IIC.h"
#include "SHT30.h"
//#include "modbus485.h"
#include "motor.h"
#include "DC_Motor.h"
//#include "Timer.h"
#include  "Lock.h"
#include "UART.h"
#include "RTC.h"


Time_T DateTime, CurTime;


int main()
{
	char datebuff[40];
	rtc_init();
	USART0_Configuration();
	

	  
	  //读取备份域寄存器 判断RTC是否已经配置
	  if (PWRCU_ReadBackupRegister((PWRCU_BAKREG_Enum) PWRCU_BAKREG_0) != 0xAA55AA55)
	  {
		// RTC 配置
		RTC_Configuration();	  

		//设置时间
		DateTime.year   = 2024;
		DateTime.month  = 4;
		DateTime.day    = 29;
		DateTime.hour   = 18;
		DateTime.minute = 0;
		DateTime.second = 0;
		  

		//使能 RTC 
		RTC_Cmd(ENABLE);

		PWRCU_WriteBackupRegister((PWRCU_BAKREG_Enum) PWRCU_BAKREG_0, 0xAA55AA55);
	  }
	while(1)
	{
                //标志位值1
			if (CK_SECOND_Flag)
			{
				CK_SECOND_Flag = 0;
		  //显示当前时间
		  AP_Time_Count(&CurTime);

      //sprintf函数将当前时间信息(年、月、日、时、分、秒)按指定的格式写入到datebuff字符数组中

		  sprintf(datebuff,"%04d-%02d-%02d %02d:%02d:%02d",CurTime.year,
														   CurTime.month,
														   CurTime.day,
														   CurTime.hour,
														   CurTime.minute,
														   CurTime.second);
			printf("%s\r\n", datebuff);
		}

	}
	
}

演示

直接串口助手演示,3.3V接到VBAT,GND接地,rx-tx,tx-rx。串口助手按照rtc中断每1s打印数据

就算按复位或者烧录,设置T口拔电源,日期计数不变

验证:成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1634773.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

简单记录一下在linux中安装pytorch成功!

1. 安装版本 pytorch版本:2.0.0 torchvision版本:0.15.0 torchaudio版本&#xff1a;2.0.0 cuda版本&#xff1a;cuda11.8 python版本&#xff1a;3.9 # CUDA 11.8 pip install torch2.0.0cu118 torchvision0.15.1cu118 torchaudio2.0.1 --index-url https://download.py…

最详细的SSL证书说明及免费申请方法

JoySSL官网 注册码230918 SSL&#xff08;Secure Sockets Layer&#xff09;证书&#xff0c;现在通常指的是其继任者TLS&#xff08;Transport Layer Security&#xff09;证书&#xff0c;是确保数据传输安全的核心技术之一。本文将深入探讨SSL证书的工作原理、重要性、类型以…

CSS-IN-JS Emotion

为什么会有css-in-js 优点 缺点 使用emotion插件库 npm i emotion/core emotion/styled使用时需要解析css属性 使用方式一&#xff1a; 通过注释告诉babel不讲jsx转化为react.create Element的调用&#xff0c;而是转化为jsx语法。会导致一个警告react未使用。 使用方式二&am…

windows11安装nginx

1.解压nginx安装包到没有中文的目录 2.双击运行nginx.exe 3.任务管理器查看是否有nginx进程 4.任务管理器->性能->资源监视器 5.网络->侦听端口&#xff0c;查看nginx侦听的端口&#xff0c;这里是90端口

JAVA顺序表相关习题1

1.笔试题:cvte str1 :welcome to cvte str2:come 描述:删除第一个字符串当中出现的所有的第二个字符串的字符!结果:wlt vt 要求 用ArrayList完成! public class Test {public static List<Character> findSameWords(String u1, String u2){List<Character> listn…

IoT Scenario: Smart Retail System-Multiple Sources and Multiple Terminals

物联网/大数据可视化领域发文可以联系&#xff1a;nascimsina.com IoT Scenario: Smart Retail System Overview The use of IoT in the retail industry enhances customer experiences, optimizes inventory management, and provides valuable insights into consumer beh…

S32K3系列 --- PTE13用作ADC采集电压异常问题

一、前言 当我们在将PTE13引脚配置未ADC功能的时候, 发现采集的电压异常。 二、问题排查 在S32DS的引脚配置里面,我们发现PTE13这个引脚默认是专用信号VRC_CTRL 但是在官方的IO表里也没有说默认路由到VRC_CTRL, 这个就很蛋疼。 通过芯片手册,我们发现: VRC_CTRL可以和B…

selenium 4.x 入门(环境搭建、八大元素定位)

背景 Web自动化测现状 1. 属于 E2E 测试 2. 过去通过点点点 3. 好的测试&#xff0c;还需要记录、调试网页的细节 一、selenium4.x环境搭建 一键搭建 pip3 install webdriver-helper 安装后自动的完成&#xff1a; 1. 查看浏览器的版本号 2. 查询操作系统的类型…

LeetCode in Python 10. Regular Expression Matching (正则表达式匹配)

正则表达式匹配涉及到两个字符串的匹配问题&#xff0c;类似于寻找最大公共子串&#xff0c;可使用动态规划思想解决。重点和难点在于如何构建正确的状态转移方程。 示例&#xff1a; 图1 正则表达式匹配输入输出 代码&#xff1a; class Solution:def isMatch(self, s: st…

二、再识VUE-MVVM

一、初识VUE 二、再识VUE-MVVM 三、VUE数据代理 MVVM Vue.js 专注于 MVVM 模型的 ViewModel 层。它通过双向数据绑定把 View 层和 Model 层连接了起来。实际的 DOM 封装和输出格式都被抽象为了 Directives 和 Filters。 ViewModel 一个同步 Model 和 View 的对象。在 Vue.js…

计算机复试项目:SpringCloud实战高并发微服务架构设计

秒杀购物商城--环境搭建 秒杀购物商城基础服务组件--详细介绍 秒杀购物商城基础服务--权限中心 秒杀购物商城业务服务--收货地址 秒杀购物商城业务服务--秒杀活动服务 秒杀购物商城--购物车的功能设计及分析 秒杀购物商城基础服务-用户中心 秒杀购物商城业务服务--商品中…

二分查找法实例

本文是根据数据结构中常常提到的二分法而作的一篇博客&#xff0c;主要通过一个二分法实例进行展开说明&#xff1a; 实例内容 通过一个二分法函数来寻找某个数是否在给定的数组中&#xff1b; 代码展示 # 执行二分查找法的算法函数 # 二分法查找的对象必须是一个有序的集…

初步认识Vscode

4.26初步认识Vscode &#xff08;一&#xff09;快捷键的使用 1. 打开控制端 ctrl ~2. 结束终端 ctrl c3. 多行同时对齐输出 按住shift alt 光标多选4. 多行同时任意位置输出 按住alt 光标单点你想要输入的位置5. 代码太长了&#xff0c;想混行编辑 alt z6. 打开设置控制…

工信部CAPPVD公布24年一季度积分情况,海云安位居全国第二!

近日&#xff0c;工业和信息化部移动互联网APP产品安全漏洞专业库&#xff08;以下简称“CAPPVD漏洞库”&#xff09;根据《CAPPVD漏洞库支撑单位能力评定办法》和综合24年第一季度的漏洞报送、重要行业企事业单位漏洞加分、高危漏洞处置加分、标准支撑等&#xff0c;最终公布了…

剧本杀小程序开发,剧本杀行业的新发展方向

前几年&#xff0c;剧本杀走入了大众的视野中&#xff0c;并迅速呈现出了井喷式的发展态势&#xff0c;一度成为了年轻消费者的首选娱乐方式&#xff0c;吸引了大量的消费者和跻身入局的创业者。 随着互联网的发展&#xff0c;剧本杀在线上的发展也非常火爆。我国网民群体非常…

final原理

文章目录 1. 设置 final 变量的原理2. 获取 final 变量的原理 1. 设置 final 变量的原理 理解了 volatile 原理&#xff0c;再对比 final 的实现就比较简单了 public class TestFinal {final int a 20; }字节码 0: aload_0 1: invokespecial #1 // Method java/lang/Object…

数据结构与算法(Java版) | 详解十大经典排序算法之一:插入排序

接下来&#xff0c;我来给大家讲解第三种排序算法&#xff0c;即插入排序。 基本介绍 首先&#xff0c;我们来看下插入排序的基本介绍。 插入排序&#xff0c;其属内部排序法&#xff0c;是对于欲排序的元素以插入的方式来找寻该元素的适当位置&#xff0c;以便最终达到排序…

解决RTC内核驱动的问题bm8563

常用pcf-8563 , 国产平替BM8563(驱动管脚一致)&#xff1b; 实时时钟是很常用的一个外设&#xff0c;通过实时时钟我们就可以知道年、月、日和时间等信息。 因此在需要记录时间的场合就需要实时时钟&#xff0c;可以使用专用的实时时钟芯片来完成此功能 RTC 设备驱动是一个标准…

最新版pycharm安装教程

目录 PyCharm 简介 访问 PyCharm 官网&#xff1a; 选择版本&#xff1a; 这里我们选择社区版即可 环境变量的配置 第一步 第二步 第三步 Pycharm的使用 【报错解决】 通用注意事项&#xff1a; PyCharm 简介 ​ PyCharm是一种Python IDE&#xff08;Integrated Devel…

Facebook的声音:听见社交媒体的心跳

社交媒体如今已经成为人们日常生活中不可或缺的一部分&#xff0c;而Facebook作为其中的佼佼者&#xff0c;承载着数以亿计的用户的交流、分享和连接。在这个信息爆炸的时代&#xff0c;Facebook的声音就像是社交媒体的心跳&#xff0c;传递着无数个体的情感、思想和生活。本文…