硬件部分可参考我另一篇文章
http://t.csdnimg.cn/4j3qT
接线图
这是课程的相关接线图,独立看门狗和窗口看门狗都适用本图
独立看门狗部分
一、配置流程
1.开启时钟
在数据手册里面有这么一段解释,就是说如果我们开启了看门狗,那么LSI就会跟随强制打开,等待LSI稳定之后就可以自动为独立看门狗提供时钟了。所以这里的第一步开启时钟不需要我们写代码来执行
2.写入预分频器和重装寄存器
在写入这两个寄存器之前需要先写入键值0x555来解除写保护。
3.写入预分频和重装值
可通过超时时间公式进行计算
4.在所有配置进行完之后
可以通过0XCCC这条指令开启独立看门狗,在主循环不断执行0XAAA这条指令进行喂狗
二、代码
1.关于复位时间计算的代码
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"int main()
{OLED_Init();OLED_ShowString(1,1,"IWDG TEST");if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST) == SET)//查看独立看门狗复位的标志位,返回值是set 或 reset{OLED_ShowString(2,1,"IWDG RST");Delay_ms(800);OLED_ShowString(2,1," ");Delay_ms(200);//中断位置1后记得清除标志位 //如果置1后没及时清0,那下次即使是正常的复位键复位也会被判断为看门狗复位RCC_ClearFlag();}else{OLED_ShowString(2,1,"NORMOL RST");Delay_ms(800);OLED_ShowString(2,1," ");Delay_ms(200); }//接下来需要进行解除写保护IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//这里的enable对应的宏定义是0x5555//举个例子,设定我们需要的超时时间为1s TIWDG就是1000//TLSI是1/40KHz,就是0.025ms//在选择预分频系数的时候,前两个由于最长时间<1000不能选择,所以选择最小能够选择的16分频//最后用公式计算RL的值 1000/0.025/16-1=2499 !!!注意这个值只能取整数IWDG_SetPrescaler(IWDG_Prescaler_16);IWDG_SetReload(2499);//先喂一次狗,保证启动后的第一个喂狗周期就是1000msIWDG_ReloadCounter();IWDG_Enable();while(1){IWDG_ReloadCounter();Delay_ms(1050);//经过测试我的看门狗在1050ms时会复位,在此之前及时喂狗不会产生复位}
}
2.关于按键阻塞程序运行的程序
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "KEY.h"int main()
{OLED_Init();GPIO_Key_Init();OLED_ShowString(1,1,"IWDG TEST");if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST) == SET)//查看独立看门狗复位的标志位,返回值是set 或 reset{OLED_ShowString(2,1,"IWDG RST");Delay_ms(800);OLED_ShowString(2,1," ");Delay_ms(200);//中断位置1后记得清除标志位 //如果置1后没及时清0,那下次即使是正常的复位键复位也会被判断为看门狗复位RCC_ClearFlag();}else{OLED_ShowString(3,1,"NORMOL RST");Delay_ms(800);OLED_ShowString(3,1," ");Delay_ms(200); }//接下来需要进行解除写保护IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//这里的enable对应的宏定义是0x5555//举个例子,设定我们需要的超时时间为1s TIWDG就是1000//TLSI是1/40KHz,就是0.025ms//在选择预分频系数的时候,前两个由于最长时间<1000不能选择,所以选择最小能够选择的16分频//最后用公式计算RL的值 1000/0.025/16-1=2499 !!!注意这个值只能取整数IWDG_SetPrescaler(IWDG_Prescaler_16);IWDG_SetReload(2499);//先喂一次狗,保证启动后的第一个喂狗周期就是1000msIWDG_ReloadCounter();IWDG_Enable();while(1){Key_GetNum();//按住按键不放,主循环就会阻塞,则不能及时喂狗,造成复位IWDG_ReloadCounter(); OLED_ShowString(4,1,"FEED");Delay_ms(200);OLED_ShowString(4,1," ");//值得注意的东西,这里不可以使用tab自动空格按键,会造成只有第一个字母闪烁//需要老老实实敲四下空格Delay_ms(600); //Delay_ms(1050);//经过测试我的看门狗在1050ms时会复位,在此之前及时喂狗不会产生复位}
}