1.背景:
对于一些特殊场景,我们可能需要在休眠后一定时间内唤醒。比如在休眠的过程中收到一个事件,这个时候已经在跑休眠的流程了,无法停止,我们只能记录这个事件,待休眠结束后再唤醒MCU。
本文以S32K3芯片的RTI定时器位例,介绍如何配置,实现定时器唤醒MCU。
2. RTI简介:
RTI全称:Real Time Interrupt。RTI有一个32-bit 向下计数的counter,仅有PIT0有RTI,PIT中仅RTI能在低功耗模式下运行。如下图所示:
RTI与其他定时器的对比如下图,我们可以看到,除了RTI,还有RTC和API这些定时器都能唤醒MCU。
RTI与通用定时器的使用基本一致,特殊之处,一是能在低功耗模式下运行外,二是其时钟源仅能使用SIRC作为时钟源,如下图所示:
3. EB配置:
3.1 Platform配置:
打开PIT0的中断:
配置PIT0的中断回调处理函数:PIT_0_ISR
3.2 Gpt配置:
使能RTI硬件通道和中断
配置PIT0的RTI通道:
配置RTI的逻辑通道:
3.3 时钟配置:
MCU中的配置如下图:
3.4 Icu配置:
下面的配置设计到唤醒的功能,首先配置唤醒的硬件通道:
在IcuWkpu中配置通道:
配置逻辑通道:
经上述配置,即可使用RTI功能
4. 代码:
初始化MCU、clock、中断(Platform)、GPT、Icu之后就可以正常开启定时器,当定时结束后,如果MCU处于休眠状态,就会自动唤醒。
RTI使用的时钟为SIRC,时钟频率32000Hz,因此Gpt_StartTimer函数中的value为32000,则定时时间为1s。
Gpt_StartTimer(GptConf_GptChannelConfiguration_Gpt_PIT0_Ch_RTI, 32000);
另外需要注意的是,在代码中需要收到调用底层的唤醒使能函数:
Wkpu_Ip_EnableInterrupt(0, 3);
否则定时结束不会唤醒MCU。第一参数instance,第二个参数为唤醒源的number,选择方法如下图:
驱动层提供了一个函数Gpt_EnableWakeup();但是却不能使能PIT的wake up中断,必须要调用Wkpu_Ip_EnableInterrupt()函数才行。理论上我们不应该这样调用,感觉像是目前版本驱动的一个bug。