实时时钟在XMC4800kit上有设置,这里分享给给大家,一般来说RTC使用比较简单,设置好时间及中断后就可以了。但是本人在使用RTC时,发现只能进入Alarm中断1次,后面就无法再进入了,参考的程序主要也是APP help文档里的例程,不知道是不是程序设计的bug。。
好了。进入主题前,首先看看图纸里的RTC设置。如下图,使用标准的32.768K晶振。
硬件配置中默认使用的是内部的时钟,要是使用外部时钟,需要再CLOCK模块中进行配置,具体如下图:
一、 添加相应的RTC模块和IO模块,这里添加2个IO模块,分别指向2个LED灯,分别用于对 秒事件和设置的报警事件进行翻转指示。
二、 对RTC_0模块进行配置,具体如下:这里时间使用的是默认时间,在报警时间设置上,设置了1分钟,表明1分钟以后就会报警。
在中断设置上,选择周期时间为秒,对应的每秒都会触发Time_Handler中断处理函数,在Alarm时间设置中,使能报警中断,并选择NMI(不可屏蔽中断),会在alarm时间相应时,执行NMI_Handler。
三、 对IO模块的设置可以参见之前发帖,这里不再赘述。
四、 然后点击产生代码即可,在main函数中添加2个中断函数,在Time_Handler中我们翻转1个led灯,在NMI_Handler,我们读取报警设置时间,并重新设置时间,同时翻转另外一个led灯。
五、 具体代码如下:
- /*
- * main.c
- *
- * Created on: 2019 Jan 30 13:16:39
- * Author: ????
- */
- #include <DAVE.h> //Declarations from DAVE Code Generation (includes SFR declaration)
- /**
- * [url=home.php?mod=space&uid=159083]@brief[/url] main() - Application entry point
- *
- * <b>Details of function</b><br>
- * This routine is the application entry point. It is invoked by the device startup code. It is responsible for
- * invoking the APP initialization dispatcher routine - DAVE_Init() and hosting the place-holder for user application
- * code.
- */
- void Time_Handler(){
-
- DIGITAL_IO_ToggleOutput(&LED_0);
- }
- void NMI_Handler(){
-
- XMC_RTC_ALARM_t alarm_time;
-
- DIGITAL_IO_ToggleOutput(&LED_1);
-
- XMC_SCU_INTERRUPT_ClearEventStatus((XMC_SCU_INTERRUPT_EVENT_t)XMC_SCU_INTERRUPT_EVENT_RTC_ALARM);
-
- RTC_GetAlarmTime(&alarm_time);
-
- if(++alarm_time.minutes>59)
- {
-
- alarm_time.minutes=0;
-
- alarm_time.hours++;
- }
-
- RTC_Stop();
-
- RTC_SetAlarmTime(&alarm_time);
-
- RTC_Start();
- }
- int main(void)
- {
- RTC_Stop();
- DAVE_STATUS_t status;
- status = DAVE_Init(); /* Initialization of DAVE APPs */
- if(status != DAVE_STATUS_SUCCESS)
- {
- /* Placeholder for error handler code. The while loop below can be replaced with an user error handler. */
- XMC_DEBUG("DAVE APPs initialization failed\n");
- while(1U)
- {
- }
- }
- /* Placeholder for user application code. The while loop below can be replaced with user application code. */
- while(1U)
- {
- }
- }
复制代码
六、 编译后下载运行,可以看到1个led灯会每秒翻转1次,而另1个LED灯会在1分钟时翻转1次,而后每分钟都会翻转,但是我没有发现该LED灯再次翻转,因此怀疑有bug,希望可以反馈给英飞凌的技术人员,确认一下问题。
七、 具体运行图片如下: