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

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.