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

Tamper 사용

로망와니 2018. 7. 23. 15:28

내부 백업레지스터의 정보를 제거하는 용도로 사용하는 TAMPER 패리패럴을 설정하고 사용하는 방법입니다.

주요 정보를 저장해두고 유사시에 제거하는 용도로 사용하도록 설정하여 사용하면 될 것 같습니다.

TAMPER 핀은 PULL-DOWN해두고 유사시에 TAMPER 핀에 HIGH 신호를 주는 설정으로 하였습니다. 

전원 OFF 시에 전원이 TAMPER 핀으로 들어가지 않게 하기 위함이었습니다.



/*******************************************************************************

* Function Name : 

* Parameters    : 

* Return        : none

* Description   : 

*******************************************************************************/

void BackupRegister_Init(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

/* Enable PWR and BKP clock */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);


/* Enable write access to Backup domain */

PWR_BackupAccessCmd(ENABLE);


/* Clear Tamper pin Event(TE) pending flag */

BKP_ClearFlag();


/* Enable Tamper pin */

BKP_TamperPinCmd(ENABLE);

/* Tamper pin active on low level */

BKP_TamperPinLevelConfig(BKP_TamperPinLevel_High);//BKP_TamperPinLevel_Low


/* Enable Tamper interrupt */

BKP_ITConfig(ENABLE);


  /* Enable TAMPER IRQChannel */

  NVIC_InitStructure.NVIC_IRQChannel = TAMPER_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

  

UART1_printf("\r\n\n%X", BKP_ReadBackupRegister(BKP_DR1));

if (BKP_ReadBackupRegister(BKP_DR1) != 0xAAAA)

  {

    /* Backup data register value is not correct or not yet programmed (when

       the first time the program is executed) */


BKP_WriteBackupRegister(BKP_DR1, 0xAAAA);

UART1_printf("\r\n\n Write %X", BKP_ReadBackupRegister(BKP_DR1));

  }

  else

  {

    /* Check if the Power On Reset flag is set */

    if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET){

      UART1_printf("\r\n\n Power On Reset occurred....");

    }

    /* Check if the Pin Reset flag is set */

    else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET){

      UART1_printf("\r\n\n External Reset occurred....");

    }

  }

  /* Clear reset flags */

  RCC_ClearFlag();

}





void TAMPER_IRQHandler(void)

{

  if(BKP_GetITStatus() != RESET)

  { /* Tamper detection event occured */



    /* Clear Tamper pin interrupt pending bit */

    BKP_ClearITPendingBit();


    /* Clear Tamper pin Event(TE) pending flag */

    BKP_ClearFlag();

  }

}