这里介绍两种RTC模块配置的方法,分别是使用PE和不使用PE配置RTC模块,下面分别讨论,最后附上
应用程序代码(硬件平台为FRDM-KL25Z评估板)。
1.使用Processor Expert软件完成RTC模块配置
在建立一个带
PE
的空工程后,我们首先需要在
Component Inspector
设置
CPU
组件,设置如图
2
所示
,步骤如下:
1.在Clock settings >RTC clock input项中,使能RTC时钟输入,设置Clock Frequency为32Khz,并选择PTC1作为RTC_CLKIN输入引脚;
2.在Clock Source Settings > Clock Source Setting 0 > Internal reference clock > MCGIRCLK source中,使能MCG内部时钟MCGIRCLK,选择系统内部IRC时钟源位Slow,即内部32Khz时钟;
3.在Clock Source Settings > Clock Source Setting 0 > External reference clock > ERCLK32K Clock Source中,设置RTC模块时钟输入源,选择RTC Clock Input;
4.在Internal peripherals > System Integration Module > CLKOUT pin control中,设置32Khz时钟输出到PTC3引脚作为CLKOUT;
图2
在完成以上设置后,从PTC3引脚得到了一个输出的32K时钟,PTC1引脚作为RTC模块的时钟输入,MCG模块配置为PEE模式:PLL clock 96 MHz、Core Clock 48 MHz、Bus clock 24 MHz。下面就要对RTC模块进行配置了,设置如图3所示,步骤比较简单,只需配置Clock source为ERCLK32K即可。
图3
完成以上步骤,点击Generate Processor Expert Code生成代码,然后再写入时间处理的应用代码即可,具体应用代码可以参见附件程序1。需要指出的是,在采用FRDM-KL25Z的OpenSDA调试过程中,串口接收终端波特率设置应为115200,调试结果如图4所示,每隔一秒更新一次输出结果。
2. RTC模块bare-metal程序配置
对于一个非PE的应用,需要去自己直接操作寄存器完成相关的功能配置。同样,也需要完成两个方面的配置:对CPU的配置(主要是时钟的配置)和RTC模块的配置。对CPU的配置步骤如下:
1.使能内部参考时钟,选择内部32Khz慢速时钟作为OUTCLK输出时钟源;
MCG_C1 |= MCG_C1_IRCLKEN_MASK;
MCG_C2 &= ~(MCG_C2_IRCS_MASK);
2.设置PTC1引脚的功能为RTC_CLKIN,并选择32 KHz时钟输入作为RTC模块时钟的输入源;
PORTC_PCR1 |= (PORT_PCR_MUX(0x1));
SIM_SOPT1 |= SIM_SOPT1_OSC32KSEL(0b10);
3.设置PTC3引脚的功能为CLKOUT,并选择MCG内部32 KHz慢时钟输出到CLKOUT引脚
SIM_SOPT2 |= SIM_SOPT2_CLKOUTSEL(0b100);
PORTC_PCR3 |= (PORT_PCR_MUX(0x5));
同样,在完成CPU的配置后,还需要配置RTC模块,其中重要的是其秒中断的设置。
1.使能软件可触发中断;
SIM_SCGC6 |= SIM_SCGC6_RTC_MASK;
2.清除所有的RTC寄存器;
RTC_CR = RTC_CR_SWR_MASK;
RTC_CR &= ~RTC_CR_SWR_MASK;
if (RTC_SR & RTC_SR_TIF_MASK)
{
RTC_TSR = 0x00000000;
}
3.设置时间补偿参数,这个参数会根据应用的不同而不同;
RTC_TCR = RTC_TCR_CIR(1) | RTC_TCR_TCR(0xFF);
4.使能模块的秒中断;
enable_irq(INT_RTC_Seconds - 16);
RTC_IER |= RTC_IER_TSIE_MASK;
5.启动时间计数器,并写秒寄存器;
RTC_SR |= RTC_SR_TCE_MASK;
RTC_TSR = 0xFF;
完成以上工作后,还需要添加中断服务程序,编写应用程序,详细代码请参见附件2。同样,在调试过程中,串口接收终端波特率设置也应为115200,调试结果如图5所示,每隔一秒更新一次输出结果,只显示分和秒的值。