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.

[参考译文] MSP430FR2676:定时器中断在看门狗复位后执行

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/848788/msp430fr2676-timer-interrupt-executes-after-watchdog-reset

器件型号:MSP430FR2676

我有一个使用大量外设的应用程序、其中包括一个定期调用处理程序的计时器。  如果没有看门狗复位、则一切都按预期运行。

如果我注释掉馈入看门狗的代码、其余代码会在预期的延迟之后发生、但 MSP430似乎并不是真正执行计时器外设的"完全"复位。  看门狗复位后 、TA0_TA0CCTL0包含0x01值。  这表明定时器中断(TAIE)标志已经像应该那样被正确清除、但是中断标志(TAIFG)被置位、这表示一个挂起的中断!

我该怎么做才能清除看门狗复位前可能已经挂起/有效的所有中断、以便在应用程序初始化之前无法执行我的中断处理程序?

伪代码:

void main()
{
//(看门狗复位后从不到达这里)

//初始化应用程序数据(指针初始化、堆分配等...)

//初始化看门狗
ROM_WDT_A_initWatchdogTimer (WDT_A_base、WDT_A_CLOCKSOURCE_SMCLK、WDT_A_CLOCKDIVIDER_8192K);
ROM_WDT_A_START (WDT_A_BASE);

//初始化其他外设,包括硬件计时器

对于(;)
{
//源看门狗
ROM_WDT_A_resetTimer (WDT_A_base);
}
}

void timerInterruptHandler()
{
//访问应用程序数据
,在调用该数据之前必须对其进行初始化,或应用程序崩溃} 

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

    TAIE 是定时器中断使能。 如果该位在复位期间被清零并且从未重新配置、那么您的定时器将不再处理中断。 如果您不处于连续计数模式、定时器将向上计数或向下计数到其指定值、设置 TAIFG 以指示该值、然后不执行任何操作。

    首先、我要确保您在从复位返回后正确配置中断。

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

    >  如果该位在复位期间被清零且从未重新配置、则定时器将不再处理中断。

    这不是我看到的。  仅设置 TAIFG 时、在达到计时器初始化代码之前、将连续调用计时器处理程序。

    我的初始化序列很尴尬、因为我也在使用 LPM3.5。  在启动时、实时时钟的初始化和服务极少、这需要以最低功耗完成。  如果它决定需要唤醒以继续运行应用、则会初始化更多外设、包括此硬件计时器。

    这意味着、在显式配置计时器之前、我将启用中断来为实时时钟提供服务。  这与看门狗复位后仍然置位的 TAIFG 相结合、似乎造成了这个问题。

    回到我原来的问题:  在看门狗复位之前、我可以做什么来清除所有可能已经挂起/有效的中断、以便在应用程序初始化之前、我的中断处理程序不能执行?

    是否有一种方便的方法来清除所有挂起的中断(针对所有外设)、或者在启用中断之前、我是否必须显式清除系统中的每个挂起的中断标志?

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

    如果不详细了解代码和启动顺序、很难判断导致问题的原因。 您在启动过程中启用了哪些时钟中断?您如何启用这些中断?

    我确信、您可以一次性启用/禁用所有中断、但我不知道如何一次性清除每个外设控制寄存器中的每个中断挂起标志。

    在我的应用中、我需要 UART 中断、但不希望 SPI 中断。 为此、我在该外设的控制寄存器内设置中断使能。 如果您使用的是更一般的东西、比如  

    _bis_SR_register (LPM3_bits | GIE); 

    那么、行为可能会有所不同、但除非控制寄存器明确启用、否则我实际上不会在任何外设中发生中断。

    另一个需要注意的想法是、如果由 WDT 超时触发的复位类型不会清除外设的寄存器配置。 这可能会解释您为什么仍会获得计时器中断。 我对复位和 LPM 不是很熟悉、因此我无法真正谈论这一点。

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

    看门狗的文档(在用户指南和数据表中)非常简单、尤其是与我之前对 Tiva 器件的使用相比。  我对我所看到的行为感到惊讶、但不确定它真正的预期/设计目标是什么。

    在启动时显式清除每个外设的控制寄存器(类似于下面的行、但对每个外设重复)似乎可以正常工作、但这正是我希望避免的。  我假设必须有更好的方法、或者我错误地设置了看门狗。

    HWREG16 (TIMER_A0_BASE + OFS_TAxCTL)= 0;

    我最初的问题的最终答案可能是"否"。  在看门狗复位后、将 MSP430重新置于"初始"状态是没有方便的方法的、因此需要采取特殊步骤、在启动时将配置显式设置为所需的状态、以防发生这种情况。

    无论如何、感谢您的帮助。

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

    CCIFG 不是由 PUC 复位、而是由 POR 复位。 [参考用户指南(SLAU445I)图13-18.] 大多数 Timer A 寄存器都是这样。

    该键位于用户指南表0-1中、其中括号表示"通过 POR 以这种方式设置"、意思是不通过 PUC。

    处理此问题意味着让器件初始化将器件置于已知状态、并在设置 GIE 之前进行初始化。 您不需要详尽地执行此操作、只需处理代码已使用的内容、因为其他内容在上一次 POR 时处理。  

    除其他外、在设置各自的 IES 之前、始终清除(过期) IFG。 对于 TA0CCTL1、这意味着使用"="而不是"|="。