title: STM32 external interrupt responds only in debug mode
body: <p>I have a problem with my STM32F103C8T6 microcontroller. I am using (as an exercise) external interrupts to toggle on/off a led, by pressing an external switch wich in turn is connected to PC13. I am using StdPeriph Library.</p>
  
  <p>When the chip has programmed, nothing happens. On the contrary, when I am using the debugger (debug in Coocox), the chip is working fine. I can not figure out where is the problem.</p>
  
  <p>Can you help me please?
  Here is my code.</p>
  
  <pre><code>#include&lt;stm32f10x.h&gt;
  #include&lt;stm32f10x_rcc.h&gt;
  #include&lt;stm32f10x_gpio.h&gt;
  
  #include&lt;stm32f10x_exti.h&gt;
  #include&lt;misc.h&gt;
  
  typedef enum{
      on,
      off
  }state;
  state led=on;
  
  int main(void){
  
      // enable clocks
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  
      // uncomment to disable/remap JTAG pins
      GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST,ENABLE);
      GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
  
      // configure PC13 as input
      GPIO_InitTypeDef GPIO_InitStructure;
      GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
      GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
      GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;
      GPIO_Init(GPIOC,&amp;GPIO_InitStructure);
  
      // configure PB8 as led output
      GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
      GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
      GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;
      GPIO_Init(GPIOB,&amp;GPIO_InitStructure);
  
      // connect PC13 to EXTI controller
      GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource13);
  
      // enable and configure EXTI controller
      EXTI_InitTypeDef EXTI_InitStructure;
      EXTI_InitStructure.EXTI_Line=EXTI_Line13;
      EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
      EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
      EXTI_InitStructure.EXTI_LineCmd=ENABLE;
      EXTI_Init(&amp;EXTI_InitStructure);
  
      // enable IRQ
      NVIC_EnableIRQ(EXTI15_10_IRQn);
      NVIC_SetPriorityGrouping(NVIC_PriorityGroup_2);
  
      // Configure NVIC
      NVIC_InitTypeDef NVIC_InitStructure;
      NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
      NVIC_Init(&amp;NVIC_InitStructure);
  
      // switch on led
      GPIO_WriteBit(GPIOB,GPIO_Pin_8,Bit_SET);
  
      while(1);
  
      return 0;
  }
  
  void EXTI15_10_IRQHandler(void){
  
      // clear pending bit
      if(EXTI_GetITStatus(EXTI_Line13)!=RESET){
          EXTI_ClearITPendingBit(EXTI_Line13);
      }
  
      if(led==off){
          GPIO_WriteBit(GPIOB,GPIO_Pin_8,Bit_SET);
          led=on;
      }else{
          GPIO_WriteBit(GPIOB,GPIO_Pin_8,Bit_RESET);
          led=off;
      }
  }
  
  #ifdef USE_FULL_ASSERT
  void assert_failed(uint8_t * file,uint32_t line){
      /* Infinite loop */
      while (1);
  }
  #endif
  </code></pre>