STM32的窗口看门狗


stm32有两个看门狗,独立看门狗和窗口看门狗,其实两者的功能是类似的,只是喂狗的限制时间不同。

 

独立看门狗是限制喂狗时间在0-x内,x由你的相关寄存器决定。喂狗的时间不能过晚。

窗口看门狗所以称之为窗口就是因为其喂狗时间是一个有上下限的范围内,你可以通过设定相关寄存器,设定其上限时间和下限时间。喂狗的时间不能过早也不能过晚。

图1

 

窗口看门狗的

上窗口就是配置寄存器WWDG->CFR里设定的W[6:0];

下窗口是固定的0x40

当窗口看门狗的计数器在上窗口值之外,或是低于下窗口值都会产生复位。

图2

 

 

上窗口的值可以只有设定,7位二进制数最大只可以设定为127(0x7F),最小又必须大于下窗口的0x40,所以其取值范围为64~127(即:0x40~0x7F;

 

配置寄存器WWDG->CFR中为计数器设定时钟分频系数,确定这个计数器可以定时的时间范围,从而确定窗口的时间范围。

 

窗口看门狗的时钟来自于PCLK1,在时钟配置中,其频率为外部时钟经倍频器后的二分频时钟,即为36MHz,根据手册可以知道其定时时间计算方法:

36Mhz下相关窗口看门狗的喂狗时间范围:

WDGTB(计数器分频值)最早喂狗时间/us最晚喂狗时间/ms

0                         113              7.28

1                         227              14.56

2                         455              29.12

3                         910              58.25

 

本例直接寄存器实现4测试模式,测试窗口看门狗的复位原理。

MODE_1 0   // 30ms时喂狗,在窗口范围内喂狗,LED灯闪烁

MODE_2 0   // 10ms时喂狗,在窗口范围外导致复位,LED灯常亮

MODE_3 0   // 100ms时喂狗,在窗口范围外喂狗导致复位

MODE_4 1   // 主函数不执行喂狗,开启提前唤醒中断,在WWDG中断函数中喂狗

库函数实现在提前唤醒中断中,喂狗操作,PA4LED正常闪烁。当外部中断发生(按下PA0按键),长时间不喂狗,引发窗口看门狗复位。

 

直接操作寄存器

 

相关寄存器如下:

控制寄存器WWDG->CR8位有效。

8位为WDGA,看门狗激活位。低7[6:0]为看门狗计数器的计数值。

 

配置寄存器WWDG->CFR:低十位有效。

10位为EWI:提醒唤起中断。此位置1,当计数器值到达0x40时,将产生中断。

89WDGTB:为计数器分频系数设置为:

00: CK计时器时钟(PCLK1除以4096)除以1     01: CK计时器时钟(PCLK1除以4096)除以2

10: CK计时器时钟(PCLK1除以4096)除以4     11: CK计时器时钟(PCLK1除以4096)除以8

7[6:0]:为窗口值。

int main(void)

{

#ifdef DEBUG

  debug();

#endif

 

  /* System Clocks Configuration ---------------------------------------------*/

  RCC_Configuration();

    

  /* GPIO configuration ------------------------------------------------------*/

  GPIO_Configuration();

 

  /*注释-hope:利用窗口看门狗的提前唤醒中断服务子程序来进行独立看门狗计数值的

       重载,每次重载一次计数值LED2就闪烁一次。*/

  /* Check if the system has resumed from WWDG reset -------------------------*/

  if(RCC_GetFlagStatus(RCC_FLAG_WWDGRST) != RESET)

  { /* WWDGRST flag set */

    /* Turn on led connected to PC.06 */

    GPIO_WriteBit(GPIOC, GPIO_Pin_6, Bit_SET);

 

       /* Clear reset flags */

    RCC_ClearFlag();

  }

  else

  { /* WWDGRST flag is not set */

    /* Turn off led connected to PC.06 */

    GPIO_WriteBit(GPIOC, GPIO_Pin_6, Bit_RESET);

  }

 

  /* Configure EXTI Line9 to generate an interrupt on falling edge -----------*/

  EXTI_Configuration();

 

/* NVIC configuration --------------------------------------------------------*/

  NVIC_Configuration();

 

/* WWDG configuration --------------------------------------------------------*/

  /* Enable WWDG clock */

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);

 

   /*   This parameter can be one of the following values:

       * @arg WWDG_Prescaler_1: WWDG counter clock = (PCLK1/4096)/1

       * @arg WWDG_Prescaler_2: WWDG counter clock = (PCLK1/4096)/2

       * @arg WWDG_Prescaler_4: WWDG counter clock = (PCLK1/4096)/4

       * @arg WWDG_Prescaler_8: WWDG counter clock = (PCLK1/4096)/8

《“十二五”高职高专规划教材·单片机项目教程:C语言版》融进了作者多年教学、科研实践所获取的经验及实例,是作者在单片机课程教学改革的基础上编写而成的,采用“项目引领,任务驱动”的教学模式来编排,视各课题为一个项目,每个项目又由多个任务组成,读者通过完成各个任务而掌握本课题的所有知识。全书以读者的认知规律为主线,充分体现了以人为本的指导思想。

 

/* WWDG clock counter = (PCLK1/4096)/8 = 244 Hz (~4 ms) ---PCLK1=8MHZ */

 

  WWDG_SetPrescaler(WWDG_Prescaler_8);

 

  /* Set Window value to 0x41 ---设置上窗口边界值*/

  WWDG_SetWindowValue(0x41);

 

  /* Enable WWDG and set counter value to 0x7F,  0x7f-0x41=64 --WWDG timeout = ~4 ms * 64 = 262 ms */

/*看门狗计数器的计数值0x7F---结合上面上窗口边界,计数值从ox7f递减到0x40*/

  WWDG_Enable(0x7F);

 

  /* Clear EWI flag */

  WWDG_ClearFlag();

 

  /* Enable EW interrupt */

  WWDG_EnableIT();

 

  while (1)

  {

  }

}

 

 

