Habe mit dem CubeMX Code für ein STM32F072 Discovery Board generiert.
Würde jetzt gerne per DMA den UART ansteuern.
Wenn ich nun folgendes mache...
1
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)){
2
HAL_Delay(50);
3
4
for(x=0;x<22;x++){
5
tx_buffer[x]=x;
6
}
7
8
HAL_UART_Transmit_DMA(&huart4,tx_buffer,22);
9
10
for(x=0;x<22;x++){
11
tx_buffer[x]=0xaa;
12
}
13
}
Wenn ich nun den Button drücke werden mir nur 5 Zeichen ausgegeben.
0x00, 0x01, 0xaa, 0xaa, 0xaa
1. Frage: Warum nur 5 Zeichen und nicht 22
2. Frage: Warum werden 0xaa ausgegeben? und nicht 0-21
Naja, du solltest schon dafür sorgen, dass die zu sendenden Zeichen
solange unverändert im Buffer liegen, bis die wirklich gesendet sind.
Mach mal testweise direkt hinter den Aufruf von HAL_UART_Transmit_DMA
ein delay für die gesamte Transferzeit (bei 9600 8N1 also ca. 20mSec).
Wenn jetzt wirklich 50ms delayed wird, ist der Fehler wohl irgendwo
beim DMA-Teil zu suchen.
Ich würde mal pruefen, ob irgendeiner der Callbacks
(UART_DMATransmitCplt, UART_DMATxHalfCplt oder UART_DMAError) aufgerufen
wird.
Hier kann ich allerdings nicht weiterhelfen, ich habe weder Erfahrung
mit HAL noch mit dem STM32 und dessen DMA-Funktionen.
Klären, welche Parameter die Funktion
HAL_UART_Transmit_DMA(&huart4, tx_buffer, 22);
erwartet.
Meine Glaskugel sagt, das mehrere Fehlerquellen möglich sind.
bzw. was ist im Framework ein data buffer.
* @param pData: pointer to data buffer
Die Funktion HAL_UART_Transmit_DMA erzeugt eine Kopie des Zeigers auf
den "data buffer" und gibt ihn weiter. Wird der "data buffer" vom DMA
recycelt, wie ich es mit malloc() und free() in C auf einen PC
programmieren würde?
ist dein dma controller für 22 bytes konfiguriert?
beim richtigen aufsetzten des dmy controllers muss die datenlänge
angegeben werden.
Irgendwo müsste bei der initialisierung so was stehen:
DMA_InitStructure.DMA_BufferSize = 10;
wobei die BufferSize natürlich 22 währe für deine Anwendung ...
so wie das im code ausschaut, wird per dma interrupt geschaut ob noch
weitere daten vorliegen, und diese dan gesendet. das ist aber nicht die
idee von dma! das kannst du auch mit dem tx interrupt von der usart
lösen.
evtl. müsste hier die implementation der STM32Cube software angeschaut
werden?
Und natürlich: der Buffer darf erst überschrieben werden, wenn sicher
ist, dass alles rausgeschickt ist! das nimmt dir dma nicht ab.
Stichwort: doublebuffer oder pingpongbuffer ...
@tiptop
Das hat mich auch gewundert das man die Buffer Size nirgends angeben
konnte.
Hab die "normalen" Beispiele gesehen und da ist es so wie Du geschrieben
hast
der erzeugte Code von CubeMX macht nur folgendes
Hallo zusammen,
ich beschäftige mich gerade mit einer sehr ähnlichen Aufgabe, allerdings
habe ich wohl eine sehr simple Frage: Auf was bezieht sich denn das
hdmatx bzw. hdmarx in __HAL_LINKDMA(huart, hdmarx, hdma_usart1_rx) ?
Wäre toll, wenn mir kurz jemand helfen könnte, ich komme gerade nämlich
echt nicht weiter.
Danke!
Viele Grüße
Marie