Hacer una interrupción en un stm32f4xx

Soy nuevo en Cortex M4 y programación en un microcontrolador. Todavía estoy aprendiendo lo básico.

Estoy usando esta placa ( stm32f411re ), aquí está el manual de referencia .

Estoy tratando de hacer una interrupción al presionar un botón (el botón de usuario que está conectado al puerto "PC13" (pin 2) ). Primero, estoy tratando de inicializar el botón para que cuando haga clic en él, active una excepción.

Aquí está mi código:

void button_init(void)
{
    <======== PART THAT I'M TRYING TO UNDERSTAND ========>

    // Enable GPIOC clock because BUTTON is connected to GPIOC
    RCC->AHB1ENR |= 0x04; // (page 114)

    // Configure the mode
    GPIOC->MODER &= ~0x3; // GPIO port mode register (page 153)
    GPIOC->PUPDR  &= ~0x3; // GPIO port pull-up/pull-down register (page 156)

    <======== PART THAT I'M TRYING TO UNDERSTAND ========>



    //System configuration controller clock enable (page 118)
    RCC->APB2ENR |= 0x00004000;

    SYSCFG->EXTICR[3] |= (0x02 << 4); // (page 139)

    //configure the interrupt for exti 13 line
    // EXTI->IMR |= (0x01 << 13)// enable interrupt on EXTI 13
    EXTI->IMR |= 0x01;
    // EXTI->RTSR |= 0X01;
    // EXTI->FTSR |= (0X01 << 13) // sensitive to falling edge 
    EXTI->FTSR |= 0X01;

    //nvic configuration 
    NVIC->IP[EXTI15_10_IRQn] = 0x00;
    NVIC_EnableIRQ(EXTI15_10_IRQn); // EXTI15_10_IRQn must be 40.. please confirm
}
  • Aquí están mis preguntas:

¿ Estoy en lo cierto con este cálculo ~0x3 = ~(0000 0011) = 1111 1100?

Entonces, cuando lo haga GPIOC->MODER &= ~0x3;, ¿estoy configurando los primeros bits de este registro en 00 (modo de entrada)?

¿Debo configurar otros dos bits de este registro? ¿Cómo puedo saber qué dos bits de este registro están vinculados con mi botón?

Mismas preguntas conGPIOC->PUPDR &= ~0x3;

Finalmente, quiero habilitar un reloj, así que lo hago RCC->APB2ENR |= 0x00004000;: 0x00004000 = 0100 0000 0000 0000=> Configuré el bit 16 de este registro, que es "habilitar reloj TIM9". ¿Es eso lo que queremos hacer? ¿Por qué TIM9 y no TIM10 o TIM11?

¡Muchas gracias!

Debe buscar en el software STM Cube que lo ayuda a omitir mucho de esto.
Hay demasiados números mágicos en tu código. ST proporciona archivos de encabezado para que pueda acceder a todos esos bits por sus nombres.
@TurboJ Quería hacer todo a mano para asegurarme de entenderlo todo. Porque realmente no me gusta usar cosas que no entiendo. Pero, por supuesto, cuando tenga el concepto, intentaré usar más alias. ¡Gracias por el consejo!

Respuestas (1)

¿Tengo razón con este cálculo ~0x3 = ~(0000 0011) = 1111 1100?

Casi, stm32 es un procesador de 32 bits por lo que será: 1111 1111 1111 1111 1111 1111 1111 1100

Entonces, cuando hago GPIOC->MODER &= ~0x3;, ¿estoy configurando los primeros bits de este registro en 00 (modo de entrada)?

Para la descripción de cada registro, debe consultar este Manual de referencia . Para el registro MODER de PORTC, consulte la página 153. Muestra que cada grupo de 2 bits del registro establece las propiedades de un pin específico en ese puerto. '00' es para la entrada como se indica en la página siguiente. Su escritura de GPIOC->MODER &= ~0x3; dará como resultado que PC0 se configure como entrada. Lo que quieres es GPIOC->MODER &= ~(0x3 << 26); Esto establecerá los bits 26 y 27 en 0, lo que se relaciona con el pin 13.

¿Debo configurar otros dos bits de este registro?

Solo por este pin, no tiene que escribir más en este registro específico.

¿Cómo puedo saber qué dos bits de este registro están vinculados con mi botón?

En la página 154 dice

Bits 2y:2y+1 MODERy[1:0]: Bits de configuración del puerto x (y = 0..15)

esto le da la relación de pin a bits en el registro

[0:1] para pin 0, [2:3] para pin 1, ... [30,31] para pin 15

Nota: Con pin me refiero al pin de un puerto, no al pin físico real en el chip.

¿Por qué TIM9 y no TIM10 o TIM11?

TIM 9 10 y 11 son todos idénticos. Tú eliges cuál quieres. Los STM32 generalmente tienen 3 tipos diferentes de temporizadores (TIM1, TIM2-5, TIM9-11) que tienen características ligeramente diferentes. Tienes que saber lo que necesitas y cuál lo soporta.

Finalmente, quiero habilitar un reloj, así que hago RCC->APB2ENR |= 0x00004000; : 0x00004000 = 0100 0000 0000 0000 => Configuré el bit 16 de este registro que es "habilitar reloj TIM9". ¿Es eso lo que queremos hacer?

Sí, esto es parte de la configuración del temporizador. Esto habilitará el reloj para el temporizador periférico para que pueda funcionar. Aunque el bit 16 es 0x10000 en hexadecimal o 0001 0000 0000 0000 0000 en binario. El temporizador seguirá sin funcionar en este momento. Tienes que hacer más ajustes. La forma de configurar el temporizador se describe en la página 366 y siguientes.