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.

[参考译文] CCS/MSP432P401R:RTC 计时错误

Guru**** 2582405 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/613649/ccs-msp432p401r-rtc-ticking-incorrectly

器件型号:MSP432P401R
主题中讨论的其他器件:MSPWARE

工具/软件:Code Composer Studio

您好!

我遇到了使用 GNU 编译器的 MSP432上的 RTC 问题。 RTC 正常计时、但我注意到一种奇怪的行为、只要分钟数或秒数超过40、就会恢复为0。 但是、在这些数字达到19后、它将返回到0并再次计数到40。 这意味着我的时钟节拍如下:0、1、2、38、39、0、1、2、18、19、0等。 这意味着它正在计数到60秒、但在一个奇怪的位置滚动。 此外、如果我将小时数设置为任何大于20的数字、则会丢弃2、并且仅显示第二个十进制数。 示例是将小时设置为23、当我调用 MAP_RTC_C_getCalendarTime()时、它会显示:Hours = 3。

我之前以为我已经通过调用 ROM_RTC_C_initCalendar ()而不是 MAP_RTC_C_initCalendar ()来修复了这个问题。 这是一段时间的修复、但现在它不再起作用(没有对代码进行任何更改)。  

请注意、rom_map.h 中的所有 ROM_XX 函数都是灰色的、因为 GNU 编译器不想识别编译期间设置的标志(-DTARGET_IS _MSP432P4XX)。 因此、没有任何具有#if defined (target_in_MSP432P4XX)的函数运行。 因此、如果我调用 MAP_XX、它将调用 XX 函数、而不是 ROM_XX 函数。 不确定这是否是导致 RTC 异常计数问题的原因、但可能是原因。 因此、如果我调用 MAP_RTC_C_initCalendar ()、那么 ROM_RTC_C_initCalendar ()将灰显、 而 RTC_C_initCalendar ()将被调用。  

要获得有关此问题的其他帮助,请运行以下代码:

RTC_C_Calendar CurrentTime =
{
0x46、//46秒
0x43、//43分钟
0x23、//23小时
0x01、//1周的一天
0x16、//16月的一天
0x05、//5个月
0x1955年/1955年
};
MAP_RTC_C_initCalendar (&CurrentTime、RTC_C_FORMAT_BCD);
RTC_C_Calendar 电流时间;
currenttime = ROM_RTC_C_getCalendarTime (); 

