Forum: Mikrocontroller und Digitale Elektronik STM32 DMA durch HAL_Delay() geblockt?


von Oliver W. (pilzkopf)


Lesenswert?

Hallo zusammen,

Ich arbeite mich zZ in den STM32 ein.
An einem Nucleo103RB hab ich per SPI ein KS0073 Display per SPI 
angeschlossen.
Dazu hab ich eine kleine Lib geschrieben, zu finden hier:
https://github.com/RT-CUSTOMZ/ks0073-spi-driver

Nun will ich auch mal DMA testen und hab eine KS0073_DMA_Test() 
geschrieben. (Der DMA Teil ist im Branch dma)

KS0073_DMA_Test():
1
void KS0073_DMA_Test(void)
2
{
3
  KS0073_DataTypeDef buffer[15];
4
  uint8_t i = 0;
5
  char Test[] = "uuuuuuuuuuuuu";
6
  char * Testptr = Test;
7
  while (*Testptr)
8
  {
9
    DataConvert((uint8_t) *Testptr, KS0073_RW_CLEAR, KS0073_RS_SET, &buffer[i]);
10
    i++;
11
    Testptr++;
12
  }
13
  HAL_SPI_Transmit_DMA(&SPI_Handle, (uint8_t * )&buffer, 4 * (i) );
14
  //\todo fix this :/
15
  while(SPI_Handle.State == HAL_SPI_STATE_BUSY_TX || SPI_Handle.State == HAL_SPI_STATE_BUSY_TX_RX);
16
}
aus 
https://github.com/RT-CUSTOMZ/ks0073-spi-driver/blob/dma/src/ks0073_lcd_drv.c

so funktioniert diese Funktion.

Nun macht die while() Zeile natürlich die Idee von DMA kaputt ;) Lass 
ich die Zeile aber raus, so blockiert mir das HAL_Delay(1000) aus der 
main() irgendwo einen Sprung/Callback.
Auf dem Display erscheinen einige u's, danach kommt Schwachsinn :/ Und 
die Callback-Funktionen für HalfComplete bzw TransferComplete werden 
nicht aufgerufen. Ist die Zeile drin werden sie auch korrekt aufgerufen.

Irgendwas versteh ich da noch nicht :/ Warum kann die HAL_Delay 
überhaupt Callbacks blockieren? Die Callbacks werden aus der ISR der des 
DMA aufgerufen und der ist an? Wenn die while()-Zeile da ist, wird 
korrekt der KS0073_DMA_TX_IRQHandler() angesprungen.

Irgendwo versteh ich da die Architektur noch nicht.

Danke an alle Antworten im Vorraus.

von Jim M. (turboj)


Lesenswert?

Oliver W. schrieb:
> Auf dem Display erscheinen einige u's, danach kommt Schwachsinn

Das liegt daran, dass buffer[] auf dem Stack liegt und nach Verlassen 
der Funktion überschrieben wird. Versuche es mal mit
1
static KS0073_DataTypeDef buffer[15];

von Oliver W. (pilzkopf)


Lesenswert?

Vielen Dank, stand hier wie der Ochs vorm Berg.

So schnell kanns gehen ;) Läuft 1a, nachher mal weiter basteln. Komm 
dann auf dich zurück ;)

PS: Manchmal möchte man ja schon wissen, was nun wieder gelöscht wurde. 
Da oben steht weder was von Arduino noch sonst einem der typischen 
Flame-Gründe?

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.