GD32F4xx—RTC初始化设置及闹钟方式实现秒停止解说
1、下载链接:源码工程
一、概述
GD32F4x的RTC例程网上资源较少,具体阅读用户手册后做出如下设置。RTC模块提供了一个包罗日期(年/月/日)和时间(时/分/秒/亚秒)的日历功能。除亚秒用二进制码表现外,时间和日期都以BCD码的情势表现。RTC可以举行夏令时赔偿。RTC可以工作在省电模式下,并通过软件设置来智能唤醒。RTC支持外接更高精度的低频时钟,用以到达更高的日历精度。下边就以RTC模块的框图为引线,对RTC的相干功能和利用做相干先容。
二、框图
RTC单元有三个可选的独立时钟源:
- 外部低速晶体振荡器时钟 LXTAL
- 内部32K RC振荡器时钟 IRC32K
- 外部高速晶体振荡器时钟 HXTAL
- 一样平常选用LXTAL外部32.768K晶振,内部晶振受温漂影响,计时会存在较大的偏差。LXTAL随后颠末一个7位的异步预分频(默认值为127+1)和一个15位的同步预分频(255+1),得到1Hz的时钟频率。
三、RTC初始化和设置
在默认环境下,PMU_CTL寄存器的BKPWEN位被清0。以是写RTC寄存器前必要软件提前设置BKPWEN位。RTC_BKPx寄存器处于VDD备份域中,纵然VDD电源被堵截,该地区的寄存器的电源还可由VBAT提供。从待机模式唤醒或体系复位利用都不会影响这些寄存器。只有当被检测到有侵入变乱和备份域复位时,这些寄存器复位。
- /*!
- \brief main function
- \param[in] none
- \param[out] none
- \retval none
- */
- int main(void)
- {
- gd_eval_com_init(EVAL_COM0);
- printf("\n\r ****************** RTC calendar demo ******************\n\r");
- /* enable PMU clock */
- rcu_periph_clock_enable(RCU_PMU);
- /* enable the access of the RTC registers */
- pmu_backup_write_enable();
-
- rtc_pre_config();
- /* get RTC clock entry selection */
- RTCSRC_FLAG = GET_BITS(RCU_BDCTL, 8, 9);
- /* check if RTC has aready been configured */
- if((BKP_VALUE != RTC_BKP0) || (0x00 == RTCSRC_FLAG)){
- /* backup data register value is not correct or not yet programmed
- or RTC clock source is not configured (when the first time the program
- is executed or data in RCU_BDCTL is lost due to Vbat feeding) */
- rtc_setup();
- }else{
- /* detect the reset source */
- if (RESET != rcu_flag_get(RCU_FLAG_PORRST)){
- printf("power on reset occurred....\n\r");
- }else if (RESET != rcu_flag_get(RCU_FLAG_EPRST)){
- printf("external reset occurred....\n\r");
- }
- printf("no need to configure RTC....\n\r");
- rtc_show_time();
- rtc_show_alarm();
- }
- rcu_all_reset_flag_clear();
- /* configure the leds */
- gd_eval_led_init(LED1);
- gd_eval_led_on(LED1);
- gd_eval_led_init(LED2);
- gd_eval_led_on(LED2);
- rtc_flag_clear(RTC_FLAG_ALRM0);
- exti_flag_clear(EXTI_17);
- /* RTC alarm interrupt configuration */
- exti_init(EXTI_17,EXTI_INTERRUPT,EXTI_TRIG_RISING);
- nvic_irq_enable(RTC_Alarm_IRQn,0,0);
- while (1);
- }
复制代码 四、停止部门
- void RTC_Alarm_IRQHandler(void)
- {
- if(RESET != rtc_flag_get(RTC_FLAG_ALRM0)){
- rtc_flag_clear(RTC_FLAG_ALRM0);
- exti_flag_clear(EXTI_17);
- gd_eval_led_toggle(LED2);
- rtc_show_time();
- }
- }
复制代码 五、试验征象
每秒打印时间信息。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金 |