GD32F470之RTC时钟计算+配置+BCD和二进制转换

本文详细介绍了在GD32F470芯片上如何进行RTC时钟配置,计算1Hz时钟,并提供了RTC初始化参数设置。同时,讲解了RTC时钟源的稳定等待以及BCD码和二进制之间的转换方法,对于STM32的RTC应用和单片机开发具有参考价值。
摘要由CSDN通过智能技术生成

先申明,本栏目用的都是GD32F470芯片240M,软件用的是keil,编写用的是C++(其实和C没有区别).

1hz的时钟计算

我的RTC时钟是32.768K.
rtc_initpara.factor_asyn = 0x7F ;
rtc_initpara.factor_syn = 0xff;

32.768K / 0x7F =256
256 /256 =1;
在这里插入图片描述

RTC代码配置

注意;我这里的现象是顺序不能变,不然上电时会卡死,因为要等待时钟稳定 rcu_osci_stab_wait(RCU_LXTAL);,不知道对不对。

	//先使能PMU,再使能LXTAL。
			 /* enable PMU clock */ 
    rcu_periph_clock_enable(RCU_PMU);//备份寄存器
    /* enable the access of the RTC registers */
    pmu_backup_write_enable(); //写使能
	
	
		rcu_osci_on(RCU_LXTAL);//1:使能 LXTAL 时钟
	
	
		delay_us(500);
		rcu_osci_stab_wait(RCU_LXTAL); //1:LXTAL 已稳定
		rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);//选择 CK_LXTAL 时钟作为 RTC 的时钟源
	
	
	
	  rcu_periph_clock_enable(RCU_RTC);  //1:开启 RTC 时钟
	
    rtc_register_sync_wait();//1:读取的日历的值来自真正日历寄存器
															//注意:如果 APB1 时钟的频率小于 RTCCLK 频率的 7 倍,该位必须设为 1
															//1:影子寄存器已同步
	

	
		
	//分频成1hz
		rtc_initpara.factor_asyn  =	 0x7F ;
		rtc_initpara.factor_syn   =  0xff; 
	
		Rtc_Set_Time(10,48,45);
		
		Rtc_Set_Data(22,7,20,RTC_WEDSDAY);
		 
		 //利用备份区域  ,使下载程序时不会覆盖时间,要修改时间,需要修改该RTC_BKP0的值
		if(0x320!= RTC_BKP0)
		 {
			 
				 if(ERROR ==rtc_init(&rtc_initpara))
						return 1;
				 else
						RTC_BKP0 = 0x320;
			}
	 
	 return 0;

时间的BCD码和二进制转换:

uint8_t Rtc_Class::RTC_Bcd2ToByte(uint8_t Value)
{
  uint8_t tmp;
  tmp = ((Value & 0xF0u) >> 4u) * 10u;
  return (tmp + (Value & 0x0Fu));
}


uint8_t  Rtc_Class::RTC_ByteToBcd2(uint8_t Value)
{
  uint32_t bcdhigh = 0u;
  uint8_t Param = Value;

  while(Param >= 10u)
  {
    bcdhigh++;
    Param -= 10u;
  }

  return  ((uint8_t)(bcdhigh << 4u) | Param);
}

设置时间:

void Rtc_Class::Rtc_Set_Data(uint8_t year,uint8_t month,uint8_t date,uint8_t dayOfweek)
{
		rtc_initpara.year	 = RTC_ByteToBcd2(year);
		rtc_initpara.month =	RTC_ByteToBcd2(month);
		rtc_initpara.date =		RTC_ByteToBcd2(date);
		rtc_initpara .day_of_week = dayOfweek;
}
void Rtc_Class::Rtc_Set_Time(uint8_t hour,uint8_t minute,uint8_t second)
{

		
		rtc_initpara.hour  		=  RTC_ByteToBcd2(hour);
		rtc_initpara.minute  	= RTC_ByteToBcd2(minute);
		rtc_initpara.second 	= RTC_ByteToBcd2(second);
		
		rtc_initpara .display_format = RTC_24HOUR;

	
}

读取时间:

uint8_t Rtc_Class::Rtc_Read_Time()
{
		rtc_current_time_get(&rtc_initpara);
	
		rtc_initpara.year	 = RTC_Bcd2ToByte( rtc_initpara.year);
		rtc_initpara.month =	RTC_Bcd2ToByte( rtc_initpara.month);
		rtc_initpara.date =		RTC_Bcd2ToByte( rtc_initpara.date);
		rtc_initpara.hour  		=  RTC_Bcd2ToByte( rtc_initpara.hour);
		rtc_initpara.minute  	= RTC_Bcd2ToByte( rtc_initpara.minute);
		rtc_initpara.second 	= RTC_Bcd2ToByte( rtc_initpara.second);

		
}
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值