GD32E230官方的RTC demo存在的问题
官方的RTC例子,时钟源没有做分频,导致时间更新非常快,时间不正确。
我移植过来的RTC初始化函数
/***************************************************************************************************
* @fn bsp_InitRTC
*
* @brief RTC初始化
*
* @param 无
*
* @return 无
*/
void bsp_InitRTC(void)
{
uint32_t prescaler_s;
uint32_t prescaler_a;
rcu_periph_clock_enable(RCU_PMU);
pmu_backup_write_enable();
rcu_osci_on(RCU_IRC40K); //使能内部低速时钟
rcu_osci_bypass_mode_enable(RCU_IRC40K);
rcu_rtc_clock_config(RCU_RTCSRC_IRC40K);
//等待内部时钟稳定
if(rcu_osci_stab_wait(RCU_IRC40K) == SUCCESS)
{
rcu_rtc_clock_config(RCU_RTCSRC_IRC40K);
}
rcu_periph_clock_enable(RCU_RTC); //使能RTC外设时钟
rtc_register_sync_wait(); //等待RTC寄存器与APB时钟同步
rtc_deinit();
g_tRTC.rtc_year = 0x18 ;
g_tRTC.rtc_month = RTC_MAY ;
g_tRTC.rtc_date = 0x13 ;
g_tRTC.rtc_day_of_week = RTC_FRIDAY ;
g_tRTC.rtc_hour = 0x12;
g_tRTC.rtc_minute = 0x00;
g_tRTC.rtc_second = 0x00;
g_tRTC.rtc_display_format = RTC_24HOUR;
//RTC时钟分频系数(这里必须分频,否则时间不准确)
prescaler_s = 0x18F;
prescaler_a = 0x63;
g_tRTC.rtc_factor_asyn = prescaler_a;
g_tRTC.rtc_factor_syn = prescaler_s;
rtc_refclock_detection_enable();
rtc_init(&g_tRTC);
}
秒处理函数
/***************************************************************************************************
* @fn SEC_Handler
*
* @brief 秒事务处理函数
*
* @param 无
*
* @return 无
*/
void SEC_Handler(void)
{
rtc_parameter_struct s_RTC;
rtc_current_time_get(&s_RTC);
if (s_RTC.rtc_second != g_tRTC.rtc_second)
{
g_tRTC = s_RTC;
rtc_current_time_get(&g_tRTC);
}
}