2016-04-25 7 views
0

Edited сделан сейчас .. Я восстановить код, но теперь это сделано и протестированокна сторожевого таймера STM32F4

мне нужно реализовать таймер, который проверяет наличие условий каждый х сек .. проблему я сталкиваюсь, что программа не сбрасывается, когда он входит в бесконечный цикл (прочь для проверки, как если система была остановлена) ...
эти ссылки помогли мне .. руководство со страницы 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() функция не выполняет каких-либо задержек. Кажется, что один из светодиодов должен мигать.

  2. Вы никогда не звоните InitWatchdog(). (Вместо этого, вы объявляете его прототип в рамках main() по какой-то причине.)

Я не хочу, чтобы это звучало слишком суровым, но: вы знаете C? Этот код читается так, как будто он был составлен путем копирования и вставки фрагментов из примеров без их понимания. Если вы не знаете C, попытка разработки программного обеспечения для встроенной системы не является эффективным способом ее изучения, особенно без руководства.

+0

Да, вы правы, только новичок ... ваши заметки мне очень помогли ... Я действительно редактирую, как если бы кто-то еще видел, что код может пропустить эти ошибки в катастрофе ... на самом деле у меня есть задача, поэтому я учиться и развиваться в //. Сейчас у меня нет выбора ... но я буду .. .просить isAllah –