您的位置 首页 硬件

stm32 窗口看门狗 wwdg与独立看门狗iwdg的装备运用

STM32笔记之十二:时钟不息工作不止,systic时钟应用a)目的:使用系统时钟来进行两项实验——周期执行代码与精确定时延迟。b)初始化函

STM32笔记之十二:时钟不息作业不止,systic时钟运用

a) 意图:运用体系时钟来进行两项试验——周期履行代码与准确守时推迟。

b) 初始化函数界说:

void SysTick_Configuration(void);

c) 初始化函数调用:

SysTick_Configuration();

d) 初始化函数:

void SysTick_Configuration(void)

{

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//时钟除8

SysTick_SetReload(250000); //计数周期长度

SysTick_CounterCmd(SysTick_Counter_Enable); //发动计时器

SysTick_ITConfig(ENABLE); //翻开中止

}

e) 在NVIC的初始化函数里边增加以下代码翻开相关中止:

NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 1, 0);//中止等级设置,一般设置的高一些会少受其他影响

f) 在stm32f10x_it.c文件中找到void SysTickHandler 函数

void SysTickHandler(void)

{

履行代码

}

g) 简略运用:准确推迟函数,由于systic中止往往被用来履行周期循环代码,所以一些例程中运用其中止的发动和制止来编写的准确延时函数实际上不实用,我自己编写了准确计时函数反而代码更精简,思路更简略。思路是调用后,变量清零,然后运用时钟来的曾变量,不断比较变量与推迟的数值,持平则退出函数。代码和进程如下:

i. 界说通用变量:u16 Tic_Val=0; //变量用于准确计时

ii. 在stm32f10x_it.c文件中相应界说:

extern u16 Tic_Val;//在本文件引证MAIN.c界说的准确计时变量

iii. 界说函数称号:void Tic_Delay(u16 Tic_Count);//准确推迟函数

iv. 准确延时函数:

void Tic_Delay(u16 Tic_Count) //准确延时函数

{ Tic_Val=0; //变量清零

while(Tic_Val != Tic_Count){printf(“”);}//计时

}

v. 在stm32f10x_it.c文件中void SysTickHandler 函数里边增加

Tic_Val++;//变量递加

vi. 调用代码:Tic_Delay(10); //准确延时

vii. 疑问:假如去掉计时行那个没用的printf(“”);函数将停止作业,这个现象很古怪

C言语功底问题。是的,那个“注意事项”最终的疑问的原因便是这个

Tic_Val应该改为vu16

while(Tic_Val != Tic_Count){printf(“”);}//计时

就能够改为:

while(Tic_Val != Tic_Count); //查看变量是否计数到位

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

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/qianrushi/yingjian/257545.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部