Hacer una interrupción en un stm32f4xx

1

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

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

Estoy intentando interrumpir la pulsación de un botón (el botón de usuario que está conectado al puerto "PC13" (pin 2) ). Primero, estoy intentando inicializar el botón para que cuando haga clic en él, se 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 hago 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?

Las mismas preguntas con GPIOC->PUPDR &= ~0x3;

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 "TIM9 reloj habilitado". ¿Es eso lo que queremos hacer? ¿Por qué TIM9 y no TIM10 o TIM11?

Muchas gracias!

    
pregunta Thomas Dehaeze

1 respuesta

2
  

¿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 buscarlo en Manual de referencia . Para el registro MODER de la página 153 de PORTC. 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. Tu escritura de GPIOC- > MODER & = ~ 0x3; resultará en que PC0 se configure en entrada. Lo que quieres es GPIOC- > MODER & = ~ (0x3 < < 26); Esto establecerá los bits 26 y 27 a 0, lo que se relaciona con el pin 13.

  

¿Debo configurar otros dos bits de este registro?

Para solo 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 el pin 0, [2: 3] para el pin 1, ... [30,31] para el 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ú elegiste 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 qué necesitas y cuál es compatible con eso.

  

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

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

    
respondido por el Warloxx

Lea otras preguntas en las etiquetas