窗口看门狗定时器STM32F4

时间:2016-04-25 12:47:31

标签: c stm32 watchdog stm32f4discovery stm32f4

编辑 现在完成..我将重建代码,但现在已完成并经过测试

我需要实现一个每隔x秒检查一次条件的计时器..我遇到的问题是程序在进入无限循环时没有重置(如果系统已经停止则需要检查)... <登记/> 这些链接帮助了我..手册来自第74页http://www2.st.com/content/ccc/resource/technical/document/reference_manual/3d/6d/5a/66/b4/99/40/d4/DM00031020.pdf/files/DM00031020.pdf/jcr:content/translations/en.DM00031020.pdf ..

此链接http://www.programmershare.com/3518407/ 提前谢谢

我目前有这段代码:

#include "stm32f4xx.h"
#include <stm32f4xx_gpio.h>
#include <stm32f4xx_rcc.h>
#include <stm32f4xx_wwdg.h>

void setup_Periph(void);
void Delay(unsigned long ms);


void Delay(unsigned long ms)
{ unsigned long i,j;
for(i=0;i<ms;i++)
    for(j=0;j<1450;j++);
 }


 void setup_Periph(void)
 {

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

 //port initialization
 GPIO_InitTypeDef GPIO_InitStructure;

 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
 GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
 GPIO_Init(GPIOD,&GPIO_InitStructure);

 }

 void ResetWatchdog(void)
 { WWDG_SetCounter(80);}

 void WWDG_IRQHandler(void)
 {

 if (WWDG_GetFlagStatus())
  {
   WWDG_SetCounter(0x7f);
   WWDG_ClearFlag();
   }

 }

 void FeedDog(float round)
{
while(round)
   { Delay (65);
    WWDG_SetCounter(127);
    round--;}
 }


 int main(void)
 {
 //RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);

 //System Clock auf Watchdog
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);

 WWDG_SetPrescaler(WWDG_Prescaler_8);    
 //WWDG clock counter = (PCLK1(30MHz)/4096)/1 = 7324 Hz (~137 us)

 WWDG_SetCounter(80);           //Werte 0x40 und 0x7F
 WWDG_SetWindowValue(80);         //0x80

                //Reset  < 120  > 64

 WWDG_Enable(127);            //WWDG timeout = ~137 us * (127-64) = 8.6ms

 WWDG_ClearFlag();
 WWDG_EnableIT();

 setup_Periph();
 //make sure the clk is stable
   RCC_HSEConfig(RCC_HSE_ON);
   while(!RCC_WaitForHSEStartUp());


 GPIO_SetBits(GPIOD, GPIO_Pin_1);
 Delay(10000); //10 ms
 GPIO_ResetBits(GPIOD, GPIO_Pin_1);
 Delay(10000); //100 ms

  while (1)
  {

          GPIO_SetBits(GPIOD, GPIO_Pin_0);
            Delay(10000); //10 ms

            GPIO_ResetBits(GPIOD, GPIO_Pin_0);
            Delay(10000); //100 ms

            void ResetWatchdog(void);
            WWDG_SetCounter(80);
        FeedDog(8);
            for(;;) {}

      }
}

1 个答案:

答案 0 :(得分:0)

这里有一些非常明显的错误。其中最令人不安的是:

  1. 您的Delayms()函数未实现任何延迟。它似乎将其中一个LED配置为闪烁。

  2. 你永远不会打电话给InitWatchdog()。 (相反,您出于某种原因在main()内宣布其原型。)

  3. 我不希望这听起来太苛刻,但是:你知道C吗?这段代码看起来好像是通过复制和粘贴示例中的碎片而不理解它们而组合在一起的。如果您不了解C,那么尝试为嵌入式系统开发软件并不是一种有效的学习方法,尤其是在没有指导的情况下。