STM32 HAL CAN aktualisiert den Wert nicht und stürzt ab, wenn ExtId gesetzt wird

Ich führe mein erstes CAN-Testprogramm mit STM32CubeMX, STM32F103C8T6 und Eclipse aus.

Ich habe die Standard-CAN-Einstellungen in STM32CubeMX verwendet (auch Loopback versucht, aber die Ergebnisse sind gleich).

Was ich sehe (siehe Bild unten), sind zwei Dinge, die ich nicht verstehe;

  • Im Bild unten sehen Sie, dass ich die Linie mit hcan.pTxMsg->StdId = 0x321 (linkes rotes Oval) überschritten habe, aber der aktuelle Wert zeigt 536891392 (rechtes rotes Oval).
  • Wenn ich die nächste Zeile (grün) ausführe: hcan.pTxMsg->ExtId = 0x01, lande ich in einem Hard-Fault-Interrupt:

    /**

    • @brief Diese Funktion verarbeitet Hard-Fault-Interrupts. / void HardFault_Handler(void) { / BENUTZERCODE BEGIN HardFault_IRQn 0 */

      /* BENUTZERCODE ENDE HardFault_IRQn 0 / while (1) { } / BENUTZERCODE BEGIN HardFault_IRQn 1 */

      /* BENUTZERCODE ENDE HardFault_IRQn 1 */ }

Warum wird der Wert nicht aktualisiert und warum erhalte ich einen Hardwarefehler (der Zeiger hcan.pTxMsg ist nicht NULL, da er sogar das Feld StdId anzeigt (er kann sogar ExtId anzeigen, die den Wert 134222077 hat (nicht im Bild unten gezeigt))?

Bildschirmfoto

Nur eine wilde Vermutung, aber haben Sie hcan auf eine gültige Instanz gesetzt (CAN1 oder wie auch immer es in ST heißt)? Ähnlich wie die Nachrichtenzeiger. Wenn sie auf Müll zeigen, könnte so etwas passieren.
@Lundin ... du hast mich in die richtige Richtung gelenkt. Für meine zukünftige Referenz und andere habe ich es als Antwort hinzugefügt. Vielen Dank für Ihren Kommentar.

Antworten (1)

Standardmäßig erstellt STM32CubeMx den Initialisierungscode für „can“ (falls ausgewählt). Dieser Code ist in MX_CAN_Init zu finden und wird von main aufgerufen.

Es weist jedoch nicht die pRxMsg und pTxMsg zu/initialisiert sie nicht.

Die pTxMsg sollte wie folgt definiert werden:

CanTxMsgTypeDef txMessage;
hcan.pTxMsg = &txMessage;

und die pRxMsg als:

CanRxMsgTypeDef rxMessage;
hcan.pRxMsg = &rxMessage;