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.
大家好、
我正在使用 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、实际上 并非如此。
我很高兴变通办法是可以的。 问题是:
谢谢。