8543|10

71

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

WWDG进不了中断 [复制链接]

我用一个灯监视WWG中断,正常的话每进20次中断改一次灯的状态,(主要是因为看门狗58.25MS喂一次狗,想让LED大约1S闪一次),但是不知哪里出现问题,灯从没闪烁过,说明WWDG中断没有进入,我将断点设在WWDG中断程序中,结果也没有跑到中断程序中。
我的程序大概如下:
int main(void)
{      
LED_GPIO_Configuration();
  EXTI_Configuration();

  /* 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);
  }
NVIC_Configuration();
  WWDG_Configutration();
  /* Infinite loop */
  while (1)
  {
   }
}
//看门狗初始化
void WWDG_Configutration()
{
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);//WWDG
  //软件看门狗初始化
  WWDG_SetPrescaler(WWDG_Prescaler_8); //时钟8分频
  // (PCLK1/4096)/8=1099 Hz (~910 us)
  WWDG_SetWindowValue(65);            //Window value数值为65
  WWDG_Enable(127);                   //启动计数器,设置计数值为127设置喂狗时间
  // WWDG timeout = ~910 us * 64 = 58.25 ms
  WWDG_ClearFlag();                   //清除标志位
  WWDG_EnableIT();                    //启动中断
}
void NVIC_Configuration(void)
{
NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    /* Enable the EXTI3_IRQn Interrupt */
   NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);
}
void EXTI_Configuration(void)
{
  EXTI_InitTypeDef EXTI_InitStructure;
  /* Connect EXTI Line3 to PD3*/
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource3);
  /* Configure EXTI Line3 to generate an interrupt on falling edge */
  EXTI_ClearITPendingBit(EXTI_Line3);
  EXTI_InitStructure.EXTI_Line = EXTI_Line3;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
}
void LED_GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  //LED3<=>PC.6 LED2<=>PC.7
  /* Configure PC.06 and PC.07 as Output push-pull */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4 |GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
  /* Configure KEY2<=> PD3 as input floating (EXTI Line3) */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
}
void WWDG_IRQHandler(void)
{
  wwdg_count++;
  led_count++;
  /* Update WWDG counter */
  WWDG_SetCounter(0x7F);
  /* Clear EWI flag */
  WWDG_ClearFlag();
  wwdg_count = 0;
  /* Toggle led connected to PC.04 */
  GPIO_WriteBit(GPIOC, GPIO_Pin_4, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_4)));
  
  if(led_count>=20)//用于监视WWDG是否工作正常
  {
    /* Toggle led connected to PC.07 */
    GPIO_WriteBit(GPIOC, GPIO_Pin_7, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_7)));
    wwdg_count = 0;
  }
}

void EXTI3_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line3) != RESET)
  {   
    /* Turn off led connected to PC.05 */
GPIO_WriteBit(GPIOC, GPIO_Pin_5, Bit_SET);
/* As EXTI line3 pending bit is not cleared, the CPU will execute indefinitely
    this ISR and when the WWDG counter falls to 3Fh the WWDG reset occurs */
  }
}
此帖出自stm32/stm8论坛

最新回复

                                   万分感谢!基本搞清楚怎么回事了  详情 回复 发表于 2010-1-25 16:20
点赞 关注
 

回复
举报

70

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
                                 你知道什么时候应该进中断吗?正常的时候是不应该进中断的,进了中断说明程序不正常了。
此帖出自stm32/stm8论坛
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
谢谢你的回贴!
这个我知道,但我看到的例程中都在中断中喂狗,
按这样说,要喂狗一定的进中断,要不进不了中断,WWDG会使CPU复位,
我的意思在哪个地方给程序喂狗呢?
感觉这个WWDG很乱!
此帖出自stm32/stm8论坛
 
 

回复

72

帖子

0

TA的资源

纯净的硅(初级)

4
 

谢谢你的回贴!
这个我知道,但我看到的例程中都在中断中喂狗,
按这样说,要喂狗一定的进中断,要不进不了中断,WWDG会使CPU复位,
我的意思在哪个地方给程序喂狗呢?
感觉这个WWDG很乱!
此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

5
 


不是WWDG很乱,是你还没有理解它的工作原理。你知道什么时候应该进中断吗?

请看我的博客:
如何使用STM32的窗口看门狗
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

6
 

谢谢你的回贴!
这个我知道,但我看到的例程中都在中断中喂狗,
按这样说,要喂狗一定的进中断,不进中断,WWDG迟早会减到0X3F,这样会使CPU复位,
实际上从来都没喂狗 是这样吧?

我的意思在哪个地方给程序喂狗呢?
感觉这个WWDG很乱!
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

7
 
                                 你看了我在5楼给出的博客吗?当你还没有理解它的工作原理,最好不要乱评价,
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

8
 
                                 一般不是在主程序里面喂狗吗
此帖出自stm32/stm8论坛
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

9
 

看了,理解了它的内涵了,IWDG中SYSTICK中断中喂狗,以为WWDG也在中断中喂狗,可是问题又出来了,在什么地方对WWDG周期性喂狗呢?在主程序
WHILE(1)
{

}
里?那它怎么做到同期性呢,还是也可以像IWDG在SYSTICK中断中喂狗?
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

10
 
在哪里喂狗,这没有一个统一的标准,但基本原则就是只能在一个设定的时间窗口中喂狗,而这个时间窗口对应到程序中的什么地方,只有你自己知道,在没有详细了解程序时序的情况下,别人无法给你提出建议。如果你自己也搞不清楚自己的程序时序,请不要使用WWDG,直接使用普通的IWDG即可。

芯片为你提供了这样的功能,至于如何使用好这个功能,你要根据自己的具体情况,自己来安排。
此帖出自stm32/stm8论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

11
 

万分感谢!基本搞清楚怎么回事了
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表