This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] LP-MSPM0G3507:如果用作周期性计时器、则在某些特定条件下复位 RTC 计时器。

Guru**** 2542820 points
Other Parts Discussed in Thread: SYSCONFIG

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1541114/lp-mspm0g3507-reset-rtc-timer-at-some-particular-condition-if-used-as-periodic-timer

器件型号:LP-MSPM0G3507
主题:SysConfig 中讨论的其他器件

工具/软件:

您好:

我已使用 RT1P0 预分频器并启用相应的 ISR 位将 RTC 配置为 15.6ms

我想重置此计时器并在另一个 ISR 例程中从 0 再次启动。 我找不到这个设置的任何特定寄存器。 您能在这里提供帮助吗?

此外、在运行期间、我想将 RTC 重新配置为 RT0P0 的另一个时间段是可能的。 我要注意的所有配置是什么?

我们有任何演示示示例吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    因此、您需要在软件中复位 RTC。  

    调用以下函数可以帮助您解决问题。

    DL_RTC_disableClockControl ()

    DL_RTC_Common_reset ()

    SYSCFG_DL_RTC_init ();

    DL_RTC_enableClockControl ();

    此致、

    现金好

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的答复。 但这不能解决我的问题  

    在下面的图像中、白色线表示->将执行 RTC 复位的外部中断。

                 棕色线->有 RTC 中断。

    当在白线上接收到中断信号时、我们期望 RTC 在 15.6ms 后复位并在棕色线路上生成中断 (或为 RTC 配置的时间)。但是、RTC 似乎不响应白线信号、提供的复位代码似乎无效。

    ...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    您能否在此处提供您的测试项目? 我可以对其运行一些测试。  

    此致、

    现金好

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    ...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    /******************* RTC interfaces ***************************************/
    
    RTC_config_s RTC_InitConfig  = {
                                    RTC_IP_RT1,
                                    RTC_RT1IP_1S,        // this prescaler is to be configured in RTC PSCTL register
    };
    
    
    void RTC_Init(void)  // this is called in initial power up 
    {
        // Reset RTC
        RTC->GPRCM.RSTCTL = (RTC_RSTCTL_KEY_UNLOCK_W | RTC_RSTCTL_RESETSTKYCLR_CLR | RTC_RSTCTL_RESETASSERT_ASSERT);
    
        // Power enable RTC
        RTC->GPRCM.PWREN = (RTC_PWREN_KEY_UNLOCK_W | RTC_PWREN_ENABLE_ENABLE);
    
        // Enable RTC clock
        RTC->CLKCTL = RTC_CLKCTL_MODCLKEN_ENABLE;
    
        // Configure RTC clock source
        RTC->GPRCM.CLKCFG = RTC_CLKCFG_KEY_UNLOCK_W | RTC_CLKCFG_BLOCKASYNC_ENABLE;
    
        RTC_Reconfig(RTC_InitConfig);
    
        // Clear and enable NVIC interrupt
        NVIC_ClearPendingIRQ(RTC_INT_IRQn);
        NVIC_EnableIRQ(RTC_INT_IRQn);
    
    }
    
    
    void RTC_Reconfig(RTC_config_s rtcReconfigData)
    {
    
        RTC_InitConfig.prescaler_interrupt = rtcReconfigData.prescaler_interrupt;
        RTC_InitConfig.timer_value = rtcReconfigData.timer_value;
    	
        if (rtcReconfigData.prescaler_interrupt == RTC_IP_RT0 || rtcReconfigData.prescaler_interrupt == RTC_IP_RT1) {
            RTC->PSCTL = rtcReconfigData.timer_value;  // Update prescaler
        }
    
        switch (rtcReconfigData.prescaler_interrupt) {
            case RTC_IP_RT0:
                // Enable RT0PS interrupt
                RTC->CPU_INT.IMASK = RTC_CPU_INT_IMASK_RT0PS_SET;
    
                // Disable RT1PS interrupt only if its MIS bit is set
                if (RTC->CPU_INT.MIS & RTC_CPU_INT_MIS_RT1PS_SET) 
                {
                    RTC->CPU_INT.IMASK &= ~RTC_CPU_INT_IMASK_RT1PS_SET;
                }
                break;
    
            case RTC_IP_RT1:
                // Enable RT1PS interrupt
                RTC->CPU_INT.IMASK = RTC_CPU_INT_IMASK_RT1PS_SET;
    
                // Disable RT0PS interrupt only if its MIS bit is set
                if (RTC->CPU_INT.MIS & RTC_CPU_INT_MIS_RT0PS_SET) {
                    RTC->CPU_INT.IMASK &= ~RTC_CPU_INT_IMASK_RT0PS_SET;
                }
                break;
    
            default:
                // Invalid interrupt type
                break;
        }
    }
    
    void RTC_IRQHandler(void)
    {
        Mode_Manager_Task(RTC_ISR);
    }
    
    void RTC_disableClockControl()
    {
        RTC->CLKCTL = RTC_CLKCTL_MODCLKEN_DISABLE;
    }
    
    void RTC_enableClockControl()
    {
        RTC->CLKCTL = RTC_CLKCTL_MODCLKEN_ENABLE;
    }
    
    void RTC_Common_reset()
    {
        RTC->GPRCM.RSTCTL = (RTC_RSTCTL_KEY_UNLOCK_W | RTC_RSTCTL_RESETSTKYCLR_CLR | RTC_RSTCTL_RESETASSERT_ASSERT);
    }
    
    
    void Reset_RTC_Timer()
    {
        RTC_disableClockControl();
        RTC_Common_reset();
        //RTC_ReInit_Timer(RTC_InitConfig ); // this will reinitialize RTC to 7.81 ms tick but currently not called
    }
    
    
    void RTC_ReInit_Timer(RTC_config_s rtc_reinit_s)
    {
        //RTC->GPRCM.RSTCTL = (RTC_RSTCTL_KEY_UNLOCK_W | RTC_RSTCTL_RESETSTKYCLR_CLR | RTC_RSTCTL_RESETASSERT_ASSERT);
    
        // Power enable RTC
        RTC->GPRCM.PWREN = (RTC_PWREN_KEY_UNLOCK_W | RTC_PWREN_ENABLE_ENABLE);
    
        // Enable RTC clock
        RTC->CLKCTL = RTC_CLKCTL_MODCLKEN_ENABLE;
    
        // Configure RTC clock source
        RTC->GPRCM.CLKCFG = RTC_CLKCFG_KEY_UNLOCK_W | RTC_CLKCFG_BLOCKASYNC_ENABLE;
    
        // Set default pre-scaler for 7.81 ms tick (assuming 32.768 kHz clock)
        RTC_Reconfig(rtc_reinit_s);
    
        // Clear and enable NVIC interrupt
        NVIC_ClearPendingIRQ(RTC_INT_IRQn);
        NVIC_EnableIRQ(RTC_INT_IRQn);
    
    
    }
    
    /**********************************************/
    
    Task_manager(RTC_ISR)
    
    void RTC_IRQHandler(void)
    {
        Mode_Manager_Task(RTC_ISR); // this will intiallty set at 1second. but once active stae RTC shall reset & reenable from 0 & ticking at 7.81 ms
    }
    
    ISR(isr_INTP0_LDC)
    {
        Mode_Manager_Task(LDC_ISR); // this will come at every 6.25ms
    }
    
    
    Mode_Manager_Task(ISR_source) // ISR source can be LDC or RTC depends on ISR exectution
    {
    
    	if( ISR_Source == RTC_ISR )
    	{
       `	// set Brown GPO to 1 
    	}
    	else
    	{
            // Set White GPO to 1
            SuspendAllInterrupts();
            Reset_RTC_Timer();    //reset the RTC
            RTC->CPU_INT.ICLR |= (RTC_CPU_INT_ICLR_RT0PS_CLR & RTC_CPU_INT_ICLR_RT1PS_CLR);
            RTC_ReInit_Timer(RTC_CurrentConfig); //reinit the RTC
            // Process LDC acquization
    		
    		// Aim is to execute LDC at every 6.25ms & if it comes reset the RTC so that it can start from fresh counter
    		// Distance between LDC ISR & RTC ISR for fresh execution shall be 7.81ms 
    		// RTC ISR will never came in normal conditions but we need it in case the LDC ISR is not coming ( due to hw limitation) 
    
    	}
    	ResumeAllInterrupts();
    
    //set Brown GPO to 0 
    //set White GPO to 0
    }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我错过了为 RTC_CurrentConfig 输入值、结果应该如下所示  

    RTC_CONFIG_s RTC_CurrentConfig ={
    RTC_IP_RT0
    RTC_RT0IP_7_81MS、//在 RTC 复位后要配置该预分频器
    };

    请检查并善意回复。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    明白。 我将浏览代码、  

    此致、

    现金好

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、对此有任何更新吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    很抱歉晚回复。 我最近不在办公室。 我们将在本周就这个主题提供反馈。 感谢您的理解!

    此致、

    现金好

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    很抱歉晚更新。  

    我运行了一些测试。 我可以将 RTC 模块复位并成功保存在下面的测试代码中。  

    e2e.ti.com/.../rtc_5F00_periodic_5F00_alarm_5F00_lfosc_5F00_standby.c

    它显示 RTC 模块在 RTC 启用到第一次 RTC 中断之间需要大约 8ms。 我不知道为什么。 但这看起来像是 RTC 模块所需的稳定延迟。  

    此致、

    现金好

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的答复、我们在使用 MCAL 时未使用 DL SysConfig 库、您能通过所有 DL_在函数内编写代码吗

    以便验证它们是否与电流相关。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Cash。从上图中、RTC 似乎已初始化 15ms、但 RTC 复位后的计时器 ISR 与 RTC ISR 之间的距离仅为 8ms。 这是不正确的。 由于我们正在复位 RTC、因此该距离的实际要求也应该为 15ms

    请您优先对此进行重新检查。 (在我的启动说明中,我提到 15ms ,但在代码中,我将 RTC 初始化为 7.81ms~ 8ms,可能是这导致了混淆。

    无论我们初始化 RTC 预分频器(例如 15ms ), RTC 重置后其他两个 ISR 之间的距离应与配置相同(即 15ms )。

    此外、从上图看来、即使在 RTC 复位后、RTC 计数器也没有复位

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    我使用第一个间隔的 8ms 运行更多测试。 似乎这 8ms 仅发生在 定期警报 1 上。  定期报警 0 正常、但未遇到此问题。 无论  为 定期报警 1 设置了什么时间段、第一个间隔总是缩小 8ms。  

    我还发现此 定期警报 1 (RT1PS) 来自 RT0PS 的 128Hz 时钟输出。 128Hz 与 7.8125ms 作为周期相关。 它非常接近我们观察到的延迟。  

    因此、我认为 RT1PS 的初始状态是 1、而不是 0、这是出于某种原因、导致这段时间在第一个时间间隔缩短。  

    我建议使用计时器而不是 RTC 来生成静态周期性信号。 我还将与团队核实这一行为。  

    此致、

    现金好

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢、问题在于我们正在根据要求使用待机模式。 在待机模式下、只有两个计时器可用 TIMG0 和 TIMG8、这些计时器已用于另一个优先用例、在某些模式生成中已占用。 因此、选项仅为 RTC。

    理想情况下、 我会寻找一些配置 设置来复位 RTC 计数器、使其从零开始。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您可以使用 的定期报警 0 来避免此问题。 我认为没有方法可以重置 RT1PS。 为了便于猜测、我认为在 RTC 模块的初始化期间、 RT0PS 128Hz 输出上会生成一个脉 冲、RT1PS 将该脉冲作为时钟源、计数到 1。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我已经尝试过 RTC_PSCTL_RT0IP_DIV256(除以 256 - 7.81ms )  但仍然有相同的问题,我无法重置它,而在重置后,第一个 ISR 总是小于我们配置的任何,在下面的情况下它 3mS。 因此仍然没有帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我在  RT0IP_DIV256 上没有看到这个问题。 按照预期、第一个间隔约为 7.8ms。 即使 RT0IP 也有相同的问题、并且从 1 开始计数、而不是从 0 开始计数。 我们很难观察到、因为其时钟源为 32768Hz、一个缺失周期约为 30us。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、这是在开始点、但如果我们将其复位并重新初始化、那么时间不会超过 7.8ms、但小于该值。 您还可以查看这种情况吗?