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
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
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!
1 | USART_InitStructure.USART_BaudRate = 115200; |
2 | USART_InitStructure.USART_WordLength = USART_WordLength_8b; |
3 | USART_InitStructure.USART_StopBits = USART_StopBits_1; |
4 | USART_InitStructure.USART_Parity = USART_Parity_No; |
5 | USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; |
6 | USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; |
7 | |
8 | // GPIO_InitTypeDef GPIO_InitStructure;
|
9 | |
10 | //configure clock for USART
|
11 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); |
12 | //configure clock for GPIO
|
13 | RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); |
14 | //configure AF
|
15 | GPIO_PinAFConfig(GPIOC,GPIO_PinSource10,GPIO_AF_USART3); |
16 | GPIO_PinAFConfig(GPIOC,GPIO_PinSource11,GPIO_AF_USART3); |
17 | |
18 | //configure ports, &GPIO_InitStructure);
|
19 | |
20 | GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; |
21 | GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; |
22 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; |
23 | |
24 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; |
25 | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; |
26 | GPIO_Init(GPIOC, &GPIO_InitStructure); |
27 | |
28 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; |
29 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; |
30 | GPIO_Init(GPIOC, &GPIO_InitStructure); |
31 | |
32 | USART_Init(USART3, &USART_InitStructure); |
33 | |
34 | /* Enable USART */
|
35 | USART_Cmd(USART3, ENABLE); |
senden:
1 | while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET); |
2 | USART_SendData(USART3, hier der Buchstabe); |
Empfangen:
1 | while (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET); |
2 | buchstabe = USART_ReceiveData(USART3); |
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
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.
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
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/TECHNICAL_LITERATURE/USER_MANUAL/DM00039084.pdf
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
Hallo, brauch mann vieleicht noch extra hardware ausser max3232? ich neme 9600 Baud/geht das?
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.
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
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.
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 ?!
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.
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?
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
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
Hallo Jörg, nein hab ich bisher nicht. Vielleicht wirst du bei Google fündig. Grüße Dennis
Hallo, schau mal hier: Projekt: STM32F4-Discovery mit DOGM128 (SPI) http://www.basteln-mit-avr.de/index.html
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.
1 | void Usart3Init(void){ |
2 | |
3 | GPIO_InitTypeDef GPIO_InitStructure; |
4 | |
5 | USART_InitTypeDef USART_InitStructure; |
6 | |
7 | USART_InitStructure.USART_BaudRate = 9600; |
8 | USART_InitStructure.USART_WordLength = USART_WordLength_8b; |
9 | USART_InitStructure.USART_StopBits = USART_StopBits_1; |
10 | USART_InitStructure.USART_Parity = USART_Parity_No; |
11 | USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; |
12 | USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; |
13 | |
14 | // GPIO_InitTypeDef GPIO_InitStructure;
|
15 | //configure clock for USART
|
16 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); |
17 | //configure clock for GPIO
|
18 | RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); |
19 | //configure AF
|
20 | GPIO_PinAFConfig(GPIOD,GPIO_PinSource8,GPIO_AF_USART3); |
21 | GPIO_PinAFConfig(GPIOD,GPIO_PinSource9,GPIO_AF_USART3); |
22 | |
23 | //configure ports, &GPIO_InitStructure);
|
24 | GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; |
25 | GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; |
26 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; |
27 | |
28 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; |
29 | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; |
30 | GPIO_Init(GPIOD, &GPIO_InitStructure); |
31 | |
32 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; |
33 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; |
34 | GPIO_Init(GPIOD, &GPIO_InitStructure); |
35 | |
36 | USART_Init(USART3, &USART_InitStructure); |
37 | |
38 | // Enable USART
|
39 | USART_Cmd(USART3, ENABLE); |
40 | }
|
41 | void SendUart (uint8_t byte) { |
42 | while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); |
43 | USART_SendData(USART3, byte); |
44 | }
|
Gruß Andy
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
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.
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.
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
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.