打印

WWDG进不了中断

[复制链接]
4447|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
woshiwowo|  楼主 | 2010-1-25 10:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
IO, pi, GPIO, gp, TI
我用一个灯监视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 */
  }
}
沙发
香水城| | 2010-1-25 10:42 | 只看该作者
你知道什么时候应该进中断吗?正常的时候是不应该进中断的,进了中断说明程序不正常了。

使用特权

评论回复
板凳
woshiwowo|  楼主 | 2010-1-25 15:17 | 只看该作者
谢谢你的回贴!
这个我知道,但我看到的例程中都在中断中喂狗,
按这样说,要喂狗一定的进中断,要不进不了中断,WWDG会使CPU复位,
我的意思在哪个地方给程序喂狗呢?
感觉这个WWDG很乱!

使用特权

评论回复
地板
woshiwowo|  楼主 | 2010-1-25 15:18 | 只看该作者
2# 香水城
谢谢你的回贴!
这个我知道,但我看到的例程中都在中断中喂狗,
按这样说,要喂狗一定的进中断,要不进不了中断,WWDG会使CPU复位,
我的意思在哪个地方给程序喂狗呢?
感觉这个WWDG很乱!

使用特权

评论回复
5
香水城| | 2010-1-25 15:22 | 只看该作者
本帖最后由 香水城 于 2010-1-25 15:25 编辑

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

请看我的博客:
如何使用STM32的窗口看门狗

使用特权

评论回复
6
woshiwowo|  楼主 | 2010-1-25 15:23 | 只看该作者
4# woshiwowo
谢谢你的回贴!
这个我知道,但我看到的例程中都在中断中喂狗,
按这样说,要喂狗一定的进中断,不进中断,WWDG迟早会减到0X3F,这样会使CPU复位,
实际上从来都没喂狗 是这样吧?

我的意思在哪个地方给程序喂狗呢?
感觉这个WWDG很乱!

使用特权

评论回复
7
香水城| | 2010-1-25 15:34 | 只看该作者
你看了我在5楼给出的博客吗?当你还没有理解它的工作原理,最好不要乱评价,:L

使用特权

评论回复
8
yybj| | 2010-1-25 15:45 | 只看该作者
一般不是在主程序里面喂狗吗

使用特权

评论回复
9
woshiwowo|  楼主 | 2010-1-25 15:56 | 只看该作者
7# 香水城
看了,理解了它的内涵了,IWDG中SYSTICK中断中喂狗,以为WWDG也在中断中喂狗,可是问题又出来了,在什么地方对WWDG周期性喂狗呢?在主程序
WHILE(1)
{

}
里?那它怎么做到同期性呢,还是也可以像IWDG在SYSTICK中断中喂狗?

使用特权

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

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

使用特权

评论回复
11
woshiwowo|  楼主 | 2010-1-25 16:20 | 只看该作者
10# 香水城
万分感谢!基本搞清楚怎么回事了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

35

帖子

1

粉丝