KL 系列 FAQ (八)——RTC 模块
11.1 KL25Z RTC 模块初始化失败
问题:
KL25Z 用内部 32K 时钟 初始化 RTC 模块 就会使芯片晶振设置失败。
附上程序
- void rtc_init(uint32_t SecendTimes,uint32_t AlarmTimes)
- {
- int i;
- SIM_SCGC6 |= SIM_ SCGC6_RTC_MASK;//使能 RTC 时钟门控制
- OSC0_CR |= OSC_CR_ERCLKEN_MASK;
- SIM_SOPT1 |= SIM_SOPT1_OSC32KSEL(0);
- RTC_CR = RTC_CR_SWR_MASK;//软件复位 RTC 寄存器
- RTC_CR &= ~RTC_CR_SWR_MASK;//软件复位之后清 SWR 位
- RTC_CR |= RTC_CR_CLKO_MASK | RTC_CR_SC8P_MASK ;
- RTC_CR |= RTC_CR_OSCE_MASK;//使能 32.768kHz 振荡器
- for(i=0;i<0x600000;i++);//在使能 32.768kHz 振荡器之后,使能计数器
- //之前等待一段时间,来稳定 32.768kHz 时钟。
- RTC_TCR = RTC_TCR_CIR(0) | RTC_TCR_TCR(0);//配置定时器补偿寄存器的时
- 间间隔与时钟周期数
- RTC_TSR = SecendTimes;//初始化定时器秒寄存器
- RTC_TAR = AlarmTimes;//初始化定时器报警寄存器
- RTC_TPR = 0; //复位 RTC 定时器预分频器寄存器
- RTC_SR |= RTC_SR_TCE_MASK; //使能秒计数器
- }
一旦经过RTC_CR |= RTC_CR_OSCE_MASK;//使能 32.768kHz 振荡器这句之后就会死机。
答案:
从手册中(如下图)可以清楚的看出,RTC 模块一共有 3 个 clock 的来源。
它们分别是 LPO,RTC 的时钟输入脚和 OSC32KCLK,可以通过
SIM_SOPT1[OSC32KSEL] 选择(如下图)。 其中 LPO 是内部的 1KHz 频率的时钟;
OSC32KCLK 也是外部的时钟产生的,而且在使用 RTC 选择 OSC32KCLK 时,只
有外部晶振为 32.768 kHz 时才可以;选择 RTC_CLKIN 时,RTC_CLKIN 必须是有
源 32.768kHz 时钟源。所以说 RTC 的时钟是不能用内部 32.768kHz 产生的。不过
有人利用内部 32.768kHz 通过外部引脚输出然后引到 RTC_CLKIN 引脚这样的方法,
从而使用内部 32.768kHz 作为 RTC 的时钟源。
11.2 RTC 模块 使用内部时钟在 PE 中如何配置
问题:
FRDM_KL25Z 板上的 RTC_ IN 引脚没有有源晶振,如果想使用内部的慢速时
钟来作为 RTC 的时钟源,在 PE 中该如何配置实现?
答案:
内部的慢速时钟和 RTC 从芯片内部是没有连接线路的,所以,需要在外部
用引线将两个模块相连。思路:把板子上的 PTC1 配置为 RTC_CLKIN,用作 RTC
的时钟输入引脚。然后将 PTC3 配置为 CLKOUT,通过 SIM_SOPT2[ CLKOUTSEL]
选择 MCGIRCLK,并且配置 MCGIRCLK 为内部的慢速时钟 32.768khz。
下面来配置 PE 中的模块参数了。
首先,配置 CPU 部件的相关 RTC 参数,这些都是在 ex pert 中操作:
(1) 使能 RTC 时钟输入并选择 PTC1。
(2) MCGIRCLK source 选择为 slow,选择 32KHz 的时钟频率。
(3) 选择 ERCLK32K clock source 为 RTC clock inp ut,即选择 RTC_CLKIN
作为 RTC 模块 32khz 输入。
(4) 选择 PTC3 作为 CLKOUT 引脚,引脚输出信号配置为 MCGIRCLK。
然后,添加 RTC_LDD,并对其配置,需要注意,clock source 选择为 ERCLK32K.
其实,官方论坛有一个关于这方面的文章,并且附上了代码,具体链接为:
https://community.freescale.com/docs/DOC-94734
推荐阅读:
KL 系列 FAQ (七)
KL 系列 FAQ (六)
KL 系列 FAQ (五)
KL 系列 FAQ (四)
KL 系列 FAQ (三)
KL 系列 FAQ (二)
KL 系列 FAQ (一)