Forum: Mikrocontroller und Digitale Elektronik STM32F4 - UART Schnittstelle (HyperTerminal)


von Wajdi E. (djoelo)


Lesenswert?

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);

    }
 }

von spontan (Gast)


Lesenswert?

Wenn es ein Signal am TX-Pin gibt, wieso glaubst Du, daß die Software 
das Problem ist?

von Wajdi E. (djoelo)


Lesenswert?

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.

von A. B. (funky)


Lesenswert?

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?!

von spontan (Gast)


Lesenswert?

>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?

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


Lesenswert?

>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

von Wajdi E. (djoelo)


Lesenswert?

>
> 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;

von Christoph H. (Gast)


Lesenswert?

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

von Wajdi E. (djoelo)


Lesenswert?

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.

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


Lesenswert?

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

von Christoph H. (Gast)


Lesenswert?

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.

von Wajdi E. (djoelo)


Lesenswert?

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
Noch kein Account? Hier anmelden.