2016-04-25 19 views
0

Edited jetzt getan .. ich den Code rekonstruieren werde, aber jetzt ist es fertig und getestetFenster Watchdog Timer STM32F4

Ich brauche einen Timer zu implementieren, die jedes x sec .. das Problem für Bedingungen überprüft ich konfrontiert, dass wird das Programm nicht zurückgestellt, wenn es (für die Prüfung wie weg, wenn das System angehalten wurde) Endlosschleife eintritt ...
diese Links half mir .. Handbuch ab Seite 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 ..

und diesen Link http://www.programmershare.com/3518407/ danke im voraus

Im Moment habe ich diesen Code:

#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(;;) {} 

     } 
} 

Antwort

0

Es gibt mehrere Dinge falsch sind hier sehr offensichtlich. Am beunruhigendsten unter ihnen sind:

  1. Ihre Delayms() Funktion implementieren keine Art von Verzögerung. Es scheint so zu sein, dass eine der LEDs so konfiguriert ist, dass sie blinkt.

  2. Sie rufen nie InitWatchdog(). (Stattdessen erklären Sie dessen Prototyp innerhalb main() aus irgendeinem Grund.)

Ich will das nicht zu hart klingen, aber: Sie wissen, C? Dieser Code liest sich, als ob er durch Kopieren und Einfügen von Stücken aus Beispielen zusammengesetzt würde, ohne sie zu verstehen. Wenn Sie C nicht kennen, ist der Versuch, Software für ein eingebettetes System zu entwickeln, keine effektive Möglichkeit, es zu erlernen, insbesondere ohne Anleitung.

+0

ja, du hast recht ähm nur ein Anfänger ... deine Notizen haben mir sehr geholfen ... Ich bearbeite tatsächlich, als ob jemand anderes den Code sehen könnte, der diese katastrofi Fehler überspringt ... in der Tat habe ich eine Aufgabe, also ich lerne und entwickle dich in //. Ich habe jetzt keine andere Wahl ... aber ich werde ... Promise Isallah –