Forum: Mikrocontroller und Digitale Elektronik STM32: DMA Callbacks werden nicht aufgerufen, seltsamer Bug in der Cube-HAL


von Robert (Gast)


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?

von Mampf F. (mampf) Benutzerseite


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 ...

: Bearbeitet durch User
von pegel (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.