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.