• 正文
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

【经验分享】Kinetis K 系列 WDOG 中断检测

02/05 09:48
1141
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

写这篇文档的原因是,最近遇到一些客户在使用 kineits K 系列的 WDOG 的时候,想用看门狗的中断,但是又不会检测到看门狗中断,所以怀疑 K 系列的看门狗中断不能工作。这篇文章就看门狗中断问题讲解下,并且给出如何检测到看门狗中断的简单方法。

测试平台基于 FRDM-K64 板子,代码基于官方 SDK 代码看门狗代码,SDK 版本:SDK_2.2_FRDM-K64F,现在已经更新到 SDK2.3,不过没有关系,思想一样的。SDK下载链接:https://mcuxpresso.nxp.com/en/welcome

选择 select development board, 板子选择 FRDM-K64,生成代码下载代码包。

看门狗工程路径:SDK_2.2_FRDM-K64Fboardsfrdmk64fdriver_exampleswdog

1.看门狗中断讲解与测试

1.1 看门狗中断讲解

如果使能看门狗状态控制寄存器 WDOG_STCTRLH 寄存器中的 IRQRSTEN 位, 一旦看门狗超时会首先产生一个中断,紧接着会产生系统复位,下面的系统图也说明了这点。

看门中断使能后,一旦看门狗满足下面条件:

 

会置位看门狗中断标志 WDOG_STCTRLL[INFLG]位。这个位可以通过写入 1 清除标志位。产生中断,然后紧接着产生看门狗复位。

2. 看门狗中断产生测试

由于在 debug 状态下,看门狗中断之后会紧接着产生复位,所以不能通过在看门狗中断服务函数中添加断点的方式测试。下面在看门狗溢出产生看门狗中断以及复位的条件下测试看门狗中断。看门狗的中断通过在中断中翻转 GPIO 以及写入 RAM数组的方式去测试。

1) 看门狗中断配置

测试代码基于 K64 的 SDK WDOG 看门狗, 配置代码如下:

void WDOG_GetDefaultConfig(wdog_config_t *config)
{
assert(config);
config->enableWdog = true;
config->clockSource = kWDOG_LpoClockSource;
config->prescaler = kWDOG_ClockPrescalerDivide1;
#if defined(FSL_FEATURE_WDOG_HAS_WAITEN) && FSL_FEATURE_WDOG_HAS_WAITEN
config->workMode.enableWait = true;
#endif /* FSL_FEATURE_WDOG_HAS_WAITEN */
config->workMode.enableStop = false;
config->workMode.enableDebug = true;//false
config->enableUpdate = true;
config->enableInterrupt = true;//false

config->enableWindowMode = false;
config->windowValue = 0U;
config->timeoutValue = 0xFFFFU;
}
WDOG_GetDefaultConfig(&config);
config.timeoutValue = 0x7ffU;
/* wdog refresh test in none-window mode */
PRINTF("rn--- None-window mode refresh test start---rn");
WDOG_Init(wdog_base, &config);
EnableIRQ(Watchdog_IRQn);
WaitWctClose(wdog_base);
for (uint32_t i = 0; i < 10; i++)
{
WDOG_Refresh(wdog_base);
PRINTF("--- Refresh wdog %d time ---rn", i + 1);
while (GetTimerOutputValue(wdog_base) < (config.timeoutValue >> 3U))
{
}
}

2)添加看门狗测试代码

unsigned int jjtest[10]=0;
void WDOG_EWM_IRQHandler()
{
GPIOB->PCOR |= 0X00400000;// Clear ptb22 pin
jjtest[1]=0x55; //write RAM
jjtest[2]=0xaa;
}
Main 函数中添加如下代码: PTB22 配置为输出引脚,并且在看门狗配置之前拉高
PORTB->PCR[22] = PORT_PCR_MUX(1) | PORT_PCR_PE_MASK | PORT_PCR_PS_MASK;
GPIOB->PDDR |= 0X00400000;
GPIOB->PSOR |= 0X00400000;
jjtest[3]=0xcc;
jjtest[4]=0xdd;

通过上面的配置,如果看门狗溢出之后,会进入 WDOG_EWM_IRQHandler 中断服务函数。在中断服务函数中,拉低 PTB22 引脚,并且把 jjtest[1],[2]RAM 中刷入相应的值,这样测试,在系统复位后,但是没有对 RAM 初始化之前,可以查看数组的值来推断上次复位之前看门狗中断是否进入过。

3 看门狗中断进入测试。

1)PTB22 引脚测试

通过上面的代码配置可以知道,如果看门狗中断进入之后,原本拉高的 PTB22 引脚会被拉低。一旦复位之后,GPIO 引脚会默认变为输入状态, 下面图是PTB22 引脚的波形。

通过上面的图可以证实,原本拉高的 PTB22 在看门狗中断产生后被拉低了,然后紧接着 PTB22 电平变了,一个处于输入状态的情况。通过 PTB22 引脚被拉低,说明看门狗中断的确在复位之前进入过了。

2)RAM 数组值测试

通过上面的代码可以知道,jjtest 数组初始化是都被配置为 0 的,进入 main 函数之后,看门狗配置前,数组值配置为:

jjtest[3]=0xcc;
jjtest[4]=0xdd;
在看门狗中断中,会配置:
jjtest[1]=0x55;
jjtest[2]=0xaa;

下面是 debug 复位之后的数组值的情况:

可以看到,复位之后立刻查看看门狗数组,jjtest[1]=0x55,jjtest[2]=0xaa. 恰恰说明看门狗中断进入过。

综上,可以知道看门狗中断的确是工作的,所以如果在实际使用中,可以在看门狗中断中加上清除看门狗中断标志的代码。

相关推荐

电子产业图谱