2016-04-25 47 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 –