主题:SysConfig 中讨论的其他器件
工具/软件:
您好:
我已使用 RT1P0 预分频器并启用相应的 ISR 位将 RTC 配置为 15.6ms
我想重置此计时器并在另一个 ISR 例程中从 0 再次启动。 我找不到这个设置的任何特定寄存器。 您能在这里提供帮助吗?
此外、在运行期间、我想将 RTC 重新配置为 RT0P0 的另一个时间段是可能的。 我要注意的所有配置是什么?
我们有任何演示示示例吗?
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.
工具/软件:
您好:
我已使用 RT1P0 预分频器并启用相应的 ISR 位将 RTC 配置为 15.6ms
我想重置此计时器并在另一个 ISR 例程中从 0 再次启动。 我找不到这个设置的任何特定寄存器。 您能在这里提供帮助吗?
此外、在运行期间、我想将 RTC 重新配置为 RT0P0 的另一个时间段是可能的。 我要注意的所有配置是什么?
我们有任何演示示示例吗?
/******************* 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 模块复位并成功保存在下面的测试代码中。
e2e.ti.com/.../rtc_5F00_periodic_5F00_alarm_5F00_lfosc_5F00_standby.c


它显示 RTC 模块在 RTC 启用到第一次 RTC 中断之间需要大约 8ms。 我不知道为什么。 但这看起来像是 RTC 模块所需的稳定延迟。
此致、
现金好
大家好、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 来生成静态周期性信号。 我还将与团队核实这一行为。
此致、
现金好