Machen Sie einen Interrupt auf einem stm32f4xx

Ich bin neu bei Cortex M4 und programmiere auf einem Mikrocontroller. Ich lerne noch die Grundlagen.

Ich verwende dieses Board ( stm32f411re ), hier ist das Referenzhandbuch .

Ich versuche, auf Knopfdruck einen Interrupt zu machen (die Benutzertaste, die mit dem "PC13" -Port (Pin 2) verbunden ist ). Zuerst versuche ich, die Schaltfläche zu initialisieren, damit beim Klicken darauf eine Ausnahme ausgelöst wird.

Hier ist mein Code:

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
}
  • Hier sind meine Fragen:

Liege ich mit dieser Rechnung richtig ~0x3 = ~(0000 0011) = 1111 1100?

Wenn ich das tue GPIOC->MODER &= ~0x3;, setze ich dann die ersten Bits dieses Registers auf 00 (Eingabemodus)?

Soll ich andere zwei Bits dieses Registers setzen? Woher weiß ich, welche zwei Bits dieses Registers mit meiner Schaltfläche verknüpft sind?

Gleiche Fragen mitGPIOC->PUPDR &= ~0x3;

Schließlich möchte ich eine Uhr aktivieren, also mache ich RCC->APB2ENR |= 0x00004000;: 0x00004000 = 0100 0000 0000 0000=> Ich setze das 16. Bit dieses Registers, das "TIM9 clock enable" ist. Ist es das, was wir tun wollen? Warum TIM9 und nicht TIM10 oder TIM11?

Vielen Dank!

Sie sollten sich die STM Cube-Software ansehen, mit der Sie viel davon überspringen können.
Es gibt viel zu viele magische Zahlen in deinem Code. ST stellt Header-Dateien bereit, sodass Sie auf alle diese Bits über ihre Namen zugreifen können.
@TurboJ Ich wollte alles von Hand machen, um sicherzustellen, dass ich alles verstehe. Weil ich es wirklich nicht mag, Dinge zu benutzen, die ich nicht verstehe. Aber wenn ich das Konzept habe, werde ich natürlich versuchen, mehr Aliase zu verwenden. Vielen Dank für den Rat!

Antworten (1)

Liege ich mit dieser Rechnung richtig ~0x3 = ~(0000 0011) = 1111 1100 ?

Fast, stm32 ist ein 32-Bit-Prozessor, also wird es sein: 1111 1111 1111 1111 1111 1111 1111 1100

Wenn ich also GPIOC->MODER &= ~0x3; mache, setze ich die ersten Bits dieses Registers auf 00 (Eingabemodus)?

Die Beschreibung der einzelnen Register finden Sie in diesem Referenzhandbuch . Für das MODER-Register von PORTC siehe Seite 153. Es zeigt, dass jede 2-Bit-Gruppe des Registers die Eigenschaften eines bestimmten Pins an diesem Port festlegt. '00' ist für die Eingabe, wie auf der nächsten Seite angegeben. Ihr Schreiben von GPIOC->MODER &= ~0x3; führt dazu, dass PC0 auf Eingang gesetzt wird. Was Sie wollen, ist GPIOC->MODER &= ~(0x3 << 26); Dadurch werden Bit 26 und 27 auf 0 gesetzt, was sich auf Pin 13 bezieht.

Soll ich andere zwei Bits dieses Registers setzen?

Für nur diesen einen Pin müssen Sie nicht mehr in dieses spezielle Register schreiben.

Woher weiß ich, welche zwei Bits dieses Registers mit meiner Schaltfläche verknüpft sind?

Auf Seite 154 heißt es

Bits 2y:2y+1 MODERy[1:0]: Port x Konfigurationsbits (y = 0..15)

Dies gibt Ihnen das Verhältnis von Pin zu Bits im Register

[0:1] für Pin 0, [2:3] für Pin 1, ... [30,31] für Pin 15

Hinweis: Mit Pin meine ich den Pin eines Ports, nicht den tatsächlichen physikalischen Pin auf dem Chip.

Warum TIM9 und nicht TIM10 oder TIM11?

TIM 9 10 und 11 sind alle identisch. Sie haben gewählt, welche Sie möchten. STM32s haben normalerweise 3 verschiedene Arten von Timern (TIM1, TIM2-5, TIM9-11), die leicht unterschiedliche Eigenschaften haben. Man muss wissen, was man braucht und welches das unterstützt.

Schließlich möchte ich eine Uhr aktivieren, also mache ich RCC->APB2ENR |= 0x00004000; : 0x00004000 = 0100 0000 0000 0000 => Ich setze das 16. Bit dieses Registers, das "TIM9 clock enable" ist. Ist es das, was wir tun wollen?

Ja, dies ist Teil der Einrichtung des Timers. Dadurch wird die Uhr für das Timer-Peripheriegerät aktiviert, sodass es überhaupt laufen kann. Obwohl Bit 16 0x10000 in Hex oder 0001 0000 0000 0000 0000 in Binär ist. Der Timer läuft in diesem Moment noch nicht. Sie müssen mehr einrichten. Wie Sie den Timer einstellen, ist ab Seite 366 beschrieben.