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.

[参考译文] MSP430FR2155:RTC 在时钟切换期间挂起、并且可以't 重新启动

Guru**** 2609955 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1577160/msp430fr2155-rtc-hangs-during-clock-switching-and-can-t-be-restarted

器件型号:MSP430FR2155


您好、

我正在尝试创建一个失效防护例程、该例程在通常为 RTC 供电的 XT1 时钟发生故障时执行。

代码可以正常工作、成功地将 RTC 重新配置为 REFO、但 RTC 不会继续运行。 我发现,芯片的设计有一个问题(这里在第 11 页: www.ti.com/.../slaz722h.pdf ) ,我尝试了建议的解决方法,但它仍然不起作用。

下面是我执行重新配置的代码的一部分、以及建议的修复程序:

 

RTCCTL = 0;                  // Stop the RTC
RTCMOD = 64 - 1;             // Modulo register.

do{
    trash = RTCIV;           // Make sure RTCIV is empty.
}while(trash != 0);

RTCCTL = RTCSS_1 | RTCPS_6 | RTCSR | RTCIE; // Configure RTC for operation from ACLK (REFO) and reset the counters.

// Workaround from Errata
P2SEL0 &= ~BIT7; // Set XIN to GPIO function
P2SEL1 &= ~BIT7;

P2DIR |= BIT7; // XIN pin as output

P2OUT |= BIT7; // Toggle the pin 2x
P2OUT &= ~BIT7;
P2OUT |= BIT7;
P2OUT &= ~BIT7;


P2SEL0 &= ~(BIT6 | BIT7); // Set the crystal pins back for oscillator function.
P2SEL1 |= (BIT6 | BIT7);
 
 

 

已尝试修改解决方法:

  1. 在两次切换之间增加了 3ms 暂停。
  2. 多次切换引脚(高达 100x)。
  3. 对 XOUT 引脚执行上述所有操作、然后同时执行两者。
  4. 保持引脚配置为晶体并切换 P2OUT 位。

这对所有这些都没有帮助、RTC 总是会卡住。 要使其使用 ACLK 时钟、唯一方法是在 RTC 配置为 ACLK 后让晶体短暂运行、然后再次停止它。 但这就是在没有权变措施的情况下它的行为方式。

我有什么问题吗?

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

    首先我要检查的是:

    1) SYSCFG2:RTCCKSEL=1?

    2) ACLK 是否从 REFO 运行? (如果您有一个晶体,那么从晶体运行 ACLK 似乎是典型情况。)

    您如何判断 RTC 已失速?

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

    1) 是的。

    2) 也是。   CSCTL6 中的 XT1FAULTOFF 会被清除、以便在晶振出现故障时 ACLK 时钟自动从 XT1 切换到 REFO。 此外、我还通过 CSCTL4 = SELA_1 | SELMS_0;在写入 RTC 寄存器之前手动重新配置时钟。

    我知道 RTC 有问题、因为我也有一个从 ACLK 运行的计时器。 此计时器控制 LCD、如果它停止、显示屏将无法工作。 我在 RTC ISR 中使 LED 闪烁、当我用电阻器短接其中一个晶体的电容器时、闪烁停止、但 LCD 工作正常(除了时钟切换时出现短暂跳转之外)。

    当 RTC 从 REFO 返回到 XT1 时、转换是完美的。 我的问题被完美地描述为勘误表,但他们建议的修复对我来说不起作用的原因。

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

    【免责声明:我对这种情况没有任何特别的见解,尽管我可以看到变通办法的作用。】

    勘误表文本实际上没有这样说、但您可能会尝试移动 RTCSS_1 设置(即保留 RTCSS=0)、直到讨价还价 XIN GPIO。

    【编辑:轻微澄清。】

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

    不幸的是、这也不起作用。 我还尝试将 RTC 时钟源设置为 ACLK、没有先将 0 写入寄存器、并注释掉 RTCMOD = 64 - 1;。

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

    尊敬的 Jakub:

    我已经从我这边进行了测试。  

    我尝试短接外部晶体来监测 XT1 故障问题。 我发现 RTC 可通过勘误表中提供的权变措施恢复。

    下面是我用于测试此功能的代码、您能帮您测试吗? 并尝试再次切换 P2.7 次。 谢谢!

    e2e.ti.com/.../8883.main.c

    此致、

    Zoey

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

    您好、

    我想我找到了问题所在。 您的原始代码在大部分时间都能正常工作,但当我在 while(!( SFRIFG1 & OFIFG )) 之后添加一个延迟时,它开始断裂。 延迟越长、成功的机会就越小。 我的代码有这种延迟、因为当晶体发生故障时、我首先尝试再次配置振荡器引脚、然后等待大约 100ms、看看晶体是否恢复。 当我缩短等待时间时、它开始工作(尽管只有当 XOUT 电容器短路时、另一个电容器仍然挂起 RTC — 我使用 4.7k 电阻器)。 我似乎需要尽快重新配置 RTC、这可能是个问题、因为 MCU 大部分时间都处于 LPM3.5、因此无法立即通过 ISR 做出反应。

    它似乎我需要更多的工作,并尝试尽可能降低延迟,但它仍然不会 100%有效我恐怕..

    感谢你的帮助。

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

    尊敬的 Jakub:

    感谢您告诉我。  我只是想告诉你更多。 我认为 P2.7 需要切换两次的原因是模拟时钟输入、以便 RTC 可以基于这两个时钟将其自己的时钟源更改为内部时钟。

    也许在这种情况下、我们需要尽快重新配置和切换 PA2.7。

    此致、

    Zoey