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
}
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!
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.
Daniel
TurboJ
tdehaeze