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.

[参考译文] MSP430FR5994:RTC 中断向量优先级

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/977704/msp430fr5994-rtc-interrupt-vector-priority

器件型号:MSP430FR5994

大家好、  

我正在使用 RTC、但在理解 RTCIV 的优先级时遇到问题。  我的代码会将时间发送到显示器、但速度慢了一分钟。  我已将其跟踪为事件中断(发送时间的每一分钟)、在就绪中断之前执行(在 RTCRDY 中、更新时间)。  我本来以为 RTCRDYIFG 的优先级比 RTCEVIFG 高、但在一分钟的翻转时间内、这两个位都将被置位(根据用户手册中的图29-1)。   

#pragma vector = RTC_Vector
_中断 void RTC_ISR (void)
{
switch (__event_in_range (RTCIV、16))
{
案例 RTCIV_NONE:中断; //无中断
案例 RTCIV_RTCOFIFG:中断; //RTCOFIFG -故障。
RTCIV__RTCRDYIFG 案例: //RTCRDYIFG -在1Hz 寄存器更新后触发。
//更新 RTC 内部时间的最安全点
sRtcTime.seconds = HWREG8 (RTC_C_base + OFS_RTCTIM0_L);
sRtcTime.minutes = HWREG8 (RTC_C_base + OFS_RTCTIM0_H);
sRtcTime.hours = HWREG8 (RTC_C_base + OFS_RTCTIM1_L);
sRtcTime.DayOfWeek = HWREG8 (RTC_C_BASE + OFS_RTCTIM1_H);
sRtcTime.dayofmonth = HWREG8 (RTC_C_base + OFS_RTCDATE_L);
sRtcTime.Month = HWREG8 (RTC_C_base + OFS_RTCDATE_H);
sRtcTime.Year = HWREG16 (RTC_C_base + OFS_RTCYEAR);
Task_SysTK_1s.flag = true;
APP_WAKEUP;
中断;
案例 RTCIV_RTCTEVIFG: //RTCEVIFG -每分钟中断一次
Task_MinuteTick.flag = true;
APP_WAKEUP;
中断;
中断;
案例 RTCIV_RTCAIFG:中断;
案例 RTCIV_RT0PSIFG:中断;
案例 RTCIV_RT1PSIFG:中断;
默认值:break;
}
} 

在主循环中、它会检查是否设置了 Task_MinuteTick、并将 sRtcTime (日历)复制到另一个实例并将其发送到。  我可以看到、在 GPIO 切换的情况下、EVIFG 在 RTCRDY 之前的运行时间为3.9-4ms、但我认为这是另一种方法吗?   

我有一个权变措施、但我想知道我是否误解了中断矢量的工作方式。

谢谢、

Michael。  

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

    我认为这一点的关键在于用户指南(SLAU367P)第29.2.5节。 RTCRDY 实际上不是一秒触发、但每秒触发一次。 一旦 CPU 和 RTC 时钟同步编辑、它在一秒转换后的 RTCRDY 上升沿(128/32768)=~4ms 触发 严格地说、在 RTCEVIFG 触发期间、您可能不应该(也不应该)读取 RTC 寄存器、因为我希望 RTCRDY = 0。

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

    啊,当然,谢谢! 这是有道理的、是的、我知道保留窗口、所以只需在 rtcrdy 上读取时间、但从未点击过、这意味着事件 IRQ 将首先发生、我也在图29-1中看到它。  我过于关注用户指南、说 RTCRDY 的优先级高于 RTCEV、实际上 并非如此。  

    我很高兴变通办法是可以的。 问题是:

    • RTC 从10:10:59回滚到10:11:00。   
    • 1Hz 输出(RT1PS Q6)在设置 RDY 中断之前通过3.9ms 延迟块
    • 同时、在3.9ms 后、会触发分钟事件中断 RTCEV、它将绕回主循环并安全地复制用户界面的时间(从安全副本 sRtcTime 中复制10:10:59、在复制时禁用 IRQ)。
    • 3.9ms 后、时间 sRtcTime 更新为10:11:00、但到那时太晚了。 因此 UI 显示始终会慢一分钟
    • 权变措施是仅在 RTCEV Minute 中断中设置静态标志、然后检查/清除 RTCRDY 中断中的标志、仅在时间更新后设置 Task_MinuteTick.flag。  

    谢谢。