STM32-Interrupt wird nicht ausgelöst

Ich verwende einen STM32F103C8T6 (auch bekannt als blaue Pille).

GPIO-Init und Interrupt-Handler:

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);
}

Das Problem ist, dass der Interrupt-Handler (EXTI0_IRQHandler) nie aufgerufen wird. Ich habe es auch mit anderen Pins versucht (zB mit EXTI15_10_IRQHandler). Ich habe den Schalter und die LED separat geprüft (in der Hauptfunktion) und die funktionieren. Ich habe es auch mit PULLUP und PULLDOWN versucht (was keinen Unterschied macht).

Wird mehr benötigt, um die Interrupt-Funktion auszulösen?

nicht sicher, aber ist es vielleicht notwendig, Interrupts global zu aktivieren oder Ihrem spezifischen Interrupt eine Priorität zuzuweisen? Ist EXTI0_IRQneine Konstante oder sollte es so etwas sein EXTI0_IRQ0?
@MarcusMüller Es ist eine Konstante und ich werde prüfen, ob eine Priorität gesetzt wird, danke für die Bemerkung.
@PeterJ Danke ... Ich werde es überprüfen, __HAL_RCC_GPIOA_CLK_ENABLE (); Das habe ich bereits getan (auch für GPIOC und GPIOD.
@Marcus Müller - hattest du jemals Kontakt mit diesen Micros? Ich denke, das hast du nicht
@PeterJ Ich weiß nicht, warum du so unhöflich bist, ich habe ausdrücklich einen vagen Verdacht geäußert. Ja, ich habe vorher mit stm32f1 gearbeitet, aber ohne die klobige HAL-Lib. Entschuldigen Sie, wenn ich nicht die Dokumentation zu allen Mikrocontrollern habe, mit denen ich in meinem Kopf gearbeitet habe.
@Marcus Müller es ist ein allgemeines Wissen über STM-Mikros. 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.die beiden haben nichts gemeinsam. Diese Definitionen sind Teil des CMSIS, das von den Bare-Register-Codierern verwendet wird.

Antworten (1)

Führen Sie die Schritte aus meinem Kommentar aus. Hier ist der Beispielcode. Ich hatte eine andere Hardware-Verbindung, also habe ich andere Pins verwendet.

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;            
    }
}

Ein Pin schaltet auf ein anderes führt aus

Danke für diesen Kommentar, ich benutze HAL, also muss ich zuerst herausfinden, was all diese Zahlen bedeuten (gute Übung für mich). Übrigens, gibt es einen Grund, warum Sie PC13 als Eingang verwenden, da PC13 für mein Board mit einem Ausgang (eingebaute LED) verbunden ist?
Ich habe nur ein Board mit 103, da es sich um eine veraltete Mikrofamilie handelt. Und auf diesem Board habe ich andere Anschlüsse als beim "bluepil". Wechseln Sie einfach zu dem, was Sie haben. Ich wollte Ihnen nur das funktionierende Beispiel geben - also habe ich es auf meiner tatsächlichen Hardware getestet
Als ich nach Hause kam, funktionierte es plötzlich (einzige Änderung: Ich habe das Steckbrett einschließlich stm32 mit dem Auto genommen) ... also war es vielleicht ein elektronisches Problem (Wackeldraht). Aber ich werde Ihr Beispiel studieren, um den Unterschied zwischen Hal und „direkten Anrufen“ zu sehen.
Ich rate ehrlich gesagt zum bloßen Registerweg.
Du meinst wie in 'allen Fällen'? Normalerweise programmiere ich in höheren Sprachen, und bis jetzt gefällt mir, wie Hal funktioniert, aber ich bin wirklich noch am Anfang ... wenn dies durch irgendein 'seltsames Feature' von Hal verursacht wird, dann bin ich wahrscheinlich bald nicht mehr so ​​glücklich mit Hal .
I program in higher level languages?? Mikrocontroller? C oder C++ sind perfekt für die Bare-Register-Programmierung
So habe ich das nicht gemeint ... Ich meine, Hal sieht viel einfacher aus (und verbirgt natürlich ein bisschen die Gedanken dahinter). Seit Februar habe ich mit Arduino (IDE) angefangen, seit letztem Monat STM32, ich komme immer tiefer und tiefer (daran ist nichts auszusetzen, nur mein 'ursprünglich geplantes Projekt' scheint immer weiter entfernt zu sein. Dein Code ist das die Peripheral Library?
Kein SPL ist tot und wird seit Jahren nicht mehr unterstützt. Fügen Sie einfach CMSIS-Header hinzu, laden Sie das Referenzhandbuch herunter und genießen Sie es :)
Ich werde es überprüfen (aber ich werde HAL / CubeMx noch nicht ausschließen)
Für diejenigen, die die Erklärung zu dieser Antwort lesen möchten: embedded-lab.com/blog/stm32-external-interrupt