查看: 2140|回复: 7

[已解决] KL25低功耗模式下的RTC模块还能继续工作吗

[复制链接]
  • TA的每日心情
    开心
    2019-7-2 13:42
  • 签到天数: 31 天

    [LV.5]常住居民I

    12

    主题

    253

    帖子

    0

    高级会员

    Rank: 4

    积分
    576
    最后登录
    2020-4-7
    发表于 2018-8-6 13:33:58 | 显示全部楼层 |阅读模式
    本帖最后由 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]你配 ...
    回复

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    20201
    最后登录
    2024-5-10
    发表于 2018-8-7 13:34:40 | 显示全部楼层
    楼主你好!
    根据KL25的参考手册,RTC在各个低功耗模式下,都是可以工作的。
    1.jpg
    5. In VLLS0 the only clocking option is from RTC_CLKIN

    如果要证明在低功耗下还是工作的最好办法,就是进入低功耗之前翻转下引脚,然后配置好RTC定时唤醒,一旦唤醒后就再次翻转下IO,然后测试下时间,就差不多知道了。


    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-7-2 13:42
  • 签到天数: 31 天

    [LV.5]常住居民I

    12

    主题

    253

    帖子

    0

    高级会员

    Rank: 4

    积分
    576
    最后登录
    2020-4-7
     楼主| 发表于 2018-8-7 13:45:42 | 显示全部楼层
    本帖最后由 bjx1234 于 2018-8-7 13:48 编辑
    小恩GG 发表于 2018-8-7 13:34
    楼主你好!
    根据KL25的参考手册,RTC在各个低功耗模式下,都是可以工作的。

    我用LLWU引脚唤醒,唤醒后程序会复位,怎么处理RTC模块才好啊? 不初始化RTC,想从RTC_TSR读出秒计时,读不了。一初始化RTC_TSR就变成0了啊。我是想要RTC休眠期间仍然工作的。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    20201
    最后登录
    2024-5-10
    发表于 2018-8-8 09:55:39 | 显示全部楼层
    bjx1234 发表于 2018-8-7 13:45
    我用LLWU引脚唤醒,唤醒后程序会复位,怎么处理RTC模块才好啊? 不初始化RTC,想从RTC_TSR读出秒计时,读不 ...

    你复位后,有没有又做RTC的初始化呢?
    你再复位后,没有初始化之前读下RTC,看看值是否还有,
    下面是VLLSx复位后的流程:
    1. Reset Vector Fetched,
    2. Code execution begins
    3. User should Check the source of the RESET in SRS registers
    4. If Wakeup bit then you recovered from VLLS1, 2 or 3. You know the mode you recovered from by reading the PMCTRL_LPLLSM bits.
    5. You can begin the process of determining what was the source of the wakeup or use the LLWU interrupt handler to do this after interrupts are enabled.
    6. If RTC was enabled and not reinitialized do not reinitialize the RTC
    7. Reinitialize PORT setup,
    8. Module setup prior to clearing the LLWU ACKISO bit which releases the hold on the pins.
    9. The LLWU interrupt is taken if the source of the wakeup was not cleared in reset source discovery.  
    10.The module or pin interrupt is taken if the source of the wakeup was not cleared previously.
    11.Main code execution continues
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-7-2 13:42
  • 签到天数: 31 天

    [LV.5]常住居民I

    12

    主题

    253

    帖子

    0

    高级会员

    Rank: 4

    积分
    576
    最后登录
    2020-4-7
     楼主| 发表于 2018-8-9 09:00:41 | 显示全部楼层
    本帖最后由 bjx1234 于 2018-8-9 09:03 编辑

    复位后,不对RTC初始化,读不了RTC的寄存器啊。
    我的代码如下:
      //读取RTC_TSR
        if (SIM_SCGC6 & SIM_SCGC6_RTC_MASK)
        {
            rtc_num = RTC_TSR;
            Str_FmtNbr_Int32U(rtc_num, 10,DEF_NBR_BASE_DEC,'0',DEF_YES,DEF_NO,rtcstr);//数字转字符串
            APP_TRACE_INFO((rtcstr));  //用串口打印出来
            APP_TRACE_INFO((" first \n\r"));
        } 根本打印不出。按RTC_TSR的地址去访问也不行。

    6. If RTC was enabled and not reinitialized do not reinitialize the RTC
    这一步要怎么做呢?

    我把这个LLWU ACKISO bit的处理放在读取RTC_TSR之前了。

    回复 支持 反对

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    20201
    最后登录
    2024-5-10
    发表于 2018-8-9 13:21:01 | 显示全部楼层
    bjx1234 发表于 2018-8-9 09:00
    复位后,不对RTC初始化,读不了RTC的寄存器啊。
    我的代码如下:
      //读取RTC_TSR

    复位后,先把SIM里面的RTC打开,然后读取,也读不出来吗?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-7-2 13:42
  • 签到天数: 31 天

    [LV.5]常住居民I

    12

    主题

    253

    帖子

    0

    高级会员

    Rank: 4

    积分
    576
    最后登录
    2020-4-7
     楼主| 发表于 2018-8-9 15:41:25 | 显示全部楼层
    本帖最后由 bjx1234 于 2018-8-9 15:46 编辑
    小恩GG 发表于 2018-8-9 13:21
    复位后,先把SIM里面的RTC打开,然后读取,也读不出来吗?

    一打开SIM_SCGC6_RTC_MASK,RTC_TSR就变成0了。想当于RTC重新初始化。建议你试验一下。最好给个例程啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    20201
    最后登录
    2024-5-10
    发表于 2018-8-10 09:46:05 | 显示全部楼层
    bjx1234 发表于 2018-8-9 15:41
    一打开SIM_SCGC6_RTC_MASK,RTC_TSR就变成0了。想当于RTC重新初始化。建议你试验一下。最好给个例程啊。
    ...

    你除了读TSR之外,是否还读了其他的RTC寄存器?
    另外,RTC_CR[SWR]你配置的是什么?
    你把RTC所有的寄存器都读一遍看看,是不是都是复位值?

    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-5-11 02:48 , Processed in 0.145452 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表