STM32: DMA Callbacks werden nicht aufgerufen, seltsamer Bug in der Cube-HAL

Gast #5023092
Lesenswert?
• ▲
▼
Hallo,

nach einem Tag festgestellt, warum Code, der früher ging, mit einer 
aktuelleren CubeHAL (STM32Cube FW_F3 V1.8.0, welche CubeMX V4.21.0 heute 
runtergeladen hat) nicht mehr ging:

Ich initialisiere einen DMA, u.a. so:
1
  dmaCC2.XferCpltCallback  = DMA_TransferCompleteHandler;
2
  dmaCC2.XferHalfCpltCallback = DMA_TransferHalfHandler;

und der wird dann aber nicht aufgerufen, und seltsamerweise steht statt 
einem Pointer auf die besagten Funktionen nach der Initialisierung immer 
eine Null in der entsprechenden Struktur drin.

Irgendwann habe ich dann dieses Stück Code gefunden in der 
stm32f3xx_hal_dma.c:
1
HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma)
2
{ 
3
//viel Code
4

5
  /* Clean callbacks */
6
  hdma->XferCpltCallback = NULL;
7
  hdma->XferHalfCpltCallback = NULL;
8
  hdma->XferErrorCallback = NULL;
9
  hdma->XferAbortCallback = NULL;
10

11
//mehr Code
12
}
Kaum kommentiert man das Zeug da aus funktioniert alles wieder...

Mache ich da was grundlegend falsch, oder ist das ein ziemlich doofer 
Bug in der HAL?
Wenn dann gehört das doch, meiner Meinung nach, in die DeInit rein, oder 
wo liegt der Sinn daran, die Callback-Pointer zu definieren und am Ende 
der Initialisierungsfunktion wieder zu nullen, bevor die je aufgerufen 
werden könnten?
Persönliche Seite #5023140
Lesenswert?
• ▲
▼
Robert schrieb:
> Wenn dann gehört das doch, meiner Meinung nach, in die DeInit rein, oder
> wo liegt der Sinn daran, die Callback-Pointer zu definieren und am Ende
> der Initialisierungsfunktion wieder zu nullen, bevor die je aufgerufen
> werden könnten?

Hmm, gute Frage ... Genau könnte man es vmtl erst sagen, wenn du den 
kompletten Code postest :)

Aber HAL ansich hat schon einige Bugs und teilweise fehlen grundlegende 
Initialisierungen, damit irgendetwas überhaupt funktioniert.

Beispielsweise hatte ich das Problem mit DMA, dass zwar DMA ansich 
konfiguriert wurde und die IRQ-Handler angelegt wurden, aber zB der NVIC 
nicht usw ...
Gast #5023145
Lesenswert?
• ▲
▼
Etwas weiter unten in der Datei gibt es die Funktion:
HAL_DMA_RegisterCallback

Wie immer ist es ein Vorteil erst mal einen Blick in die mitgelieferten 
Beispiele zu werfen.

z.B.:
STM32Cube_FW_F3_V1.8.0/Projects/STM32F303RE-Nucleo/Examples/DMA/DMA_FLAS 
HToRAM/Src/main.c
1
  /*##-4- Initialize the DMA channel ##########################################*/
2
  if (HAL_DMA_Init(&DmaHandle) != HAL_OK)
3
  {
4
    /* Initialization Error */
5
    Error_Handler();
6
  }
7
  
8
  /*##-5- Select Callbacks functions called after Transfer complete and Transfer error */
9
  HAL_DMA_RegisterCallback(&DmaHandle, HAL_DMA_XFER_CPLT_CB_ID, TransferComplete);
10
  HAL_DMA_RegisterCallback(&DmaHandle, HAL_DMA_XFER_ERROR_CB_ID, TransferError);

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.