STM32F4 - UART Schnittstelle (HyperTerminal)

OP #3010558
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);

    }
 }
Gast #3010639
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?
(Firma: Raich Gerätebau & Entwicklung) #3010653
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
OP #3010658
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;
Gast #3010671
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
Gast #3010816
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.