您的位置 首页 电路

STM32笔记之十三:恶搞,两只看门狗

a)目的:了解两种看门狗(我叫它:系统运行故障探测器和独立系统故障探测器,新手往往被这个并不形象的象形名称搞糊涂)之间的区别和基本用

a)意图:

了解两种看门狗(我叫它:体系运转毛病勘探器和独立体系毛病勘探器,新手往往被这个并不形象的象形称号搞糊涂)之间的差异和根本用法。

b)相同:

都是用来勘探体系毛病,经过编写代码守时发送毛病清零信号(高手们都管这个代码叫做“喂狗”),告知它体系运转正常。一旦体系毛病,程序清零代码(“喂狗”)无法履行,其计数器就会计数不止,直到记到零并产生毛病中止(狗饿了开端叫唤),操控CPU重启整个体系(不行啦,开端咬人了,快跑……)。

c)差异:

独立看门狗Iwdg——我的了解是独立于体系之外,由于有独立时钟,所以不受体系影响的体系毛病勘探器。(这条狗是借来的,见谁偷闲它都咬!)首要用于监督硬件过错。

窗口看门狗wwdg——我的了解是体系内部的毛病勘探器,时钟与体系相同。假如体系时钟不走了,这个狗也就失掉效果了。(这条狗是老板娘养的,老板不干活儿他不论!)首要用于监督软件过错。

d)初始化函数界说:鉴于两只狗效果差不多,运用进程也差不多初始化函数栓一起了,用的时分依据状况删减。

void WDG_Configuration(void);

e)初始化函数调用:

WDG_Configuration();

f)初始化函数

void WDG_Configuration()//看门狗初始化

{

//软件看门狗初始化

WWDG_SetPrescaler(WWDG_Prescaler_8); //时钟8分频4ms

// (PCLK1/4096)/8= 244 Hz (~4 ms)

WWDG_SetWindowValue(65);//计数器数值

WWDG_Enable(127);//发动计数器,设置喂狗时刻

// WWDG timeout = ~4 ms * 64 = 262 ms

WWDG_ClearFlag();//铲除标志位

WWDG_EnableIT();//发动中止

//独立看门狗初始化

IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//发动寄存器读写

IWDG_SetPrescaler(IWDG_Prescaler_32);//40K时钟32分频

IWDG_SetReload(349);//计数器数值

IWDG_ReloadCounter();//重启计数器

IWDG_Enable();//发动看门狗

}

g)RCC初始化:只要软件看门狗需求时钟初始化,独立看门狗有自己的时钟不需求可是需求systic作业相关设置。

RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);

h)独立看门狗运用systic的中止来喂狗,所以增加systic的中止翻开代码就行了。软件看门狗需求在NVIC翻开中止增加如下代码:

NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQChannel; //通道

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //占先中止等级

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//呼应中止优先级

NVIC_Init(&NVIC_InitStructure);//翻开中止

i)中止程序,软件看门狗在自己的中止中喂狗,独立看门狗需求运用systic的守时中止来喂狗。以下两个程序都在stm32f10x_it.c文件中。

void WWDG_IRQHandler(void)

{

WWDG_SetCounter(0x7F);//更新计数值

WWDG_ClearFlag();//铲除标志位

}

void SysTickHandler(void)

{IWDG_ReloadCounter();//重启计数器(喂狗)

}

j)注意事项:

i.有狗往常没工作能够不睬,可是千万别忘了喂它,不然死都不知道怎样死的!

ii.初始化程序的调用必定要在systic的初始化之后。

iii.独立看门狗需求systic中止来喂,可是systic做其他用途不能只做这件事,所以我写了如下几句代码,能够不影响systic的其他使用,其他systic周期代码也可参阅:

第一步:在stm32f10x_it.c中界说变量

int Tic_IWDG;//喂狗循环程序的频率判别变量

第二步:将SysTickHandler中喂狗代码改为下面:

Tic_IWDG++;//变量递加

if(Tic_IWDG>=100)//每100个systic周期喂狗

{IWDG_ReloadCounter();//重启计数器(喂狗)

Tic_IWDG=0;//变量清零

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/dianlu/258770.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部