초보의 아웅다웅 설계하기/STM32

WWDG에서 Watchdog 발생시 클리어 처리

로망와니 2018. 5. 17. 08:59

WWDG에서 Watchdog 발생시 클리어 처리

WWDG 사용중에 특정 목적에서는 WWDG가 동작하지 않아야하는데 이런 목적으로 사용할 경우 인터럽트에서 클리어 처리 해주어야 합니다. WWDG나 IWDG는 동작하도록 한번 설정을 하면 플래그에 다시 사용히자 않도록 설정을 하여도 되지 않습니다. 이럴 때를 위해서 인터럽트과 인터럽트가 아닌 곳에서 처리하도록 양쪽에 처리를 하였습니다.

(STM32L432에서 구현된 부분)

메인 .c

tFunc_Typedef  Func_Operate[] =
{
 /* Random Source */
// {GenRandom, "GetADC", 0}, 

 /* UART */
 {GetuPacket, "GetUartPacket", 0},
 /* SPI */
 {GetsPacket, "GetSPIPacket", 0},

 /* Input Button - Erase Function */
 {InputStatus, "InputStatus", 0},
 
 /* Output Status Pulse Wave For Normal Operation */
 {OutputStatus, "OutputStatus", 0},
 
 /* WatchDog Timer Reset */
 {SetWWDGCount, "SetWWDGCount", 0},
};

 

void main(void)

{

 /* Watch Dog Timer Configuration */
 WWDG_Configuration();
 OUTPUT_On(OUTPUTPIN_2);  
 while(1){
    if(Func_Operate[FuncIndex++].OperateFunc() == exit){break;}
  if (FuncIndex >= COUNT_OF_FUNCTION(Func_Operate)){
   FuncIndex = 0;
  }
 }

인터럽트가 발생하지 않으면서 처리해야하는 부분

....

}

 

인터럽트 처리 .c

void WWDG_IRQHandler(void)
{
  if(LL_WWDG_IsActiveFlag_EWKUP(WWDG) == 1)
  {
    /* Clear the Autoreload match interrupt flag */
    LL_WWDG_ClearFlag_EWKUP(WWDG);
   
    WWDG_Callback();
  }
}

 

관련 제어 파일 .c

/* Includes ------------------------------------------------------------------*/
#include "usr_wwdg.h"
#include "usr_usart.h"

#include "stm32l4xx_ll_bus.h"
#include "stm32l4xx_ll_rcc.h"
#include "stm32l4xx_ll_wwdg.h"

uint8_t g_chWWDGEnableFlag = 0;
/*******************************************************************************
* Function Name :
* Parameters    :
* Return        : None
* Description   :
*******************************************************************************/
void WWDG_Reset(void)
{
  if (LL_RCC_IsActiveFlag_WWDGRST()) {
    /* clear WWDG reset flag */
    LL_RCC_ClearResetFlags();
  }
}

/*******************************************************************************
* Function Name :
* Parameters    :
* Return        : None
* Description   :
*******************************************************************************/
void WWDG_init(void)
{
  /* Enable the peripheral clock of DBG register (uncomment for debug purpose) */
  /*LL_DBGMCU_APB1_GRP1_FreezePeriph(LL_DBGMCU_APB1_GRP1_WWDG_STOP); */
 
  /* Enable the peripheral clock WWDG */
  LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_WWDG);

  /* Configure WWDG */
  LL_WWDG_SetPrescaler(WWDG, LL_WWDG_PRESCALER_8);
  LL_WWDG_SetWindow(WWDG, WWDGCNT);                
  LL_WWDG_SetCounter(WWDG, WWDGCNT);          
  LL_WWDG_Enable(WWDG);          

 
 NVIC_SetPriority(WWDG_IRQn, 0); 
 NVIC_EnableIRQ(WWDG_IRQn);
 
 LL_WWDG_EnableIT_EWKUP(WWDG);  
}

/*******************************************************************************
* Function Name :
* Parameters    : None
* Return        : None
* Description   :
void WWDG_IRQHandler(void)
{
  if(LL_WWDG_IsActiveFlag_EWKUP(WWDG) == 1)
  {
    LL_WWDG_ClearFlag_EWKUP(WWDG);
   
    WWDG_Callback();
  }
}
*******************************************************************************/ 
void WWDG_Callback(void)
{
 if(g_chWWDGEnableFlag == 0){
  SetWWDGCount();
 }
 else{
  UART1_printf("SetWWDG Non Clear\r\n");
 }
}

/*******************************************************************************
* Function Name :
* Parameters    :
* Return        : None
* Description   :
*******************************************************************************/
void GetWWDGCount(void)
{
 LL_WWDG_GetCounter(WWDG);
}

/*******************************************************************************
* Function Name :
* Parameters    :
* Return        : None
* Description   :
*******************************************************************************/
uint32_t SetWWDGCount(void)
{
 LL_WWDG_SetCounter(WWDG, WWDGCNT);
 
 return 1;
}

/*******************************************************************************
* Function Name :
* Parameters    :
* Return        : None
* Description   :
*******************************************************************************/
void WWDG_Configuration(void)
{
 WWDG_Reset();
  WWDG_init();
 g_chWWDGEnableFlag = 1;
}