STM32 HAL USART per interrupt
Habe ich einige Probleme empfangen von Daten über den USART. Was ich eigentlich erreichen möchte ist, dass ich empfangen kann, einen Befehl über USART mit keine bestimmte Länge (maximal mögliche Länge). Also ich benutze die interrupt-routine, um zu überprüfen jedes Zeichen empfangen, aber ich habe irgendwie noch nicht das erreichen können, was ich will. Die routine wird jedes mal aufgerufen, wenn ich einen neuen Charakter, aber irgendwie HAL_UART_Receive_IT(&huart1,rx_data,buff_size_rx) aktualisiert nicht in Echtzeit, dann sehe ich nicht die empfangenen Zeichen wenn ich rx_data[pointer], aber wenige Zeit später ist es in der rx_data Puffer.
Was ich habe, so weit:
int pointer =0;
...
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
if ( USART1->ISR & UART_IT_TXE) {
}
if ( USART1->ISR & UART_IT_RXNE) {
HAL_UART_Receive_IT(&huart1,rx_data,buff_size_rx);
if(rx_data[pointer]=='\0') {
pointer=0;
readCommand(rx_data);
clearBuffer(rx_data,buff_size_rx);
} else {
pointer++;
if(pointer>=buff_size_rx) {
pointer=0;
}
}
}
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}
Was meinst du mit dublicating der Puffer-Implementierung? Ich möchte erreichen, das im HAL, aber ich habe wirklich keine Lösung gefunden noch. DMA wäre schön, aber dort muss ich eine Feste Länge für jeden Befehl, oder verwenden Sie ein Zeitlimit, das nicht unterstützt wird von HAL für ein STM32F303K8T6.
Hal tut es. Sie sollten nichts mit dem buffet, wenn du hal benutzen. Ich würde es umsetzen nackten Widerständler selbst, aber es ist dein code, ohne diese dumme Bibliothek. Wie lange Ihre Nachrichten sind? Wenn kurz es gibt keinen Punkt, der DMA.
Auch die Nachrichten sind nur rund 16 Zeichen. Wenn ich nur HAL_UART_Receive_IT, schreibt er die Zeichen der rx_data Puffer, aber ich habe dann nie sehen, wenn ich erhielt ein null-Zeichen und es wirkt wie ein ring-Puffer, die nur für eine Feste Länge.
Haben Sie einen Blick auf den code, den ich verwenden, um zu erhalten, beliebige GPS-Daten here. Es nutzt HAL aber Verknüpfungen der interrupt. Wenn ich es wieder tun würde ich dump HAL und gehen mit Ebene CMSIS.
InformationsquelleAutor HansPeterLoft | 2017-09-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
HAL_UART_Receive_IT()
ist nicht dazu gedacht, genannt zu werden, aus einem interrupt-handler, der Weg, sondern zu initiieren, erhalten einen festen Anzahl der bytes, die über den interrupt.Eine mögliche Problemumgehung überprüfen Sie Ihre Eingabe-Puffer nach
HAL_UART_IRQHandler()
abgeschlossen ist, D. H. in der/* USER CODE BEGIN USART1_IRQn 1 */
Abschnitt. Wenn ein Befehl verarbeitet wird, können Sie resetpRxBuffPtr
undRxXferCount
im Griff-Struktur zu Ihren ursprünglichen Werten zu starten, von Beginn des Puffers wieder.Andere
schrecklichmögliche Abhilfe wäre zu nennenHAL_UART_Receive_IT()
mit einer Puffer-Größe von 1, und die Einrichtung einesHAL_UART_RxCpltCallback()
handler, überprüft das empfangene byte jedes mal, und fordertHAL_UART_Receive_IT()
wieder, wenn nötig.Natürlich könnte man es tun, ohne zu HAL, als PeterJ und andere (immer) vorschlagen.
UART->BRR
Wert nach der Referenz Handbuch, oder kopieren Sie den jeweiligen code von hal.UART->CR1=USART_CR1_RE|USART_CR1_TE|USART_CR1_UE|USART_CR1_RXNEIE;
Jetzt, sind Sie immer unterbricht.UART->SR
in eine temporäre variable ist, und untersuchen Sie es.UART->DR
wenn es ein empfangenes byte warten, tun die Fehlerbehandlung anders (später).Interrupt-Antwort und die Bearbeitungszeit ist oft kritische in embedded-Anwendungen, und die HAL nur verschwendet viel.
aufgerufen wird in der HAL IRQ-handler. Hast du jemals gesehen, wie dieser handler ist implementiert. Mit dieser Funktion wird die phisical Lesen Sie aus der U(S)ART und legt die Daten in den Empfangspuffer. Schreckliche Umsetzung sowieso.
In die HAL-version? Ich habe ein paar Versionen Rum liegen auf meiner Festplatte, aber
HAL_UART_Receive_IT()
wird nie genannt in denHAL_UART_IRQHandler()
oder sonst irgendwo in der HAL-Bibliotheken. Das eigentliche Lesen derUSART->DR
registrieren Sie tritt inUART_Receive_IT()
(ohneHAL_
Präfix), die als static deklariert, jedoch nicht über das user-Programm.setzen Sie an den Anfang (ein Zeiger) und Länge von Ihrem Empfangs-Puffer.
InformationsquelleAutor berendi
Den normalen HAL-Bibliothek ist nicht nützlich für die kontinuierliche Rezeption oder Befehle mit unterschiedlicher Länge.
Wenn Sie die komplette HAL-Paket installiert ist, sehen Sie an den Beispielen für die LowLevel-Schnittstelle.
Die wichtigste Sache ist, um Sie usart kontinuierlichen Empfang:
Den USART-ES-Handler Aussehen sollte
Die Letzte Sache, die Sie zum einrichten der Callback -
Wo könnte man die bytes in einen Puffer und Griff es in der main-loop oder wo Sie wollen.
InformationsquelleAutor theSealion