La interrupción STM32 no se activa

Estoy usando un STM32F103C8T6 (también conocido como píldora azul).

GPIO Init y manejador de interrupciones:

static void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_RESET);

  /*Configure GPIO pins : PC13 PC15 */
  GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_15;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /*Configure GPIO pin : PA0 */
  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  HAL_NVIC_EnableIRQ(EXTI0_IRQn);

  while(1);

}

void EXTI0_IRQHandler(void)
{
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
    HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_14);
}

El problema es que nunca se llama al manejador de interrupciones (EXTI0_IRQHandler). Probé también con otros pines (por ejemplo, usando EXTI15_10_IRQHandler). Revisé el interruptor y el LED por separado (en la función principal) y funcionan. También probé con PULLUP y PULLDOWN (que no hace ninguna diferencia).

¿Se necesita más para activar la función de interrupción?

no estoy seguro, pero ¿es tal vez necesario habilitar interrupciones globalmente o asignar una prioridad a su interrupción específica? ¿ Es EXTI0_IRQnuna constante o debería ser algo como EXTI0_IRQ0?
@MarcusMüller Es una constante y verificaré si se establece una prioridad, gracias por el comentario.
@PeterJ Gracias... Verificaré, __HAL_RCC_GPIOA_CLK_ENABLE(); Ya lo hice (también para GPIOC y GPIOD.
@Marcus Müller: ¿alguna vez tuviste contacto con esos micros? creo que no lo hiciste
@PeterJ No sé por qué estás siendo tan grosero, explícitamente pronuncié una vaga sospecha. Sí, he estado trabajando con stm32f1 antes, pero sin la torpe biblioteca HAL. Disculpe si no tengo en mi cabeza los documentos de todos los microcontroladores con los que he trabajado.
@Marcus Müller es un conocimiento general sobre micros STM. EXTI0_IRQn a constant or should it be something like EXTI0_IRQ0???? I've been working with stm32f0 before, but without the clunky HAL lib.esos dos no tienen nada en común. Esas definiciones son parte del CMSIS utilizado por los codificadores de registro simple.

Respuestas (1)

Siga los pasos de mi comentario. Aquí está el código de muestra. Tenía conexiones de hardware diferentes, así que usé pines diferentes.

int main(void) {
    RCC->APB2ENR = RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_AFIOEN;


    //confure PB2  PC13 as inputs, PB0 output

    AFIO->EXTICR[0] = AFIO_EXTICR1_EXTI2_PB;
    AFIO->EXTICR[3] = AFIO_EXTICR4_EXTI13_PC;
    EXTI->IMR = EXTI_IMR_MR2 | EXTI_IMR_MR13;
    EXTI->RTSR = EXTI_RTSR_TR2;
    EXTI->FTSR = EXTI_FTSR_TR13;
    NVIC_EnableIRQ(EXTI2_IRQn);
    NVIC_EnableIRQ(EXTI15_10_IRQn);
    while (1);
} 
void EXTI2_IRQHandler(void) {
    if (EXTI->PR & EXTI_PR_PR2) {
        EXTI->PR = EXTI_PR_PR2;
        GPIOB -> ODR |= GPIO_ODR_0;
    }
}

void EXTI15_10_IRQHandler(void) {
    if (EXTI->PR & EXTI_PR_PR13) {
        EXTI->PR = EXTI_PR_PR13;
        GPIOB -> ODR &= ~GPIO_ODR_0;            
    }
}

un pin enciende el led otro se apaga

Gracias por este comentario, uso HAL, así que primero necesito averiguar qué significan todos esos números (buen ejercicio para mí). Por cierto, ¿hay alguna razón por la que use PC13 como entrada ya que mi placa PC13 está conectada a una salida (LED incorporado)?
Solo tengo una placa con 103 ya que es una familia obsoleta de micros. Y en esta placa tengo conexiones diferentes a las del "bluepil". Solo cambia al que tienes. Solo quería darle el ejemplo de trabajo , así que lo probé en mi hardware real
Cuando llegué a casa, de repente funcionó (solo cambio: llevé la placa de prueba, incluido el stm32, en automóvil) ... así que tal vez fue algún problema electrónico (cable suelto). Pero estudiaré su ejemplo para ver la diferencia entre Hal y 'llamadas directas'.
Sinceramente, aconsejo la forma de registros desnudos.
¿Quieres decir como en 'todos los casos'? Normalmente programo en lenguajes de nivel superior, y hasta ahora me gusta cómo funciona Hal, pero en realidad acabo de empezar... si esto es causado por alguna 'característica extraña' de Hal, probablemente pronto ya no esté tan contento con Hal. .
I program in higher level languages?? ¿Microcontroladores? C o C ++ son perfectos para la programación de registros desnudos
No quise decir eso... quiero decir, Hal se ve mucho más fácil (y por supuesto esconde un poco de los pensamientos detrás de él). Desde febrero comencé con Arduino (IDE), desde el mes pasado STM32, me estoy volviendo cada vez más profundo (no hay nada de malo en eso, solo mi 'proyecto inicial previsto' parece cada vez más lejano. ¿Tu código es la Biblioteca Periférica?
Ningún SPL está muerto y sin soporte durante años. Simplemente incluya encabezados CMSIS, descargue el Manual de referencia y disfrute :)
Lo comprobaré (pero lo siento, no descartaré HAL / CubeMx todavía)
Para aquellos que quieran leer la explicación sobre esta respuesta: Embedded-lab.com/blog/stm32-external-interrupt