在线时间43 小时
UID38803
注册时间2008-3-29
NXP金币0
TA的每日心情 | 开心 2019-7-2 13:42 |
---|
签到天数: 31 天 [LV.5]常住居民I
高级会员
- 积分
- 576
- 最后登录
- 2020-4-7
|
本帖最后由 bjx1234 于 2018-8-6 13:40 编辑
KL26低功耗模式下的RTC模块还能继续工作吗?
我的硬件电路是KL26,XTAL0和EXTAL0之间接了一个32.768KHz的无源晶振。RTC_CLKIN不接任何器件。打算先进入VLLS3,一段时间后,用LLWU唤醒,希望在VLLS3时RTC仍然运行。在调试RTC之前,已经把休眠和LLWU唤醒调好了。
RTC初始化选用OSC32KCLK做为RTC的时钟源。程序在RTC秒中断处理函数里里翻转PTB0的输出电平。从示波器观察到,PTB0波形正常,说明RTC运行正常的。
查了参考手册,说OSC32KCLK在VLLS3时仍是运行的。可是从LLWU唤醒后,程序会复位,一旦运行到RTC初始化,初始计数值为0就为0了。而且RTC模块的时钟必须使能才能访问RTC寄存器。怎样才能证明VLLS3期间仍在正常计时呢?程序在唤醒后怎样来操作RTC呢?
rtcInit(0); /* RTC初始化,初始计数值为0 */
rtcIntConfig(1, MKL_RTC_TSI); /* RTC秒中断配置 */
rtcStart(); /* 启动RTC /
void rtcInit(INT32U ulSeconds)
{
INT32U i;
SIM_SCGC6 |= SIM_SCGC6_RTC_MASK; /* RTC控制时钟使能 */
SIM_SOPT1 = SIM_SOPT1_OSC32KSEL(0); /* RTC时钟源选择 */
RTC_CR = RTC_CR_SWR_MASK; /* RTC软件复位 */
RTC_CR &= ~RTC_CR_SWR_MASK; /* 解除复位 */
if (RTC_SR & RTC_SR_TIF_MASK) /* 清除TIF标志 */
{
RTC_TSR = 0x00000000; // this action clears the TIF
}
/*Set time compensation parameters*/
//RTC_TCR = RTC_TCR_CIR(c_interval) | RTC_TCR_TCR(c_value);
if (RTC_SR & RTC_SR_TCE_MASK) /* 如果RTC已经使能,则禁能 */
{
RTC_SR &= ~RTC_SR_TCE_MASK;
}
//RTC_TSR = ulSeconds;
/*Enable the oscillator*/
//RTC_CR |= RTC_CR_OSCE_MASK;
if (MKL_RTC_SOURCE != 3)
{
RTC_CR |= RTC_CR_OSCE_MASK | RTC_CR_SC16P_MASK; /* 使能32K时钟,接入16pF电容 */
for(i = 0; i < 0x600000; i++); /* 等待时钟源稳定 */
}
}
void rtcIntConfig(INT32U ulAlarm, INT8U ucIntType)
{
RTC_IER = 0;//清空
if(ucIntType & MKL_RTC_TSI) /* Time Seconds Interrupt */
{
RTC_IER |= RTC_IER_TSIE_MASK;
BSP_IntVectSet(BSP_INT_ID_RTC_SECONDS, RTC_Seconds_IRQHandler);
BSP_IntEn((IRQInterruptIndex)(BSP_INT_ID_RTC_SECONDS));
}
if(ucIntType & MKL_RTC_TAI) /* Time Alarm Interrupt */
{
RTC_TAR = ulAlarm;
RTC_IER |= RTC_IER_TAIE_MASK;
BSP_IntVectSet(BSP_INT_ID_RTC_ALARM, RTC_IRQHandler);
BSP_IntEn((IRQInterruptIndex)(BSP_INT_ID_RTC_ALARM));
}
if(ucIntType & MKL_RTC_TOI) /* Time Overflow Interrupt */
{
RTC_IER |= RTC_IER_TOIE_MASK;
BSP_IntVectSet(BSP_INT_ID_RTC_SECONDS, RTC_IRQHandler);
BSP_IntEn((IRQInterruptIndex)(BSP_INT_ID_RTC_SECONDS));
}
if(ucIntType & MKL_RTC_TII)
{
RTC_IER |= RTC_IER_TIIE_MASK;
BSP_IntVectSet(BSP_INT_ID_RTC_SECONDS, RTC_IRQHandler);
BSP_IntEn((IRQInterruptIndex)(BSP_INT_ID_RTC_SECONDS));
}
}
void RTC_Seconds_IRQHandler(void)
{
dvGPIO_Toggle_b(PTCB0); //test gpio
}
最佳答案
bjx1234 发表于 2018-8-9 15:41
一打开SIM_SCGC6_RTC_MASK,RTC_TSR就变成0了。想当于RTC重新初始化。建议你试验一下。最好给个例程啊。
...
你除了读TSR之外,是否还读了其他的RTC寄存器?
另外,RTC_CR[SWR]你配 ...
|
|