/******按键的优先级为0高于窗口看门狗的优先级1*****/

void NVIC_Configuration(void)

{

  NVIC_InitTypeDef NVIC_InitStructure;

 

  /* 2 bits for Preemption Priority and  2 bits for Sub Priority */

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

 

  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

 

  NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQChannel;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

  NVIC_Init(&NVIC_InitStructure);

}

 

 

void EXTI_Configuration(void)

{

  EXTI_InitTypeDef EXTI_InitStructure;

 

  /* Connect EXTI Line9 to PB.9 */

  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource9);

 

  /* Configure EXTI Line9 to generate an interrupt on falling edge */

  EXTI_ClearITPendingBit(EXTI_Line9);

  EXTI_InitStructure.EXTI_Line = EXTI_Line9;

  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿有效

  EXTI_InitStructure.EXTI_LineCmd = ENABLE;

  EXTI_Init(&EXTI_InitStructure);

}

 

Stm32f10x_it.c文件中:

 

void WWDG_IRQHandler(void)

{

  /* Update WWDG counter */

  WWDG_SetCounter(0x7F);

      

  /* Clear EWI flag */

  WWDG_ClearFlag();

 

  /* Toggle led connected to PC.07 */

  GPIO_WriteBit(GPIOC, GPIO_Pin_7, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_7)));

}

 

/********按键中断处理程序********/

//注意:这里中断函数里没有清中断标志的操作,这会导致窗口看门狗的提前唤醒中断

          无法进入,最终导致因无法重载看门狗计数器而系统复位;

void EXTI9_5_IRQHandler(void)

{

  if(EXTI_GetITStatus(EXTI_Line9) != RESET)

  {  

    /* Turn off led connected to PC.07 */

       GPIO_WriteBit(GPIOC, GPIO_Pin_7, Bit_RESET);

 

       /* As EXTI line9 pending bit is not cleared, the CPU will execute indefinitely

          this ISR and when the WWDG counter falls to 3Fh the WWDG reset occurs */

  }

}


来自:http://blog.csdn.net/yx_l128125/article/details/8033710 


> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >

该,大学里凭着使用单片机的好手艺得了不少的奖,找实习的时候才发现行业需求和待遇与互联网的同学差距很大,遂壮士断腕转行c++开发,幸运的是单片机开发过程中也积累了较好的基础,很快拿到了待遇很不错的实习offer。后来保研,算是彻底洗白,工作上不用再碰硬件了。但还是经常会想用单片机做一些有趣的小玩意,毕竟,这个玩意,就是我的半个“荒废”掉的执拗的青春。

生成海报
点赞 0

thePro

我还没有学会写个人说明!

相关推荐

基于8051单片机实现电子时钟+数字秒表设计

概述 电子时钟是一种利用数字电路来显示秒、分、时的计时装置,与传统的机械钟相比,它具有走时准确、显 示直观、无机械传动装置等优点,因而得到广泛应用。随着人们生活环境的不断改善和美化,在许

51小车(一)

1.准备: 借鉴: 详细介绍如何从零开始制作51单片机控制的智能小车(一)———让小车动起来_慕羽★的博客-CSDN博客_新手怎么制作单片机智能小车 2.已有模块 (1)  已有电机驱动 (2)

三相电机相电感,相电阻和极对数的测量

相电阻测量: 方法一:可使用万用表电阻档直接测量其中两端 方法二:可使用LCR数字电桥仪器测量 万用表操作: 将万用表旋转到电阻档的适当量程内 将万用表上的两表笔接触在电机的其中任意