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.

[参考译文] MSP430F6736:RTC_C:无法清除 RTCCTL1中的 RTCMODE 位

Guru**** 2563960 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/599215/msp430f6736-rtc_c-unable-to-clear-rtcmode-bit-in-rtcctl1

器件型号:MSP430F6736

您好!

我想在计数器模式下使用 MS430F6736的 RTC_C。 作为 TI DriverLib 的用户,我尝试通过 RTC_C_initCounter()函数配置 RTC 模块,并编写了几个自己的函数,如这个函数

HWREG8 (baseAddress + OFS_RTCCTL0_H)= RTCKEY;
HWREG8 (baseAddress + OFS_RTCCTL13_L)&= 0xDF;//(~RTCMODE);
HWREG8 (baseAddress + OFS_RTCCTL0_H)= 0x00; 

无论我做什么、RTCMODE 位仍然设置为"1"。 不用说 RTC 模块仍在日历模式下工作:-(

我出了什么问题? 还是这个 RTC 模块只支持日历模式?

TIA

Christoph

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

    您好、Christoph、

    我正在研究这个问题、并将尽快回复。  
     
    我将在板上尝试这个、 但我记得、很多 RTC 位在 LPM3.5模式下被保留、这意味着您必须先清除 LOCKLPM5、然后对它们的更改才会实际生效-您可能需要尝试清除代码顶部 PM5CTL0寄存器中的 LOCKLPM5位 只是为了确定吗? 我也将在板上尝试一下。

    此致、
    Katie

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

    遗憾的是、我可以确认 F67xx 器件中未实现计数器模式。 我将根据数据表进行归档、以便在所有 F67xx 数据表的 RTC_C 说明中非常明确地添加一条声明、指出这些器件上不提供计数器模式、以使其更清晰。

    您尝试在计数器模式下使用 RTC_C 执行什么操作? 如果需要,我们或许可以帮助您找到解决这一问题的方法。

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

    非常感谢您的澄清。 我只需要精确到第二个32位计数器作为时间戳。 MSP430 RTC 可能有一个 Calendar2Second()和/或 Second2Calendar()函数吗?


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

    日历模式包括一直到第二个的信息。 但是、听起来您需要2^32秒作为最大计数。 这是硬最大值吗?

    如果在日历模式中读取 RTCTIM0和 RTCTIM1寄存器、它们各为16位、因此总共32位。 RTCTIM0将为您提供秒和分钟、RTCTIT2将提供小时和周中某天。 但是、我知道这不是真正的32位、因为例如 RTCMIN 在60时回滚、所以它实际上不使用 RTCTIM0寄存器一半 RTCSEC 的全部8位、依此类推其他寄存器。 仅使用这些 RTCTIM0 (RTCSEC + RTCMIN)和 RTCTIM1 (RTCHOUR + RTCDOW)寄存器的日历模式的真正最大计数实际上将更接近16位数据、因为每个寄存器中都有浪费的位。

    因此、如果您确实需要32位数据的持续时间、那么您还需要使用 RTCDATE 和 RTCYEAR 寄存器来获得尽可能多的数据位。

    很遗憾、我不知道 calendarToSecond ()函数、但这是一个好主意、所以我将向拥有 driverlib 的团队提供反馈。 我想您必须创建自己版本的此函数、该函数从日历寄存器中读取数据、并对其进行排列以获得32位秒数值。

    我想我的最后一个问题是、您的数据是否必须采用32位秒格式、或者您是否可以使用一些额外的位来存储数据、以便您可以将原始日历数据用作时间戳? 我可以考虑您需要特定位数来进行时间戳的情况(例如、与需要此格式的另一个器件进行通信)、但如果这是您仅在内部记录的内容、可能无关紧要、您可以使用原始数据。

    请告诉我、我们是否可以做更多的事情来提供帮助。

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

    非常感谢您的回复。 正如您已经提到的、我的应用需要一个真正的32位"从 epoch 起的秒"计数器。 因此我编写了自己的 Calendar2Seconds()和 Seconds2Calendar()函数。


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

    您好、 Christoph、

    我恰好处于同一个鞋底。 您是否想为 Calendar2Seconds ()函数共享代码? 如果你这么做、我将完全理解。

    谢谢、

    志勇