FSL_FAE_ConstYu的个人空间 https://bbs.21ic.com/?1105562 [收藏] [复制] [RSS]

日志

FRDM-KL25Z平台RTC模块应用举例

已有 966 次阅读2014-10-17 00:34 |个人分类:Kinetis 内部模块应用|系统分类:单片机| 飞思卡尔, RTC, Processor, Expert, FRDM-KL25Z

        通常,RTC模块用来提供可靠的系统时间,包括时分秒和年月日等,其外围电路通常由一个高精度的32.768KHz晶体和一些电阻电容组成。飞思卡尔Kinetis家族MCU也同样包含RTC模块,但是同一家族不同的系列MCURTC模块内外部电路也不相同,其根本目的都在于产生一个32KHzRTC时钟,如K60系列MCU,其RTC模块时钟的输入只能外部输入,但可以外接有源时钟信号或者无源晶振,而KL25系列MCURTC模块时钟输入选择如图1所示,可以来自外部有源时钟、外部系统晶振(振荡频率在32-40KHz之间)和内部PMCLPO输出。飞思卡尔FRDM-KL25Z评估板以价格低、易学习的优点,在网友手中有比较大的保有量,所以在本应用中选用FRDM-KL25Z开发板作为验证RTC模块时钟功能的平台,方便大家学习。







但是,使用FRDM-KL25Z开发板进行RTC模块功能验证的不足在于:1. 系统外部EXTAL0XTAL0之间连接晶振为8M,不能作为RTC时钟的输入;2. 外部时钟输入RTC_CLKIN引脚没有板载有源时钟;3. PMCLPO 1KHz输出误差较大,补偿比较麻烦。那么还能怎么获得32KHz的时钟呢?于是想到了MCG的内部32KHzIRC时钟,那么下一步的就是考虑如何把这个时钟连接到RTC_CLKIN引脚呢,这也正是本实验的巧妙之处:它充分利用板载的资源,以尽可能少的外围连接验证RTC模块的计时功能。如图2所示,在飞思卡尔KL25ZFRDM开发板上,RTC_CLKIN信号引脚被引出,在硬件上对应的引脚为PTC3/CLKOUTMCGIRCLK信号引脚也被引出,在硬件上对应的引脚为PTC1/RTC_CLKIN,所以只需把这两个引脚通过导线连接起来,即可将内部32KHz的慢速IRC时钟输出到RTC模块的RTC_CLKIN引脚。

1

2

这里介绍两种RTC模块配置的方法,分别是使用PE和不使用PE配置RTC模块,下面分别讨论,最后附上应用程序代码(硬件平台为FRDM-KL25Z评估板)。

1.     使用Processor Expert 软件完成RTC模块配置

在建立一个带PE的空工程后,我们首先需要在Component Inspector设置CPU组件,设置如图3所示,步骤如下:

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

3

在完成以上设置后,PTC3引脚得到了一个输出的32K时钟,PTC1引脚作为RTC模块的时钟输入, MCG模块配置为PEE模式:  PLL clock 96MHzCore Clock 48 MHz Bus clock 24 MHz。下面就要对RTC模块进行配置了,设置如图4所示,步骤比较简单,只需配置Clock sourceERCLK32K即可。

4

        完成以上步骤,点击Generate Processor Expert Code生成代码,然后再写入时间处理的应用代码即可,具体应用代码可以参见附件程序1。需要指出的是,在采用FRDM-KL25ZOpenSDA调试过程中,串口接收终端波特率设置应为115200,调试结果如图5所示,每隔一秒更新一次输出结果。

5

2.     RTC模块bare-metal程序配置

对于一个非PE的应用,需要去自己直接操作寄存器完成相关的功能配置。同样,也需要完成两个方面的配置:对CPU 的配置(主要是时钟的配置)和RTC模块的配置。对CPU 的配置步骤如下:

1. 使能内部参考时钟,选择内部32Khz慢速时钟作为OUTCLK输出时钟源;

       
  1. MCG_C1 |= MCG_C1_IRCLKEN_MASK;
  2. MCG_C2&= ~MCG_C2_IRCS_MASK;
复制代码

设    2. 设置PTC1引脚的功能为RTC_CLKIN ,并选择32 KHz 时钟输入作为 RTC 模块时钟的输入源;

       
  1. PORTC_PCR1|=(PORT_PCR_MUX(0x1));         
  2. SIM_SOPT1|=SIM_SOPT1_OSC32KSEL(0x2);
复制代码

3.P        3. 设置引脚的功能为CLKOUT,并选择MCG内部 32 KHz 慢时钟输出到CLKOUT引脚

       
  1. SIM_SOPT2|= SIM_SOPT2_CLKOUTSEL(0x4);
  2. PORTC_PCR3|=(PORT_PCR_MUX(0x5));
复制代码

同样,在完成CPU的配置后,还需要配置RTC模块,其中重要的是其秒中断的设置。

1.  使能软件可触发中断;

       
  1. SIM_SCGC6|= SIM_SCGC6_RTC_MASK;
复制代码

        2. 清除所有的RTC寄存器;

       
  1. RTC_CR= RTC_CR_SWR_MASK;
  2. RTC_CR&= ~RTC_CR_SWR_MASK;

  3. if (RTC_SR& RTC_SR_TIF_MASK)
  4. {
  5.         RTC_TSR = 0x00000000;
  6. }
复制代码

        3. 设置时间补偿参数,这个参数会根据应用的不同而不同;

       
  1. RTC_TCR= RTC_TCR_CIR(1) | RTC_TCR_TCR(0xFF);
复制代码

        4. 使能模块的秒中断;

       
  1. enable_irq(INT_RTC_Seconds -16);
  2. RTC_IER|= RTC_IER_TSIE_MASK; 
复制代码

          5. 启动时间计数器,并写秒寄存器;

       
  1. RTC_SR|= RTC_SR_TCE_MASK;
  2. RTC_TSR= 0xFF;
复制代码

完成以上工作后,还需要添加中断服务程序,编写应用程序,。同样,在调试过程中,串口接收终端波特率设置也应为115200,调试结果如图6所示,每隔一秒更新一次输出结果,只显示分和秒的值。

6


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)