STM32 DMA durch HAL_Delay() geblockt?

OP #4126102
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.
OP #4126768
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren