www.mikrocontroller.net

Forum: Mikrocontroller und Elektronik STM32F4 USART1


Autor: Moritz M. (avrprogger)
Datum:

Hallo,

hat jemand ein einfaces Bespiel für die USART1 Schnittstelle am
stm32f407vgt6? Am besten, wenn einfach nur nen Zeichen gesendet wird
ohne Interrupts, DMA, oder so erstmal rx/tx is doch dann am PA10/PA9
oder?

MAX3232 geht doch dann damit oder?

fang gerade mit den stm32f4 an

Moritz
Autor: Markus Müller (mmvisual)
Datum:

In der Peripherie Lib von ST gibt es Demo Code für den UART, 4
Beispiele.
Autor: Moritz M. (avrprogger)
Datum:

Hallo

erstmal vielen dank für die Antwort.

Ich kenn die Beispiele aber die sin alle mit nem Evalution. und dann
gibt es dabei immer funktionen die ich nicht kenne die das initalisieren
übernehmen aber mir geht es ja darum zu lernen die schnittstelle zu
initalisiren.
außerdem is dabei immer irgentwas mit interrupt oder dma oder smartcard
oder so.
Moritz
Autor: Dennis P. (dennisp)
Datum:

Hier der Init Code für USART3. Für USART 1 musste nur die entsprechenden
Pins ändern. Die ganzen USART können auf verschiedenen Pins laufen z.B.
für USART 1 PA9/10 oder PB6/7. Es werden die entsprechenden Pins
genommen die du in dem untenstehenden Code siehst/einstellst. Bedenke
USART1 hängt am APB2!
   USART_InitStructure.USART_BaudRate = 115200;
   USART_InitStructure.USART_WordLength = USART_WordLength_8b;
   USART_InitStructure.USART_StopBits = USART_StopBits_1;
   USART_InitStructure.USART_Parity = USART_Parity_No;
   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

   //   GPIO_InitTypeDef GPIO_InitStructure;

   //configure clock for USART
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
    //configure clock for GPIO
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
    //configure AF
    GPIO_PinAFConfig(GPIOC,GPIO_PinSource10,GPIO_AF_USART3);
    GPIO_PinAFConfig(GPIOC,GPIO_PinSource11,GPIO_AF_USART3);

    //configure ports, &GPIO_InitStructure);

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

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    USART_Init(USART3, &USART_InitStructure);

     /* Enable USART */
     USART_Cmd(USART3, ENABLE);

senden:
    while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);
    USART_SendData(USART3, hier der Buchstabe);
Empfangen:
    while (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET);
    buchstabe = USART_ReceiveData(USART3);
Autor: Moritz M. (avrprogger)
Datum:

Hallo,

cool genau sowas habe ich gesucht!

Wo werden genau die Pins für die Schniitstelle eingestellt unter
"//configure AF"? wie wird eingestelt welcher pin rx oder tx ist?

Moritz
Autor: Dennis P. (dennisp)
Datum:

Ja welcher (mögliche) Pin für den jeweiligen Uart genutzt wird, wird bei
AF eingestellt. Welcher TX und welcher RX ist findest du in den
Datenblätter z.B. beim STM32F4Discovery manual. Ebenso steht dort auch
welcher Pin mit welchen Funktionen belegt werden kann. In der Regel ist
Tx der mit niedrigen Pin.
Autor: Moritz M. (avrprogger)
Datum:

Ah, sorry hab ich falsch verstanden, also man kann sich zwischen
verschiedenen Möglickeiten, die von ST vorgegeben sind, entscheiden und
die Pins nicht frei wählen, richtig? also für USART1 PA9/10 oder PB6/7

Moritz
Autor: Dennis P. (dennisp)
Datum:

Ja das ist richtig so. Auf Seite 19 findest du z.B. einen Überblick was
die Pins an Funktionen haben.

http://www.st.com/internet/com/TECHNICAL_RESOURCES...
Autor: Moritz M. (avrprogger)
Datum:

Hallo

ich hab den oben genannten quellcode ausprobiert doch es kommt immer nur
müll raus? woran könnte dass liegen? Muss man der Funktion den ASCII
Code übergeben? -> Dann kommt aber auch nur müll raus.

Moritz
Autor: Moritz M. (avrprogger)
Datum:

Hallo,

brauch mann vieleicht noch extra hardware ausser max3232?
ich neme 9600 Baud/geht das?
Autor: Roland H. (batchman)
Datum:

Dennis P. schrieb:
> Hier der Init Code für USART3. Für USART 1 musste nur die entsprechenden
> Pins ändern. Die ganzen USART können auf verschiedenen Pins laufen z.B.
> für USART 1 PA9/10 oder PB6/7.