以当前时间返回的值如下:秒= 0x06、分钟= 0x03、小时= 0x03、每日每天= 0x01、 每日= 0x16、 月= 0x05、年= 0x1955。 将时钟设置为运行后、14秒后、秒将显示0、分钟将显示4。

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

    dev.ti.com/.../

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

    您好 Chris、

    我看到了这个示例。 我决定后退一步、只需从 MSPWARE 库加载示例。 RTC_c_calender_interrupt 示例。 出于某种原因、即使本示例使用 TI 编译器、我也会获得与之前完全相同的行为。 因此、如果我再次将0x45的值加载到 RTC 的分钟数中、它将仅存储为0x5。 如果即使是示例代码对我也不起作用、我也不太确定要从这里执行什么操作。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Jonathan、
    我不认为我看到同样的问题。 我可以看到 RTC 正在从0秒计数到59秒、然后按照我的预期滚动到0秒。 但是、警报功能不能按预期工作、正如您指出的、使用 API 将值加载到 RTC 中不会给出正确的值。 在我的情况下、RTC 从秒= 40而不是0开始、并且10:04的警报永远不会达到、即使看起来时间和分钟已由初始化 API 正确设置。 我将进一步探讨这一点、并尝试提供一些解决方案。

    此致、
    Chris

    电源 稍后、我将更改线程的标题以反映 RTC。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Chris、
    这非常有趣、因为正如我之前提到的、我的计数从0到40、然后再从0到20。 非常有趣、即使在23:44的时间、我也能够触发警报。 需要注意的是、当警报被触发时、RTC 将时间显示为3:04。 解决方案将会非常出色、因为我已经从包装箱中打开了一个全新的 MSP432 Launchpad、并且我在标准示例中遇到了同样的问题。

    请随意更改线程的标题、我通常是线程的新用户、直到我获得解决方案而不是发布到这里、但这里似乎还有其他一些我无法自行修复的问题。
    此致
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    e2e.ti.com/.../0245.rtc_5F00_c_5F00_calendar_5F00_alarm_5F00_test_5F00_01.c

    Jonathan、

     我仍在评估此内容、但预编译库看起来不正确。  我已删除 API 并替换为 SDK 中的源代码(1.40.01)。  如果您可以测试并确认它是否正常工作、我将不胜感激。  我已经在 CCS 和 GCC 编译器上进行了测试。

    谢谢、

    Chris

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

    您好 Chris、

    我测试了代码、并从中获得相同的结果。  

    if (!(iiConvertAll ==粘贴时间[i].seconds))
    {
    MAP_GPIO_toggleOutputOnPin (GPIO_PORT_P2、GPIO_PIN0);
    MAP_RTC_C_HOLDClock ();
    __no_operation();
    } 

    只要 iiConvertAll = 40且 Pasttime[i].seconds = 0、就会激活此处的此部件。 因此、基本而言、时钟仍在40秒时计时为0。 我还测试了是否调用了警报条件、如果我在时钟启动后将警报设置为1分钟(并停用上面的 HOLD_CLOCK)、则它会正常调用警报条件。 我还检查了加载到 RTC 中的时间(使用您的自定义加载策略)、如果加载时间为22:03:00、则显示时间为02:03:00、再次丢弃20小时。  

    我是否可能对电路板使用过时的 driverlib? 如果您说这对您来说很好、我不知道为什么会获得这些结果。

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

    Jonathan、

    我删除了 driverlib API、因此这不是问题。  您使用的是哪个版本的器件以及哪个版本的 driverlib?

    // map_rtc_initCalendar (&CurrentTime、RTC_C_format_BCD);

    RTC_C->CTL0 =(RTC_C->CTL0 &~RTC_C_CTL0_KEY_MASK)| RTC_C_KEY;

    BITBAND_PERI (RTC_C->CTL13、RTC_C_CTL13_HOLD_OFS)= 1;

    BITBAND_PERI (RTC_C->CTL13、RTC_C_CTL13_BCD_OFS)= 1;

    RTC_C->TIM0 =(CurrentTime.Minutes << RTC_C_TIM0_MIN_OFS)
    | currentTime.seconds;
    __no_operation();
    RTC_C->TIM1 =(CurrentTime.dayOfWeek << RTC_C_TIM1_DOW_OFS)
    | CurrentTime.hours;
    __no_operation();
    RTC_C->DATE =(CurrentTime.Month << RTC_C_DATE_MON_OFS)
    | CurrentTime.dayofmonth;
    __no_operation();
    RTC_C->year = CurrentTime.year;

    BITBAND_PERI (RTC_C->CTL0、RTC_C_CTL0_KEY_OFS)= 0;

    此致、
    Chris

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

    Chris、

    您是否认为 可能是 RTC_C_getCalendarTime()返回了不正确的值?

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

    Jonathan、

      我对该 API 没有任何问题。  我建议您在 上述代码初始化日历后查看调试器中的寄存器。  以下是我在使用 API 时与使用代码时看到的差异:

    请注意、在第二种使用 API 的情况下、BCD 寄存器中有40秒。 您使用的是哪个版本的器件?  我正在使用 MSP-EXP432P401R (红色 launchpad)的修订版 C 和修订版2.1。

    Chris

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

    您好 Chris、

    我使用的是 Launchpad 的修订版 C 和修订版2.1。 我已附上将时间设置为22h:03M:40s 时发生的情况的屏幕截图。 通过查看寄存器、我注意到 BCD 寄存器加载的值正确、但另一个寄存器不正确。 因此、RTCTIM0_BCD 寄存器正确加载40秒到高电平位和低电平位。 然而、RTCTIM0寄存器只需将一个值0载入其中。 虽然它表示存储的值为40秒、但实际寄存器读数不显示该值。 我在屏幕截图中为您突出显示了差异。

    时间也会发生完全相同的情况。 RTCTIM1寄存器声称已经加载了22个小时、然而当它被读取时、你可以很容易地看到值2已经被存储在其中。 然而、当高电平和低电平数字相加时、RTCTIM1_BCD 保持正确的时间。

    希望这能帮助 您找出问题所在。  

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

    我决定检查 RTC_C_getCalendarTime()函数。 我注意到在函数中获取 RTC_C->TIM0和0x3F 的秒数。 因此我将其更改为0xFF。 现在、我获得了秒、分钟和小时的正确值。 我为它编写的代码可在下面找到。 这与您的自定义加载功能一起似乎已完全解决了我的问题。

    //tempCal.seconds = RTC_C->TIM0 & RTC_C_TIM0_SEC_MASK;
    //tempCal.Minutes =(RTC_C->TIM0 & RTC_C_TIM0_min_MASK)>RTC_C_TIM0_MIN_OFS;//tempCal.hours
    = RTC_C->TIM0_MIN_MASK
    tempCal.seconds
    = 0xTIM0>TIM0_TIM0_RTC_TIM0_TIM0>TIM0<TIM0>和 TIM0_TIM0> TIM0<TIMT_RTC_TIM0> TIM0<TIM_TEXT_TEXT_RTC_TIM0>小时;/TIM0_TIM0_TIM0_TIM0_TIM0> TIM0_TIM0> TIM0_RT
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Jonathan。 我将针对这种情况提出一个错误。

    此致、
    Chris