• 正文
    • 1.看門狗中斷講解與測(cè)試
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

【經(jīng)驗(yàn)分享】Kinetis K 系列 WDOG 中斷檢測(cè)

02/05 09:48
497
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

寫這篇文檔的原因是,最近遇到一些客戶在使用 kineits K 系列的 WDOG 的時(shí)候,想用看門狗的中斷,但是又不會(huì)檢測(cè)到看門狗中斷,所以懷疑 K 系列的看門狗中斷不能工作。這篇文章就看門狗中斷問(wèn)題講解下,并且給出如何檢測(cè)到看門狗中斷的簡(jiǎn)單方法。

測(cè)試平臺(tái)基于 FRDM-K64 板子,代碼基于官方 SDK 代碼看門狗代碼,SDK 版本:SDK_2.2_FRDM-K64F,現(xiàn)在已經(jīng)更新到 SDK2.3,不過(guò)沒(méi)有關(guān)系,思想一樣的。SDK下載鏈接:https://mcuxpresso.nxp.com/en/welcome

選擇 select development board, 板子選擇 FRDM-K64,生成代碼下載代碼包。

看門狗工程路徑:SDK_2.2_FRDM-K64Fboardsfrdmk64fdriver_exampleswdog

1.看門狗中斷講解與測(cè)試

1.1 看門狗中斷講解

如果使能看門狗狀態(tài)控制寄存器 WDOG_STCTRLH 寄存器中的 IRQRSTEN 位, 一旦看門狗超時(shí)會(huì)首先產(chǎn)生一個(gè)中斷,緊接著會(huì)產(chǎn)生系統(tǒng)復(fù)位,下面的系統(tǒng)圖也說(shuō)明了這點(diǎn)。

看門中斷使能后,一旦看門狗滿足下面條件:

 

會(huì)置位看門狗中斷標(biāo)志 WDOG_STCTRLL[INFLG]位。這個(gè)位可以通過(guò)寫入 1 清除標(biāo)志位。產(chǎn)生中斷,然后緊接著產(chǎn)生看門狗復(fù)位。

2. 看門狗中斷產(chǎn)生測(cè)試

由于在 debug 狀態(tài)下,看門狗中斷之后會(huì)緊接著產(chǎn)生復(fù)位,所以不能通過(guò)在看門狗中斷服務(wù)函數(shù)中添加斷點(diǎn)的方式測(cè)試。下面在看門狗溢出產(chǎn)生看門狗中斷以及復(fù)位的條件下測(cè)試看門狗中斷??撮T狗的中斷通過(guò)在中斷中翻轉(zhuǎn) GPIO 以及寫入 RAM數(shù)組的方式去測(cè)試。

1) 看門狗中斷配置

測(cè)試代碼基于 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)添加看門狗測(cè)試代碼

unsigned int jjtest[10]=0;
void WDOG_EWM_IRQHandler()
{
GPIOB->PCOR |= 0X00400000;// Clear ptb22 pin
jjtest[1]=0x55; //write RAM
jjtest[2]=0xaa;
}
Main 函數(shù)中添加如下代碼: 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;

通過(guò)上面的配置,如果看門狗溢出之后,會(huì)進(jìn)入 WDOG_EWM_IRQHandler 中斷服務(wù)函數(shù)。在中斷服務(wù)函數(shù)中,拉低 PTB22 引腳,并且把 jjtest[1],[2]RAM 中刷入相應(yīng)的值,這樣測(cè)試,在系統(tǒng)復(fù)位后,但是沒(méi)有對(duì) RAM 初始化之前,可以查看數(shù)組的值來(lái)推斷上次復(fù)位之前看門狗中斷是否進(jìn)入過(guò)。

3 看門狗中斷進(jìn)入測(cè)試。

1)PTB22 引腳測(cè)試

通過(guò)上面的代碼配置可以知道,如果看門狗中斷進(jìn)入之后,原本拉高的 PTB22 引腳會(huì)被拉低。一旦復(fù)位之后,GPIO 引腳會(huì)默認(rèn)變?yōu)檩斎霠顟B(tài), 下面圖是PTB22 引腳的波形。

通過(guò)上面的圖可以證實(shí),原本拉高的 PTB22 在看門狗中斷產(chǎn)生后被拉低了,然后緊接著 PTB22 電平變了,一個(gè)處于輸入狀態(tài)的情況。通過(guò) PTB22 引腳被拉低,說(shuō)明看門狗中斷的確在復(fù)位之前進(jìn)入過(guò)了。

2)RAM 數(shù)組值測(cè)試

通過(guò)上面的代碼可以知道,jjtest 數(shù)組初始化是都被配置為 0 的,進(jìn)入 main 函數(shù)之后,看門狗配置前,數(shù)組值配置為:

jjtest[3]=0xcc;
jjtest[4]=0xdd;
在看門狗中斷中,會(huì)配置:
jjtest[1]=0x55;
jjtest[2]=0xaa;

下面是 debug 復(fù)位之后的數(shù)組值的情況:

可以看到,復(fù)位之后立刻查看看門狗數(shù)組,jjtest[1]=0x55,jjtest[2]=0xaa. 恰恰說(shuō)明看門狗中斷進(jìn)入過(guò)。

綜上,可以知道看門狗中斷的確是工作的,所以如果在實(shí)際使用中,可以在看門狗中斷中加上清除看門狗中斷標(biāo)志的代碼。

相關(guān)推薦

電子產(chǎn)業(yè)圖譜