PA9/PA10 könnte mit USB kollidieren,
PB6 evtl. mit dem Audio-DAC.

Besser USART2 oder 3 verwenden. Die restlichen USARTs sind alle
irgendwie "tangiert".

Hat das schon mal jemand mit USART 1, 4 oder 5 probiert?

Moritz M. schrieb:
> brauch mann vieleicht noch extra hardware ausser max3232?
> ich neme 9600 Baud/geht das?

Die Kondensatoren am max.
9600 ... hängt vom Takt und vom Vorteiler ab.
Beitrag #2476866 wurde vom Autor gelöscht.
Autor: Moritz M. (avrprogger)
Datum:

Ah, jetzt gehts wunderbar
usart1 gig wiklich nicht wegen usb oder so.

usart3 geht jetz (muss halt nur einstellen(das hse_value 8Mhz sind und
nicht 25)

Vielen Dank an alle für die Hilfe!

Moritz
Autor: Dennis P. (dennisp)
Datum:

Es muss auch in der system_stm32f4xx.c Datei der Wert PLL_M von 25 auf 8
gestellt werden. Sonst läuft der Core nicht mit den 168MHz sondern halt
mit ca 50MHz.
Ebenso muss der HSE_VALUE in der stm32f4xx.h von 25000000 auf 8000000
gestellt werden (wenn man das STM32F4Discovery Board nimmt).

P.S. Ich benutz den USART1 auf PB6/7 ohne Probleme.
Autor: Moritz M. (avrprogger)
Datum:

Hallo,

ja hab ich auch gemerkt aber es ging trotzdem mit 50 MHz
Autor: Roland H. (batchman)
Datum:

Dennis P. schrieb:
> P.S. Ich benutz den USART1 auf PB6/7 ohne Probleme.

Das kann schon sein, die Frage ist nur: Mit oder ohne Audio-DAC?

PB6 ist mit "Audio_SCL" verbunden ?!
Autor: Dennis P. (dennisp)
Datum:

Ja das ist richtig. Da ich das Audio Zeug nicht brauch, hab ich dort den
UART rangehangen. Ich hab aktuell Ethernet (RMII) und ne SD-Karte (SDIO)
dran. Geplant ist noch ein 16bit LCD (dafür müssen aber paar Widerstände
rausgelötet werden) sowie ein paar Elemente die über SPI angesprochen
werden. Genau geplant hab ich das noch nicht, da ich erst seit gut 2
Wochen mit den STM32F4 Prozessort rumprobiere (bzw. erster 32bit
Prozessor). Davor hatte ich nur mit den Atmel 8bit µC rumgespielt.
Autor: Roland H. (batchman)
Datum:

Dennis P. schrieb:
> Ja das ist richtig. Da ich das Audio Zeug nicht brauch, hab ich dort den
> UART rangehangen.

D. h. ohne HW-technische Änderung am Discovery?

Dennis P. schrieb:
> Ich hab aktuell Ethernet (RMII) und ne SD-Karte (SDIO)
> dran.

Jetzt wird's interessant.

- Welche Pins sind für Ethernet nötig?  Mit/ohne HW-technischen
Änderungen am Discovery? Welches PHY?

- Analog für die SD-Karte mittels SDIO: Welche Pins? Mit/ohne
HW-technischen Änderungen am Discovery?
Autor: Dennis P. (dennisp)
Datum:
Angehängte Dateien:

Alle bisher ohne HW Änderungen am Board.
Hab mal ein Foto vom fliegenden Aufbau angehängt.

USART1:
USART1_TX    PB6
USART1_RX    PB7
Hinweis: der Audio DAC ist damit nichtmehr nutzbar

SDIO:
SDIO_D0            PC8
SDIO_D1            PC9
SDIO_D2            PC10
SDIO_D3            PC11
SDIO_CK            PC12
SDIO_CMD           PD2
Hinweis: der Audio DAC ist damit nichtmehr nutzbar
Geschwindigkeit mit einer µSD Karte: um die 6MB/s lesen und 3,5MB
schreiben



Ethernet (RMII) mit einem DP83848 Board (bei Ebay gekauft aus China)

MII_TX_EN                  PB11
MII_TXD0                   PB12
MII_TXD1                   PB13
MII_RXD1                   PC5
MII_RXD0                   PC4
MII_RX_DV/RMII_CRS_DV      PA7
MII_RX_CLK/RMII_REF_CLK    PA1
MII_MDC                    PC1
MII_MDIO                   PA2

Heinweis: Damit ist der MEMS Sensor nichtmehr nutzbar.

Mit dem Ethernet (und LwIP) spiele ich grade noch rum um den http Server
von der SD-Karte laufen zu lassen. Geplant ist noch ein FTP Server.

Grüße
Autor: Jörg B. (joerg-sh)
Datum:

Hallo Dennis,
hast du auch schon was am SPI hängen und dafür eine einfache
Initialisierung?

Diese Beispiele von ST sind so was von überladen. Da hat man es als
Anfänger echt sehr schwer.

Gruß

Jörg
Autor: Dennis P. (dennisp)
Datum:

Hallo Jörg,

nein hab ich bisher nicht. Vielleicht wirst du bei Google fündig.

Grüße
Dennis
Autor: Gerhard G. (xmega)
Datum:

Hallo,

schau mal hier:

Projekt: STM32F4-Discovery mit DOGM128 (SPI)

http://www.basteln-mit-avr.de/index.html
Autor: Andy (Gast)
Datum:

Hallo,
ich habe diesen Thread durch Google entdeckt und es trifft auch mein
Problem ganz gut. Daher hoffe ich, ihr könnt mir vielleicht helfen.

Ich versuche per USART3 Daten von einigen Sensoren an den Rechner zu
übertragen. Dazu habe ich einen FTDI USB-UART Board an den Pins PD8 und
PD9 mit dem STMF4 Discovery Kit verbunden. Wenn ich allerdings Daten
übertragen möchte, kommt nur Quatsch beim Rechner an und auch umgekehrt.
Ich habe schon versucht einfach ein Zeichen zu senden, aber auch dann
kommt was komplett anderes am Rechner an. Ich habe auch schon alle
Baudratenkombinationen ausprobiert und bin mittlerweile völlig
ahnungslos, wo der Fehler sich versteckt haben könnte.
Anbei meine Init- und Send-Funktion.
void Usart3Init(void){

  GPIO_InitTypeDef GPIO_InitStructure;

  USART_InitTypeDef USART_InitStructure;

  USART_InitStructure.USART_BaudRate = 9600;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  //   GPIO_InitTypeDef GPIO_InitStructure;
  //configure clock for USART
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
  //configure clock for GPIO
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
  //configure AF
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource8,GPIO_AF_USART3);
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource9,GPIO_AF_USART3);

  //configure ports, &GPIO_InitStructure);
  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_8;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

  USART_Init(USART3, &USART_InitStructure);

  // Enable USART
  USART_Cmd(USART3, ENABLE);
}
void SendUart (uint8_t byte) {
  while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);  
  USART_SendData(USART3, byte);    
}

Gruß Andy
Autor: Jörg B. (joerg-sh)
Datum:

Systemtakt der MCU richtig eingestellt? Discovery hat nur 8 MHz
Autor: G. G. (g_g)
Datum:

Hallo,


USART_FLAG_TXE: Transmit data register empty flag
USART_FLAG_TC: Transmission Complete flag


nimm mal USART_FLAG_TC, so funktioniert das bei mir!

Gruß xmega
Autor: Andy (Gast)
Datum:

Hey, das ging ja fix mit den Antworten. Danke schon mal dafür.

@Jörg
Den Systemtakt hab ich über HSE_VALUE in der stm32f4xx.h auf 8 MHz
eingestellt und PLL_M in der system_stm... hab ich ebenfalls auf 8
gesetzt.

@xmega
Das mit dem USART_FLAG_TC hab ich dann jetzt mal ausprobiert, kommt aber
ebenfalls nichts sinnvolles am Rechner an.

Ich hab jetzt mal ein paar verschiedene Daten vom Board an den Rechner
gesendet, um zu überprüfen, was denn so an kommt. Dazu habe ich einmal
das Alphabet durchlaufen lassen. Zunächst werden aus einem gesendeten
Zeichen vom Board, am Rechner immer zwischen zwei und drei. Auffällig
ist dabei, dass es immer die vier gleichen Zeichen sind, nur in anderer
Reihenfolge, 0xFC, 0x1C, 0xE0 und 0x00. Vielleicht hilft das ja bei der
Diagnose.
Autor: Andy (Gast)
Datum:

Juhuuuu, ich habs hin bekommen!!!

Weil es fast immer drei empfangene Zeichen bei einem gesendeten waren,
dachte ich mir, mach doch mal die Sendebaudrate einfach drei mal höher
als die Empfangsrate und tada!!! Schon läufts wie erwartet.

Aber die Erklärung dafür kann ich nicht liefern. Vielleicht weiß ja
jemand die Antwort.
Autor: Fummler (Gast)
Datum:

Würd mich auch mal interessieren.
Autor: cd334 (Gast)
Datum:

Hello Alle!

Bei STM32F4 Discovery ist auf der PA9 ein 4.7uF Kondensator(C49).
Um die UART1 mit PA9/PA10 korrekt zu funktionieren, muss man diese
kondensator entlöten, oder eine andere UART suchen.

cd334

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net