7.1 實(shí)驗(yàn)內(nèi)容
通過(guò)本實(shí)驗(yàn)主要學(xué)習(xí)以下內(nèi)容:
? 獨(dú)立看門(mén)狗的原理
? 獨(dú)立看門(mén)狗功能介紹
? 實(shí)現(xiàn)獨(dú)立看門(mén)狗功能
7.2 實(shí)驗(yàn)原理
前面講到,看門(mén)狗的計(jì)數(shù)值在每一個(gè)計(jì)數(shù)器時(shí)鐘來(lái)的時(shí)候減1,那么這個(gè)時(shí)鐘是什么呢,我們來(lái)看一下GD32F470的時(shí)鐘樹(shù):
從時(shí)鐘樹(shù)可以看到,F(xiàn)WDGT的時(shí)鐘來(lái)源于IRC32K,這是GD32F470的內(nèi)部時(shí)鐘,典型的頻率值是32KHz。但要注意,這個(gè)IRC32K不是直接連到FWDGT計(jì)數(shù)器的,而是需要經(jīng)過(guò)一個(gè)預(yù)分頻器,這個(gè)分頻器大小通過(guò)FWDGT_PSC進(jìn)行設(shè)定。
預(yù)分頻寄存器(FWDGT_PSC):
如設(shè)定PS[2:0]為001b,那么計(jì)數(shù)器的時(shí)鐘頻率就為32K/8 = 4KHz,即每隔250us計(jì)數(shù)值減1。
7.2.1 獨(dú)立看門(mén)狗(FWDGT)的重裝載
說(shuō)完時(shí)鐘,我們來(lái)說(shuō)下FWDGT的計(jì)數(shù)器和重裝載。計(jì)數(shù)器就是按照前面說(shuō)的,每來(lái)一個(gè)計(jì)數(shù)器時(shí)鐘,計(jì)數(shù)器減1,而計(jì)數(shù)器的初始值,來(lái)自于重裝載寄存器。
重裝載寄存器(FWDGT_RLD):
從“描述”中我們可以看出,向FWDGT_CTL寫(xiě)入0xAAAA(即喂狗,詳見(jiàn)用戶(hù)手冊(cè)FWDGT_CTL寄存器),重裝載寄存器中的數(shù)值就會(huì)自動(dòng)加載到FWDGT的計(jì)數(shù)器中。
重裝載寄存器(FWDGT_RLD)是一個(gè)12位的計(jì)數(shù)器,這就意味著重裝載最大值為65535,再結(jié)合上一節(jié)的時(shí)鐘分頻,F(xiàn)WDGT設(shè)定的最大/最小超時(shí)周期見(jiàn)下表:
注意: 當(dāng)執(zhí)行完喂狗reload操作之后,如需要立即進(jìn)入deepsleep / standby模式時(shí),必須通過(guò)軟件設(shè)置,在reload命令及deepsleep / standby模式命令中間插入(3個(gè)以上) IRC32K時(shí)鐘間隔,否則可能導(dǎo)致喂狗不成功。
7.2.2 獨(dú)立看門(mén)狗的使用注意事項(xiàng)
獨(dú)立看門(mén)狗的時(shí)鐘源來(lái)自于IRC32K,這個(gè)內(nèi)部時(shí)鐘實(shí)際上不是非常的準(zhǔn)確,所以在設(shè)定看門(mén)狗重載值和分配器時(shí)需要留有一定的余量,防止應(yīng)用程序由于IRC32K頻率偏差而來(lái)不及喂狗,導(dǎo)致不必要的MCU復(fù)位。
7.3 硬件設(shè)計(jì)
本實(shí)驗(yàn)我們通過(guò)紫藤派開(kāi)發(fā)板LED0的狀態(tài)來(lái)指示MCU復(fù)位情況,用LED1來(lái)指示喂狗的情況。
7.4 代碼解析
在driver_wdgt.c中定義了獨(dú)立看門(mén)狗的配置函數(shù)drive_fwdgt_config和喂狗函數(shù)Feed_fwdgt:
C
void drive_fwdgt_config(uint16_t reload_value, uint8_t prescaler_div)
{
/* 開(kāi)啟內(nèi)部32K時(shí)鐘 */
rcu_osci_on(RCU_IRC32K);
/* 等待時(shí)鐘ready */
while(SUCCESS != rcu_osci_stab_wait(RCU_IRC32K)){
}
/*配置看門(mén)狗參數(shù)*/
fwdgt_config(reload_value,prescaler_div);
/*開(kāi)啟看門(mén)狗*/
fwdgt_enable();
}
void Feed_fwdgt(void)
{
/* 重裝載計(jì)數(shù)器 */
fwdgt_counter_reload();
}
以下為main函數(shù)代碼:
C
int main(void)
{
uint8_t i;
driver_init();//delay函數(shù)初始化
bsp_led_group_init();//LED初始化
bsp_led_on(&LED1);//點(diǎn)亮LED0
delay_ms(2000); ???????//延時(shí)2s
bsp_led_off(&LED1);//熄滅LED0
drive_fwdgt_config(625,FWDGT_PSC_DIV64);//獨(dú)立看門(mén)狗配置
/*閃爍LED1 5次,并每閃爍一次進(jìn)行喂狗*/
for(i = 0;i<5;i++)
{
delay_ms(500);
bsp_led_toggle(&LED2);
Feed_fwdgt();
printf_log("Feed_fwdgt!/r/n")
}
while (1)
{
}
}
本例程main函數(shù)首先進(jìn)行了延時(shí)函數(shù)初始化,再初始化LED0和LED1,并將LED0點(diǎn)亮2s鐘后熄滅,然后配置獨(dú)立看門(mén)狗時(shí)鐘預(yù)分頻為64分頻,重載值為1000,即超時(shí)時(shí)間為625/(32K/64) = 1.25s,再每500ms翻轉(zhuǎn)一次LED1,同時(shí)進(jìn)行喂狗,最后進(jìn)入while(1)循環(huán)。
7.5 實(shí)驗(yàn)結(jié)果
紫藤派開(kāi)發(fā)板上電后,LED0燈亮,2s鐘后熄滅,隨后LED1閃爍5次,再經(jīng)過(guò)一段時(shí)間后LED1燈滅,LED0復(fù)亮,周而復(fù)始。
更多GD32F470紫藤派資料下載:http://www.angneng.com.cn/cms/kaifaban/391.html