请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP430F2618 您好!
是否存在看门狗卡住时无法重新启动 MCU 的边沿情况?
我要求的原因是、我们的器件在某种奇怪的状态下锁定、看门狗不会重启。
当器件最终处于此状态时、如果我们在 Code Composer Studio 中暂停、它看起来好像 PC 寄存器没有更改其值、而它停留在上的行似乎位于 watchdog_refresh() on 内
WDTCTL = WDTPW + WDTNMI + WDTTMSEL + WDTCNTCL + WDTSSEL;
有时、它会在几个小时内卡住、有时在几天内卡住、但当存在大量中断时、它的发生速度似乎更快-例如通过 UART 接收数据。 如果器件正在处理另一个中断、WDT 能否复位器件? 我们是否可以采取措施来避免这种情况?
/**
* Initialize Watchdog
*/
inline void watchdog_init()
{
// WDTPW - Enter password (without password device will reset)
// WDTHOLD = 0 - Watchdog timer+ is not stopped
// WDTNMIES = 0 - This bit selects the interrupt edge for the NMI interrupt when WDTNMI = 1
// WDTNMI = 1 - NMI function
// WDTTMSEL = 0 - Watchdog mode
// WDTCNTCL = 1 - Watchdog timer+ counter clear.
// WDTSSEL = 1 - ACLK set at 12kHz (from 4kHz to 22kHz - internal oscillator) see Clk_init()
// WDTISx = 00 - Watchdog clock source /32768 -> ~ 2.7s [1.5s - 8.2s]
WDTCTL = WDTPW + WDTNMI + WDTTMSEL + WDTCNTCL + WDTSSEL;
// NMI interrupt enable. This bit enables the NMI interrupt.
IE1 |= NMIIE;
IE1 |= WDTIE;
}
/**
* Refreshes watchdog.
*/
inline void watchdog_refresh()
{
WDTCTL = WDTPW + WDTNMI + WDTTMSEL + WDTCNTCL + WDTSSEL;
}
inline void watchdog_stop()
{
WDTCTL = WDTPW + WDTHOLD;
}
void Clk_init()
{
BCSCTL1 = CALBC1_1MHZ;
BCSCTL1 |= DIVA_0; // Divider for ACLK /1
DCOCTL = CALDCO_1MHZ; // DCO = 1 MHz
BCSCTL2 |= DIVS_1; // SMCLK = DCO/2 -> 500 kHz
// Low-frequency clock select and LFXT1 range select. These bits select between LFXT1 and VLO when XTS = 0,
// and select the frequency range for LFXT1 when XTS = 1
BCSCTL3 |= LFXT1S1;
IFG1 = 0;
/* Wait for the crystal to settle. */
do
{
/* Clear the fault flag. */
IFG1 &= ~OFIFG;
}
while (IFG1 & OFIFG);
}