0

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

我需要实现一个计时器,每 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(;;) {}

      }
}
4

1 回答 1

1

这里有几件事很明显是错误的。其中最令人不安的是:

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

  2. 你从不打电话InitWatchdog()。(相反,您main()出于某种原因在其中声明其原型。)

我不想这听起来太刺耳,但是:你知道 C 吗?这段代码读起来好像是在不理解示例的情况下通过复制和粘贴示例拼凑而成的。如果您不会 C,尝试为嵌入式系统开发软件并不是学习它的有效方法,尤其是在没有指导的情况下。

于 2016-04-25T13:22:13.287 回答