1)實(shí)驗(yàn)平臺:正點(diǎn)原子stm32f103戰(zhàn)艦開發(fā)板V4
2)平臺購買地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套實(shí)驗(yàn)源碼+手冊+視頻下載地址: http://www.openedv.com/thread-340252-1-1.html#
第十五章 窗口看門狗實(shí)驗(yàn)
本章介紹APM32F407窗口看門狗(WWDT)的使用,窗口看門狗與獨(dú)立看門狗一樣能夠幫助CPU在進(jìn)入錯誤狀態(tài)或程序跑飛時進(jìn)行復(fù)位,不過窗口看門狗相對于獨(dú)立看門狗限制了“喂狗”的最小間隔,若兩次“喂狗”的間隔太短,一樣會產(chǎn)生復(fù)位。通過本章的學(xué)習(xí),讀者將學(xué)習(xí)到WWDT的使用。
本章分為如下幾個小節(jié):
15.1 硬件設(shè)計(jì)
15.2 程序設(shè)計(jì)
15.3 下載驗(yàn)證
15.1 硬件設(shè)計(jì)
15.1.1 例程功能
- 程序運(yùn)行后,點(diǎn)亮LED0等待300毫秒后開啟窗口看門狗,后進(jìn)入死循環(huán)等待窗口看門狗的中斷在窗口看門狗的中斷服務(wù)函數(shù)中執(zhí)行喂狗和翻轉(zhuǎn)LED1狀態(tài)的操作,能觀察到的現(xiàn)象為LED0在程序啟動時閃爍一下,隨后LED1不停閃爍
15.1.2 硬件資源 - LED
LED0 - PF9
LED1 - PF10 - 窗口看門狗
15.1.3 原理圖
本章實(shí)驗(yàn)使用的窗口看門狗為APM32F407的片上資源,因此并沒有相應(yīng)的連接原理圖。
15.2 程序設(shè)計(jì)
15.2.1 Geehy標(biāo)準(zhǔn)庫的WWDT驅(qū)動
本章實(shí)驗(yàn)使用到了WWDT的提前喚醒中斷,提前喚醒中斷指的是WWDT在“喂狗”超時即將進(jìn)行復(fù)位前由WWDT產(chǎn)生的中斷,本章實(shí)驗(yàn)就在WWDT的提前喚醒中斷服務(wù)函數(shù)中進(jìn)行“喂狗”。在使用WWDT前,需要先對其進(jìn)行初始化,在初始化中,需要使能WWDT并配置WWDT的預(yù)分頻系數(shù)和窗口值,還要進(jìn)行使能WWDT中斷的相關(guān)操作,具體的步驟如下:
①:使能WWDT
②:配置WWDT預(yù)分頻系數(shù)
③:配置WWDT窗口值
④:使能WWDT的提前喚醒中斷
⑤:使能WWDT中斷,并配置其相關(guān)的中斷優(yōu)先級
⑥:在WWDT提前喚醒中對其進(jìn)行“喂狗”
在Geehy標(biāo)準(zhǔn)庫中對應(yīng)的驅(qū)動函數(shù)如下:
①:使能WWDT
該函數(shù)用于使能WWDT,其函數(shù)原型如下所示:
void WWDT_Enable(uint8_t counter);
該函數(shù)的形參描述,如下表所示:
表15.2.1.1 函數(shù)WWDT_Enable()形參描述
該函數(shù)的返回值描述,如下表所示:
表15.2.1.2 函數(shù)WWDT_Enable()返回值描述
該函數(shù)的使用示例,如下所示:
#include "apm32f4xx.h"
#include "apm32f4xx_wwdt.h"
void example_fun(void)
{
/* 使能WWDT */
WWDT_Enable(0x7F);
}
②:配置WWDT預(yù)分頻系數(shù)
該函數(shù)用于配置WWDT的預(yù)分頻系數(shù),預(yù)分頻系數(shù)決定了WWDT計(jì)數(shù)的快慢,其函數(shù)原型如下所示:
void WWDT_ConfigTimebase(WWDT_TIME_BASE_T timeBase);
該函數(shù)的形參描述,如下表所示:
表15.2.1.3 函數(shù)WWDT_ConfigTimebase()形參描述
該函數(shù)的返回值描述,如下表所示:
返回值 描述
無 無
表15.2.1.4 函數(shù)WWDT_ConfigTimebase()返回值描述
該函數(shù)的使用示例,如下所示:
#include "apm32f4xx.h"
#include "apm32f4xx_wwdt.h"
void example_fun(void)
{
/* 配置WWDT的預(yù)分頻系數(shù)
* WWDT的計(jì)數(shù)時鐘為(PCLK1/4096)/8
*/
WWDT_ConfigTimebase(WWDT_TIME_BASE_8);
}
③:配置WWDT窗口值
該函數(shù)用于配置WWDT的窗口值,在WWDT的計(jì)數(shù)值減少到窗口值之前進(jìn)行“喂狗”,將為導(dǎo)致WWDT復(fù)位,其函數(shù)原型如下所示:
void WWDT_ConfigWindowData(uint8_t windowData);
該函數(shù)的形參描述,如下表所示:
形參 描述
windowData WWDT的窗口值
表15.2.1.5 函數(shù)WWDT_ConfigWindowData()形參描述
該函數(shù)的返回值描述,如下表所示:
返回值 描述
無 無
表15.2.1.6 函數(shù)WWDT_ConfigWindowData()返回值描述
該函數(shù)的使用示例,如下所示:
#include "apm32f4xx.h"
#include "apm32f4xx_wwdt.h"
void example_fun(void)
{
/* 配置WWDT窗口值 */
WWDT_ConfigWindowData(0x5F);
}
④:使能WWDT提前喚醒中斷
該函數(shù)用于使能WWDT的提前喚醒中斷,其函數(shù)原型如下所示:
void WWDT_EnableEWI(void);
該函數(shù)的形參描述,如下表所示:
形參 描述
無 無
表15.2.1.7 函數(shù)WWDT_EnableEWI()形參描述
該函數(shù)的返回值描述,如下表所示:
返回值 描述
無 無
表15.2.1.8 函數(shù)WWDT_EnableEWI()返回值描述
該函數(shù)的使用示例,如下所示:
#include "apm32f4xx.h"
#include "apm32f4xx_wwdt.h"
void example_fun(void)
{
/* 使能WWDT提前喚醒中斷 */
WWDT_EnableEWI();
}
⑤:配置WWDT中斷
請見第12.2.3小節(jié)中配置中斷的相關(guān)內(nèi)容。
⑥:配置WWDT的計(jì)數(shù)值
該函數(shù)用于配置WWDT的計(jì)數(shù)值,也就是所謂的“喂狗”,其函數(shù)原型如下:
void WWDT_ConfigCounter(uint8_t counter);
該函數(shù)的形參描述,如下表所示:
形參 描述
counter WWDT的計(jì)數(shù)值
表15.2.1.9 函數(shù)WWDT_ConfigCounter()形參描述
該函數(shù)的返回值描述,如下表所示:
返回值 描述
無 無
表15.2.1.10 函數(shù)WWDT_ConfigCounter()返回值描述
該函數(shù)的使用示例,如下表所示:
#include "apm32f4xx.h"
#include "apm32f4xx_wwdt.h"
void example_fun(void)
{
/* 配置WWDT的計(jì)數(shù)值(喂狗) */
WWDT_ConfigCounter(0x7F);
}
15.2.2 看門狗驅(qū)動
本章實(shí)驗(yàn)的看門狗驅(qū)動主要負(fù)責(zé)向應(yīng)用層提供WWDT的初始化函數(shù),并實(shí)現(xiàn)WWDT的提前喚醒中斷服務(wù)函數(shù),在WWDT的提前喚醒中斷服務(wù)函數(shù)中執(zhí)行“喂狗”操作。本章實(shí)驗(yàn)中,看門狗的驅(qū)動代碼包括wdt.c和wdt.h兩個文件。
看門狗驅(qū)動中WWDT的初始化函數(shù),如下所示:
/**
* @brief 窗口看門狗初始化
* @param tr: 計(jì)數(shù)器數(shù)值
* @param tw: 窗口值
* @param fprer: 時基預(yù)分頻系數(shù),WWDT_TIME_BASE_1~WWDT_TIME_BASE_8
* Fwwdt = (PCLK1 / 4096) / (2^fprer)
* @retval 無
*/
void wwdt_init(uint8_t tr, uint8_t wr, uint32_t fprer)
{
RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_WWDT); /* 使能WWDT時鐘 */
WWDT_Enable(tr); /* 使能窗口看門狗并設(shè)置計(jì)數(shù)器數(shù)值 */
WWDT_ConfigTimebase((WWDT_TIME_BASE_T)fprer); /* 配置時基預(yù)分頻系數(shù) */
WWDT_ConfigWindowData(wr); /* 設(shè)置窗口值 */
wwdt_counter = tr;
WWDT_EnableEWI(); /* 使能提前喚醒中斷 */
NVIC_EnableIRQRequest(WWDT_IRQn, 2, 0); /* 使能中斷 */
}
從上面的代碼中可以看出,WWDT的初始化函數(shù)中除了使能了WWDT的時鐘外,還分別執(zhí)行了使能WWDT、配置WWDT的預(yù)分頻系數(shù)和窗口值、使能WWDT的提前喚醒中斷和使能WWDT中斷的操作。隨后,在WWDT計(jì)數(shù)值減少到0x40時,將會產(chǎn)生提前喚醒中斷。
看門狗驅(qū)動中,WWDT提前喚醒中斷的中斷服務(wù)函數(shù),如下所示:
/**
* @brief 窗口看門狗提前喚醒中斷服務(wù)函數(shù)
* @param 無
* @retval 無
*/
void WWDT_IRQHandler(void)
{
if (WWDT_ReadFlag() == SET) /* 判斷提前喚醒中斷標(biāo)志 */
{
WWDT_ConfigCounter(wwdt_counter); /* 重新配置窗口看門狗計(jì)數(shù)器數(shù)值 */
LED1_TOGGLE(); /* 翻轉(zhuǎn)LED1狀態(tài) */
WWDT_ClearFlag(); /* 清除提前喚醒中斷標(biāo)志 */
}
}
可以看到,在窗口看門狗的提前喚醒中斷服務(wù)函數(shù)中,對WWDT進(jìn)行了喂狗操作,同時還對LED1的狀態(tài)進(jìn)行了以此翻轉(zhuǎn)(方便觀察)。
15.2.3 實(shí)驗(yàn)應(yīng)用代碼
本章實(shí)驗(yàn)的應(yīng)用代碼,如下所示:文章來源:http://www.zghlxwxcb.cn/news/detail-662480.html
int main(void)
{
NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_3); /* 設(shè)置中斷優(yōu)先級分組為組3 */
sys_apm32_clock_init(336, 8, 2, 7); /* 配置系統(tǒng)時鐘 */
delay_init(168); /* 初始化延時功能 */
usart_init(115200); /* 初始化串口 */
led_init(); /* 初始化LED */
LED0(0); /* LED0點(diǎn)亮 */
delay_ms(300);
wwdt_init(0x7F, 0x5F, WWDT_TIME_BASE_8);
while (1)
{
LED0(1); /* LED0熄滅 */
}
}
可以看到應(yīng)用代碼中,LED初始化后,LED0會被點(diǎn)亮300毫秒,隨后初始化窗口看門狗并熄滅LED0,若窗口看門狗沒有正常被“喂狗”,那么程序復(fù)位,可以看到LED0再次亮起和熄滅,若窗口看門狗正常被“喂狗”,則可以看到LED1閃爍。
15.3 下載驗(yàn)證
在完成編譯和燒錄操作后,可以看到板子上的LED0在上電時,亮起并熄滅一次,隨后LED1不斷閃爍,說明WWDT“喂狗”正常。文章來源地址http://www.zghlxwxcb.cn/news/detail-662480.html
到了這里,關(guān)于【正點(diǎn)原子STM32連載】第十五章 窗口看門狗實(shí)驗(yàn) 摘自【正點(diǎn)原子】APM32F407最小系統(tǒng)板使用指南的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!