先申明,本栏目用的都是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);
}