打印
[Kinetis]

(转帖)FRDM-KL25Z平台RTC模块应用举例

[复制链接]
6715|57
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
作者:飞思卡尔半导体 喻宁宁
前言:最近在飞思卡尔英文社区看到外国人写的一个基于[/url]KL25Z FRDM开发板的RTC模块的应用,感觉很实用,所以动手验证了一下并参照自己的理解写了一个中文应用步骤,希望能帮到大家。原文链接:https://community.freescale.com/docs/DOC-94734

FRDM-KL25Z平台RTC模块应用举例
通常,RTC模块用来提供可靠的系统时间,包括时分秒和年月日等,其外围电路通常由一个高精度的32.768KHz晶体和一些电阻电容组成。飞思卡尔Kinetis家族MCU也同样包含RTC模块,但是同一家族不同的系列MCU的RTC模块内外部电路也不相同,其根本目的都在于产生一个32KHz的RTC时钟,如K60系列MCU,其RTC模块时钟的输入只能外部输入,但可以外接有源时钟信号或者无源晶振,而KL25系列MCU的RTC模块时钟输入选择如图1所示,可以来自外部有源时钟、外部系统晶振(振荡频率在32-40KHz之间)和内部PMC的LPO输出。飞思卡尔FRDM-KL25Z评估板以价格低、易学习的优点,在网友手中有比较大的保有量,所以在本应用中选用FRDM-KL25Z开发板作为验证RTC模块时钟功能的平台,方便大家学习。
但是,使用FRDM-KL25Z开发板进行RTC模块功能验证的不足在于:1. 系统外部EXTAL0和XTAL0之间连接晶振为8M,不能作为RTC时钟的输入;2. 外部时钟输入RTC_CLKIN引脚没有板载有源时钟;那么除了采用PMC的LPO输出外,还能怎么获得32KHz的时钟呢?于是想到了MCG的内部32KHz的IRC时钟,那么下一步的就是考虑如何把这个时钟连接到RTC_CLKIN引脚呢,这也正是本实验的巧妙之处:它充分利用板载的资源,以尽可能少的外围连接验证RTC模块的计时功能。如图2所示,在飞思卡尔KL25Z的FRDM开发板上,RTC_CLKIN信号引脚被引出,在硬件上对应的引脚为PTC3/CLKOUT,MCGIRCLK信号引脚也被引出,在硬件上对应的引脚为PTC1/RTC_CLKIN,所以只需把这两个引脚通过导线连接起来,即可将内部32KHz的慢速IRC时钟输出到RTC模块的RTC_CLKIN引脚。
图1

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



<!--[if !supportLists]-->1.      <!--[endif]-->使用Processor Expert 软件完成RTC模块配置
在建立一个带PE的空工程后,我们首先需要在Component Inspector设置CPU组件,设置如图2所示,步骤如下:
<!--[if !supportLists]-->1.      <!--[endif]-->在Clock settings >RTC clock input项中,使能RTC时钟输入,设置Clock Frequency 为32Khz,并选择PTC1作为RTC_CLKIN输入引脚;
<!--[if !supportLists]-->2.      <!--[endif]-->在Clock Source Settings > Clock Source Setting 0 > Internal reference clock > MCGIRCLK source中,使能MCG内部时钟MCGIRCLK,选择系统内部IRC时钟源位Slow,即内部32Khz时钟;
<!--[if !supportLists]-->3.      <!--[endif]-->在 Clock Source Settings > Clock Source Setting 0 > External reference clock > ERCLK32K Clock Source中,设置RTC模块时钟输入源,选择RTC Clock Input;
<!--[if !supportLists]-->4.      <!--[endif]-->在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所示,每隔一秒更新一次输出结果。
图4
<!--[if !supportLists]-->2.      <!--[endif]-->RTC模块bare-metal程序配置
对于一个非PE的应用,需要去自己直接操作寄存器完成相关的功能配置。同样,也需要完成两个方面的配置:对CPU 的配置(主要是时钟的配置)和RTC模块的配置。对CPU 的配置步骤如下:
<!--[if !supportLists]-->1.      <!--[endif]-->使能内部参考时钟,选择内部32Khz慢速时钟作为OUTCLK输出时钟源;
        MCG_C1 |= MCG_C1_IRCLKEN_MASK;
