AnsweredAssumed Answered

software error keeps mcu in reset

Question asked by ionut.fasola on Nov 1, 2016
Latest reply on Nov 1, 2016 by Clive One
Recently I have observed an odd phenomenon: I have a code (which I believe is faulty) , I program the MCU (which initially is fully erased ) with that code; 
after that the MCU can not be reprogrammed by programming environment (CooCox IDE).
So I have to use ST Link utility to erase the chip using connection under reset method, and after this CooCox can reprogram the MCU.(but just once)
If i remove from the source code the function which I believe is causing this behaviour , CooCox can reprogram my chip as many times as I want.

The MCU used is the one found on STM32F072 Disco Board.

The source code is :
int main(void)
{
  /*!< At this stage the microcontroller clock setting is already configured,
       this is done through SystemInit() function which is called from startup
       file (startup_stm32f0xx.s) before to branch to application main.
       To reconfigure the default setting of SystemInit() function, refer to
       system_stm32f0xx.c file
     */
     gpio_config();
  /* Infinite loop */
     u8 i=0;
  while (1)
     { }
}

void gpio_config(void)
{
     GPIO_InitTypeDef GPIO_InitStructure;
     EXTI_InitTypeDef EXTI_InitStructure;
     NVIC_InitTypeDef NVIC_InitStructure;


     GPIO_StructInit(&GPIO_InitStructure);


     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);


     /* Enable SYSCFG clock for EXTI controller */
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);


       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
       GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
       GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;//50MHz

       // PB3,4,12,13,14,15 PA8..13; PF6
       GPIO_InitStructure.GPIO_Pin = D1_Pin|SegA_Pin|SegB_Pin|SegD_Pin|SegE_Pin;
       GPIO_Init(GPIOA, &GPIO_InitStructure);

       GPIO_InitStructure.GPIO_Pin = D2_Pin|D3_Pin|D4_Pin|SegC_Pin|SegG_Pin;
       GPIO_Init(GPIOB, &GPIO_InitStructure);

       GPIO_InitStructure.GPIO_Pin = SegF_Pin;
      /GPIO_Init(GPIOF, &GPIO_InitStructure);

       //K1 , K2 relays pins
       GPIO_InitStructure.GPIO_Pin = K1Pin|K2Pin;
       GPIO_InitStructure.GPIO_Mode = GPIO_OType_PP;
       GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;//50MHz

       GPIO_Init(RelayPort, &GPIO_InitStructure);

       //buttons
       GPIO_InitStructure.GPIO_Pin= SW1Pin|SW2Pin|SW3Pin;
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
       GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
       GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;//50MHz


       GPIO_Init(SWPort, &GPIO_InitStructure);

      //buttons interrupts
      /* Configure EXTI7 line */
      EXTI_InitStructure.EXTI_Line = EXTI_Line7;
      EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
      EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
      EXTI_InitStructure.EXTI_LineCmd = ENABLE;
      EXTI_Init(&EXTI_InitStructure);

       /* Configure EXTI6 line */
      EXTI_InitStructure.EXTI_Line = EXTI_Line6;
      EXTI_Init(&EXTI_InitStructure);

       /* Configure EXTI5 line */
      EXTI_InitStructure.EXTI_Line = EXTI_Line5;
      EXTI_Init(&EXTI_InitStructure);


       /* Enable and set EXTI4..15 Interrupt to the lowest priority */
       NVIC_InitStructure.NVIC_IRQChannel = EXTI4_15_IRQn;
       NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
       NVIC_Init(&NVIC_InitStructure);
}

and that it is all. USE_FULL_ASSERT is disabled 
phenomenon
phenomenon

Outcomes