Hallo, Ich versuche mit meinem STM32F4 EVAL Board die RS232 Schnittstelle zu aktivieren und eine Verbindung mit meinem Rechner (per Hyperterminal oder MTTTY) sicherherzustellen. Obwohl dass es ein Signal am TXd Pin der RS232 Connector gibt, wird dies nicht bei Hyperterminal angezeigt. Wäre sehr nett wenn jemand das Problem finden könnte. Danke im Voraus. Mein Beispielcode: Es geht einfach um eine Buchstabe anzuzeigen. #include <stdio.h> #include <stdlib.h> #include <string.h> //#include "system_stm32f4xx.h" //#include "stm32f4xx_conf.h" #include "stm32f4xx.h" #include "stm32f4xx_gpio.h" #include "stm32f4xx_rcc.h" #include "stm32f4xx_usart.h" #include "stm32f4xx_rng.h" //#include <misc.h> void Delay(__IO uint32_t nCount) { while(nCount--) { } } void USART_INIT(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; USART_ClockInitTypeDef USART_ClockInitstructure; /* Enable GPIOC clock */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); /* Enable USART clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); /* Connect PXx to USARTx_Tx*/ GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_USART3); /* Connect PXx to USARTx_Rx*/ GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_USART3); /* Configure USART Tx as alternate function */ GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); /* Configure USART Rx as alternate function */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_Init(GPIOC, &GPIO_InitStructure); UART_InitStructure.USART_BaudRate = 57600; UART_InitStructure.USART_WordLength = USART_WordLength_8b; UART_InitStructure.USART_StopBits = USART_StopBits_2; UART_InitStructure.USART_Parity = USART_Parity_No; UART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; UART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // /* USART Clock Initialization */ /* USART_ClockInitstructure.USART_Clock = USART_Clock_Enable ; USART_ClockInitstructure.USART_CPOL =USART_CPOL_High ; USART_ClockInitstructure.USART_LastBit = USART_LastBit_Enable; USART_ClockInitstructure.USART_CPHA = USART_CPHA_1Edge; */ /* USART configuration */ USART_Init(USART3, &USART_InitStructure); USART_ClockInit (USART3, &USART_ClockInitstructure); /* Enable USART */ USART_Cmd(USART3, ENABLE); } void USART_SEND(char byte) { USART_SendData(USART3,byte); /* Loop until the end of transmission */ while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET){} } void USART_SEND_TEXT(char *buffer) { while (*buffer) { USART_SEND(*buffer); buffer++; } } ************************************************************************ *** int main(void) { SystemInit(); USART_INIT(); char text[20]; while(1) { USART_SEND ("e"); // , zufallszahl) Delay(400000); } }
Wenn es ein Signal am TX-Pin gibt, wieso glaubst Du, daß die Software das Problem ist?
Woran kann es sonst liegen ? Die Verbindung geht direkt über RS232 Connector, ohne USB-RS232 Adapter. Was mir Zweifel macht ist das wenn ich doch 2 Stopbits konfigurieren will, wird trotzdem nur ein Stopbit angezeigt.
falsches rs232 kabel? also wenn du am TX Pin des uC ein korrektes RS232 Signal siehst, dann würde ich das Problem ja eher nicht dort suchen?!
>Was mir Zweifel macht ist das wenn ich doch 2 Stopbits konfigurieren >will, wird trotzdem nur ein Stopbit angezeigt. Wo willst Du was konfigurieren, und wo wird Dir was angezeigt? Was siehst Du wie an welchem TX-Pin, bei welchem Pegel? Ist es so schwierig das Problem etwas genauer zu beschreiben. Du willst doch eine Lösung und kein ungenaues Gelaber, oder?
>Obwohl dass es ein Signal am TXd Pin der >RS232 Connector gibt, wird dies nicht bei Hyperterminal angezeigt. Klingt danach, als ob deine Baudrate nicht stimmt. Sende mal 0x55 oder 0xAA über den Usart und miss die Baudrate mit dem Oszi. Grüsse
> > Wo willst Du was konfigurieren, und wo wird Dir was angezeigt? > Was siehst Du wie an welchem TX-Pin, bei welchem Pegel? Ich sehe das enstsprechende Signal für die gesendete Buchstabe am Oszilloskop, mit einem Pegel von 12V. TX-Pin ist der 3. Pin in der obere Reihe der RS232 Schnittstelle. Ich habe ein andere Kabel verwendet, leider hat es das Problem nicht aufgelöst. Die Konfiguration kann hier folgen: Man kann die Anzahl von Stopbits bestimmen {0,5 1 1,5 2} USART_InitStructure.USART_StopBits = USART_StopBits_2;
Wajdi E. schrieb: > while(1) > { > > USART_SEND ("e"); // , zufallszahl) > > Delay(400000); > > } > } Momentan ist da aber auch noch ein grober Fehler im C-Code: Entweder solltest Du
1 | USART_SEND_TEXT ("e"); |
oder
1 | USART_SEND ('e'); |
benutzen. So wie die es jetzt übergibst sendest Du das Low-Byte des Pointers auf den String "e" und kein 'e'... Es kann also gut sein, dass Du die ganze Zeit nur 0-Bytes sendest... Je nachdem wo im Speicher der String gelandet ist. Gruß Chris
Hi Chris & Gebhardt, Danke. Ich habe es korrigiert aber es wird immer noch nichts bei Hyperterminal angezeigt. Die Baudrate stimmt, ich habe gerade extra überprüft. Habt ihr noch ein Vorschlag voran das liegen soll.
Kannst du mal das Hyperterminal überprüfen, ob das überhaupt richtig konfiguriert ist. Denn irgendwas sollte da auf jeden Fall daherkommen, auch wenn Stop-Bit und was weiss ich noch alles nicht stimmen sollte. Grüsse
Evtl. kannst Du ja schrittweise erst einmal die RS232-Schnittstelle prüfen: Die Pin-Angaben beziehen sich auf den 9-poligen Sub-D-Verbinder. Vorab solltest Du sicherstellen, das Hardware-Handshake aus ist oder ggf. einfach RTS und CTS brücken (Pin 7+8)... 1. Am Rechner RxD+TxD brücken (Pin 2+3) und in HyperTerm mal Zeichen senden - die müssen direkt wieder angezeigt werden, falls nicht: Fehler besteht bereits auf der PC-Seite (z.B. RS232-Schnittstelle, HyperTerm). 2. Das gleiche nochmal am Kabel-Ende... 3. µC vom Pegelwandler trennen und TxD+RxD auf der TTL-Seite des Pegelwandlers (MAX3232 etc) verbinden und nochmal das Ganze... Falls es hier zu Problemen kommt, dann darfst Du beim Pegelwandler suchen. Am besten mal die Test-Bytes vom µC ohne Pause senden. Falls Du eine falsche Baudrate benutzt, dann hast Du bessere Chancen, das trotzdem irgendwas empfangen wird. Ggf. sieh Dir auch mal den Port-Pin mit dem Oszi an - da solltest Du die Übertragung gut sehen können. Ansonsten noch die üblichen Fragen: RxD & TxD evtl. vertauscht bzw. testweise mal getauscht? Benutzt Du einen 3.3V-kompatiblen Pegelwandler (MAX3232)? Viele sind auf 5V TTL-Pegel ausgelegt.
Danke Christoph, Es hat geklappt, es lag am RS232 Kabel. :)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.