2016-04-25 93 views
0

编辑 现在完成了。我会重构代码,但现在它的完成和测试窗口看门狗定时器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(;;) {} 

     } 
} 

回答

0

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

  1. Delayms()功能没有实现任何延迟。它似乎配置其中一个LED闪烁。

  2. 你永远不会打电话InitWatchdog()。 (相反,你被宣告其内main()原型的某些原因。)

我不希望这听起来过于苛刻,但是:你知道的C?这段代码看起来好像是通过复制和粘贴来自示例的片断而不理解它们一样。如果你不了解C,试图为嵌入式系统开发软件并不是学习它的有效方法,尤其是没有指导的情况下。

+0

是的,你是对的这只是一个初学者...你的笔记帮助了我很多...我实际上编辑,如果别人看到代码可以跳过这些katastrofi错误...其实我有一个任务,所以我学习和发展//。我现在没有选择...但是我会赞成isAllah –