MCG_C2 &= ~(MCG_C2_IRCS_MASK);
<!--[if !supportLists]-->2.      <!--[endif]-->设置PTC1引脚的功能为RTC_CLKIN ,并选择32 KHz 时钟输入作为 RTC 模块时钟的输入源;
PORTC_PCR1 |= (PORT_PCR_MUX(0x1));         
SIM_SOPT1 |= SIM_SOPT1_OSC32KSEL(0b10);
<!--[if !supportLists]-->3.      <!--[endif]-->设置PTC3引脚的功能为CLKOUT,并选择MCG内部 32 KHz 慢时钟输出到CLKOUT引脚
SIM_SOPT2 |= SIM_SOPT2_CLKOUTSEL(0b100);
PORTC_PCR3 |= (PORT_PCR_MUX(0x5));
同样,在完成CPU的配置后,还需要配置RTC模块,其中重要的是其秒中断的设置。
<!--[if !supportLists]-->1.      <!--[endif]-->使能软件可触发中断;
SIM_SCGC6 |= SIM_SCGC6_RTC_MASK;
<!--[if !supportLists]-->2.      <!--[endif]-->清除所有的RTC寄存器;
RTC_CR = RTC_CR_SWR_MASK;
RTC_CR &= ~RTC_CR_SWR_MASK;
if (RTC_SR & RTC_SR_TIF_MASK)
{
RTC_TSR = 0x00000000;
}
<!--[if !supportLists]-->3.      <!--[endif]-->设置时间补偿参数,这个参数会根据应用的不同而不同;
RTC_TCR = RTC_TCR_CIR(1) | RTC_TCR_TCR(0xFF);
<!--[if !supportLists]-->4.      <!--[endif]-->使能模块的秒中断;
enable_irq(INT_RTC_Seconds - 16);
RTC_IER |= RTC_IER_TSIE_MASK;
<!--[if !supportLists]-->5.      <!--[endif]-->启动时间计数器,并写秒寄存器;
RTC_SR |= RTC_SR_TCE_MASK;
RTC_TSR = 0xFF;
完成以上工作后,还需要添加中断服务程序,编写应用程序,详细代码请参见附件2。同样,在调试过程中,串口接收终端波特率设置也应为115200,调试结果如图5所示,每隔一秒更新一次输出结果,只显示分和秒的值。

图5
附件
游客,如果您要查看本帖隐藏内容请回复

相关帖子

沙发
FSL_TICS_ZJJ|  楼主 | 2013-12-9 16:49 | 只看该作者
第一批大明星中奖的同学们,待会板子到手就可以调这个例子啦!还是蛮不错的。

使用特权

评论回复
板凳
leo2018| | 2013-12-9 16:56 | 只看该作者
thank you!!

使用特权

评论回复
地板
Imakey| | 2013-12-9 16:56 | 只看该作者
保持密切关注

使用特权

评论回复
5
ar_m_cu| | 2013-12-9 17:06 | 只看该作者
那个串口打印怎么弄的?

使用特权

评论回复
6
ar_m_cu| | 2013-12-9 17:06 | 只看该作者
那个串口打印怎么弄的?

使用特权

评论回复
7
FSL_TICS_ZJJ|  楼主 | 2013-12-9 17:23 | 只看该作者
ar_m_cu 发表于 2013-12-9 17:06
那个串口打印怎么弄的?


你是指串口界面吗?这个就是一个串口终端,你可以用串口助手看!
还是说,如何配置串口呢?请将问题描述清楚!

使用特权

评论回复
8
ar_m_cu| | 2013-12-9 17:37 | 只看该作者
FSL_TICS_ZJJ 发表于 2013-12-9 17:23
你是指串口界面吗?这个就是一个串口终端,你可以用串口助手看!
还是说,如何配置串口呢?请将问题描述 ...

如何配置的?

使用特权

评论回复
9
FSL_TICS_ZJJ|  楼主 | 2013-12-9 17:51 | 只看该作者
本帖最后由 FSL_TICS_ZJJ 于 2013-12-9 17:53 编辑
ar_m_cu 发表于 2013-12-9 17:37
如何配置的?


哦,这个好弄,不是有一个console IO模块吗?然后你在里面设置一下波特率,串口号就好了,然后直接用printf就可以输出了。你把例程下下来,然后看一下就知道了,不懂的话可以问我。

使用特权

评论回复
10
ar_m_cu| | 2013-12-9 17:52 | 只看该作者
FSL_TICS_ZJJ 发表于 2013-12-9 17:51
哦,这个好弄,不是有一个consel IO模块吗?然后你在里面设置一下波特率,串口号就好了,然后直接用print ...

好的,谢谢

使用特权

评论回复
11
123de7| | 2013-12-9 17:57 | 只看该作者
太及时了!!!顶一个!!

使用特权

评论回复
12
henextsuperssun| | 2013-12-9 21:39 | 只看该作者
看看

使用特权

评论回复
13
zhdm| | 2013-12-10 09:01 | 只看该作者
good

使用特权

评论回复
14
夜明星稀| | 2013-12-10 09:17 | 只看该作者
学习一年

使用特权

评论回复
15
FSL_TICS_ZJJ|  楼主 | 2013-12-10 09:19 | 只看该作者
本帖最后由 FSL_TICS_ZJJ 于 2013-12-10 09:22 编辑
ar_m_cu 发表于 2013-12-9 17:52
好的,谢谢


如果还是不会,关于串口的模块添加,需要的话我们可以发一些相关的制作帖子出来。比较简单。

使用特权

评论回复
16
FSL_TICS_ZJJ|  楼主 | 2013-12-10 09:22 | 只看该作者
123de7 发表于 2013-12-9 17:57
太及时了!!!顶一个!!

马上板子送出去,就可以调起来了。这个不需要外部晶振,直接使用内部时钟去搞RTC的。

使用特权

评论回复
17
motodefy| | 2013-12-10 14:01 | 只看该作者
学习了啊···

使用特权

评论回复
18
q2013| | 2013-12-13 15:03 | 只看该作者
学习学习...........

使用特权

评论回复
19
keno52| | 2013-12-13 15:34 | 只看该作者
支持一个

使用特权

评论回复
20
774729254| | 2013-12-13 19:43 | 只看该作者
:P

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

165

主题

5069

帖子

88

粉丝