Hi,
ich sitze gerade an einem STM32F103VCT6 mit PL2303.
Die Elektronik funktioniert, die Demo-Applications zum Board laufen
tadellos, auch die zum USART.
Senden mittels dieser Funktionen funktioniert. Beim Empfangen bekomme
ich nur wahllose Zeichen, auch wenn ich die ganze Zeit das Selbe sende.
Hier die USART-Routinen,
init:
Ich sitze da jetzt schon ein Weilchen dran und komme nicht auf die
Lösung...
Der IRQ-Handler wird aufgerufen und er sendet auch, jedoch jedesmal
"random"-Zeichen.
Hier die Ausgabe, ich habe die ganze Zeit auf 'a' gedrückt im Terminal:
Nils schrieb:> void USART1_IRQHandler(void) {> char c;>> if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {> // c = (char)USART_ReceiveData(USART1);> c = usart1_getc();>> USART_SendData(USART1, c);> }> }
Setze mal bitte das Flag RXNE auch direkt in der ISR zurück.
Benutze USART_SendData() nicht direkt in der ISR, und reduiziere zu
Testzwecken mal die Baudrate. Ich will dir auch nicht verschweigen, das
die sch31$$ Prolific Wandler hier immer arge Probleme gemacht haben.
Teste also am besten auch mal ein direktes Loopback von TXD zu RXD.
Hehe, ja das Problem mit den Profilic-Wandlern kenne ich gut und Rx/Tx
brücken habe ich als erstes ausprobiert, aber vergessen vorhin zu
schreiben.
Ebenso habe ich den Code auf zwei anderen identischen Boards
ausprobiert.
Ein angeschlossenes Oszi an Tx und 0x55 sowie 0xAA (bin: 0101... /
1010...) in einer Schleife gesendet bringt mir keine 01010101...-Muster,
sondern wie auf der Terminalausgabe, wirre Zeichen.
Ich habe die jetzt nicht verglichen, kein Speicheroszi, wird sehr
aufwendig, aber es sieht wirklich so aus, als ob der Controller diese
Zeichen sendet.
Zurücksetzen auf 19200 und 9600 Baud hat auch nicht funktioniert, selbes
Ergebnis.
Setze ich in der ISR das Bit zurück, dann bekomme ich wiederum das selbe
seltsame Ergebnis.
In anderen Implementationen von USART-Treibern im Netz wird
USART_SendData auch in der ISR verwendet, z.B. hier
http://pandafruits.com/stm32_primer/stm32_primer_uart.php
So wie es aussieht wird die ISR dauer-befeuert. Ich habe ein
usart_putc('>') in die ISR eingefügt und mein Terminalfenster ist sofort
voll mit spitzen Klammern...
Nils schrieb:> So wie es aussieht wird die ISR dauer-befeuert.
Genau das ist das Symptom, wenn man nicht sofort das anfordernde Bit
zurücksetzt, hat mich zumindest beim GPIO Interrupt auch schon mal ne
Stunde gekostet. Es reicht auch nicht, das irgendwo im Hauptprogramm
oder woanders zu machen, die ISR sitzt dann ständig auf der Leitung.
> gpio_i.GPIO_Mode = GPIO_Mode_IN_FLOATING;
Stell das auch mal auf Pullup und sorge dafür, das am RXD Pin nix
passiert. Wird die ISR dann auch immer noch gezündet?