HAL UART DMA NDTR-Register

Ich arbeite mit dem stm32f4xx für die Verwendung von UART DMA Tx-Rx-Operationen.

Ich habe diese Zeile erstens:

HAL_UART_Receive_DMA(&huart2,(uint8_t*)dma_rx_buf,DMA_BUF_SIZE);

Dann überprüfe ich das NDTR-Register mit dem folgenden Code: (Ich stoppe den DMA, bevor ich zu diesen Zeilen komme)

valueNDTR = __HAL_DMA_GET_COUNTER(huart->hdmarx);

Manchmal gibt currentValueCDTR 0 zurück.

Und ich habe es unter den Zeilen versucht, ich habe den Wert NDTR = DMA_BUF_SIZE erwartet, aber ich bekomme 0.

HAL_UART_DMAStop(&huart2);
valueNDTR = __HAL_DMA_GET_COUNTER(huart->hdmarx);

Was ist der Grund dafür, dass der NDTR-Wert 0 zurückgibt, DMA ist voll oder ein anderer Grund?

Antworten (1)

NDTR == 0bedeutet, dass die DMA-Übertragung abgeschlossen ist. Ich weiß nicht, wie Sie den USART-Empfangspuffer verarbeiten, aber NDTR == 0Fall weist wahrscheinlich auf einen Fehler hin. Dies kann passieren, wenn mehr Bytes als erwartet in Ihrem USART-Empfänger landen, bevor Sie sie verarbeiten. In diesem Fall stoppt DMA (was eigentlich eine gute Sache ist, weil es verhindert, dass DMA Daten an einen anderen Ort überläuft), und die Bytes im RX-Puffer sind unvollständig oder beschädigt.

NDTR == DMA_BUF_SIZE(unter der Annahme von 1-Byte-Übertragungen) bedeutet, dass keine Bytes empfangen wurden, seit Sie DMA aktiviert haben.

Normalerweise konfiguriert man einen RX-Puffer und DMA NDTR entsprechend der maximal erwarteten Paket-/Rahmengröße. Für die Implementierung des Modbus- Protokolls sollten beispielsweise 256 Byte ausreichen.

Dann konfigurieren Sie einen Interrupt zur Erkennung einer Leerlaufleitung oder einen Modbus-Timeout-Interrupt, um das Ende des Frames zu erkennen. Im USART ISR deaktiviert man DMA und DMA_BUF_SIZE - NDTRgibt die Anzahl der empfangenen Bytes an. Dann verarbeiten Sie den RX-Puffer und aktivieren RX DMA erneut.