La interrupción externa de GPIO no funciona

He escrito este programa para GPIO External Interrupt pero no funciona. mira el programa:

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"


/* Private functions ---------------------------------------------------------*/

GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

void GPIO_Configuration(void);
void EXTI_Configuration(void);
void NVIC_Configuration(void);


/*******************************************************************************
* Function Name  : main
* Description    : Main Programme
* Input          : None
* Output         : None
* Return         : None
* Attention      : None
*******************************************************************************/
int main(void)
{
    GPIO_Configuration();
    NVIC_Configuration();
    EXTI_Configuration();


    /* Infinite loop */
    while (1)
    {

  }
}

/*******************************************************************************
* Function Name  : GPIO_Configuration
* Description    : Configure GPIO Pin
* Input          : None
* Output         : None
* Return         : None
* Attention      : None
*******************************************************************************/
void GPIO_Configuration(void)
{
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB , ENABLE);                        
/**
 *  LED1 -> PB0
 */                  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
  GPIO_Init(GPIOB, &GPIO_InitStructure);

    /* PB2-> Input */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
  GPIO_Init(GPIOB, &GPIO_InitStructure);

}

void EXTI_Configuration(void)
{

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 

  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource2);
  EXTI_ClearITPendingBit(EXTI_Line2);

    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  EXTI_InitStructure.EXTI_Line = EXTI_Line2;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);

}

void NVIC_Configuration(void)
{

  NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;   
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;      
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure); 
}

void EXTI0_IRQHandler(void)
{
    if ( EXTI_GetITStatus(EXTI_Line2) != RESET ) {
        EXTI_ClearITPendingBit(EXTI_Line2);
      GPIO_SetBits(GPIOB , GPIO_Pin_0);
    }

}

#ifdef  USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *   where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{ 
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}
#endif

/******************************************************************************************
      END FILE
******************************************************************************************/

y este mi circuito:

Imagen

Incluso he bajado el PB2 pero no funciona, de nuevo. el programa se compila y descarga correctamente (sin ningún error ni advertencia).

¿Cuál es el problema? ¿alguna idea?

Agregue una resistencia desplegable al pin de entrada, es decir 10 k Ω entre PB2 y tierra. Y agregue una resistencia para ese LED, 1 k Ω está bien, si se enciende probablemente se fríe. Tal vez tu circuito no funcione porque ya lo friste...
Además, su rutina de interrupción enciende el led pero nunca se apaga. Las probabilidades de que lo quemaste son bastante altas, diría yo.
@VladimirCravero Como dije, ya lo bajé pero... No, el LED está bien. sí, lo sé, pero no funciona ni siquiera una vez.
Lo leí, para mí, tirar hacia abajo significa "Lo cortocircuité a tierra". De todos modos, se necesita la resistencia desplegable, así como la resistencia LED, si le importa su vida útil. ¿Puede también intentar que su LED se encienda correctamente configurando el pin en el software, justo antes del tiempo (1)?
@VladimirCravero Sí, lo probé. funciona bien (configuré y restablecí el led antes del ciclo infinito y eso funciona).
Entonces, mi consejo es usar la entrada en el sondeo y ver si eso funciona, para concretar el problema que se encuentra en el circuito o en el controlador de interrupciones.
Creo que tu código está mal. Su interrupción está conectada a EXTI2 aunque el vector para el controlador busca EXTI0. Cambie "EXTI0_IRQHandler" a "EXTI2_IRQHandler" Avíseme si esto lo soluciona
Bien descrito. Es muy probable que ese sea el error.
@ShannonStrutz Greeeaaaatttttzz! absolutamente tienes razón! ¡Lo cambié y ahora está funcionando! pon tu respuesta porque quiero seleccionar tu respuesta y +1
@VladimirCravero Oye, Vladimir, ¡Qué problema tan gracioso! ¿puedes ver? ¡A veces este tipo de problemas me preocupan! porque eso es muy simple!
Los problemas siempre son simples, la gente suele prestar más atención a las tareas más complicadas.
Publicado :D Me he tirado del pelo antes por el mismo problema, así que dije: "Veamos eso primero".

Respuestas (1)

Su interrupción está conectada EXTI2aunque el vector para el controlador está buscando EXTI0. cambiar EXTI0_IRQHandleraEXTI2_IRQHandler