Hallo,
ich setze gerade ein neues Projekt auf und bin schon am verzweifeln. Die
Initialisierung des UART (STM32F103RB) funktioniert nicht.
Während des ladens (OLIMEX OCD mit Board von OLIMEX) kommen kurz einige
Zeichen und dann ist Stille.
Hier der wichtigste Code.
Auf ersten Blick sollte das funktionieren, weiß allerdings nichts über
RCC_Configuration();
Am besten die Geschichte auf dauersenden stellen (z. B. 0xAA senden) und
mit dem Oszi mal die Baudrate kontrollieren.
Grüße
wird bei der Zuweisung an das USARTx->DR nichts hineingeschrieben. Also
wenn ich beim Debuggen einen schritt drüber bin dann hat das Register
keinen Wert. Anbei hänge ich noch ein Bild von meinen Einstellungen an.
Da ist auch zu sehen dass das Register leer ist :-(
Ich hoffe es kann mir wer weiterhelfen
danke schon mal im Vorraus
Lg
Markus
Offen hängender Kommentar.
Da DR eigentlich 2 Register darstellt, eines pro Richtung, und ausserdem
der Inhalt der sendenden Richtung u.U. sofort ins Schieberegister
wandert, hat ein Debugger Probleme, den Inhalt wie von dir erwartet
anzuzeigen.
Manche Pins mit mehreren Zusatzfunktionen sind etwas verknotet. Siehe
Errata.
OK verstehe... Ich hab aber den Pin schon ans Oszi gehängt so wie es
schon vorgeschlagen worden ist und ich musste leider feststellen das der
Tx Pin auf +2,5 V geschalten wird.
Hi Leutz,
hier mal das ganze ohne dieses DriverLibGeraffel. Da hat man immer
Probleme, wenn was nicht funzt und muss doch auf die Regs runter.
Daher nutze ich die DLs nur als Example - mehr nicht.
VG,
/th.
Markus schrieb:
> schon vorgeschlagen worden ist und ich musste leider feststellen das der> Tx Pin auf +2,5 V geschalten wird.
Das klingt eher so, als würde an dem Pin überhaupt nichts verschaltet,
denn 2,5V ist bei nicht exzessiver Last nix Halbes und nix Ganzes,
jedenfalls bei 3,3V Versorgung.
Passt auch zum Code. Du konfigurierst die standardmässigen GPIO Pins auf
PORTA für UART2, leitest UART2 aber auf die alternativen abgeschalteten
PORTD Pins um. Willst du die nun auf PORTA (dann lass den Remap weg)
oder auf PORTD (dann konfiguriere die richtigen Portpins)?
Random ... schrieb:
> Hi Leutz,>> hier mal das ganze ohne dieses DriverLibGeraffel. Da hat man immer> Probleme, wenn was nicht funzt und muss doch auf die Regs runter.> Daher nutze ich die DLs nur als Example - mehr nicht.
In USART*_IRQHandler
wird das RXNE Bit vom Lesen von DR automatisch kassiert, muss also nicht
explizit gelöscht werden. Und das volatile ist für solche lokale
Variablen überflüssig (ziemlich ineffizient).
Eigentlich will ich den UART 2 schon auf Port A ausgeben. Vorallem weil
der Port D bei meine Eval Board (STM32-H103) nicht rausgeführt wird.
Also wenn ich das Remap weglasse dann wird nach dem Senden des 1.
Zeichens das USART_FLAG_TXE Flag nicht mehr auf SET geschalten die
Abfrage ist dann quasi eine endless loop
Lg
Danke Random ... für deinen Code... hab leider jetzt erst am Abend Zeit
mit das anzusehen
Hallo, bin gerade auch damit beschäftigt mit dem STM32-H103 Board
Zeichen über den USART zu schicken und wollte fragen ob es jetzt einem
hier gelungen ist und welche Einstellungen dazu vorgenommen werden
müssen.
Mit Hilfe von "A.K." habe ich es zwar geschafft überhaupt Etwas heraus
zu schicken aber es ist auf keinem Fall das, was ich schicken will. Am
Hyperterminal empfange ich nur Smilies, Dreiecke und so weiter. Advanced
Serial Port Monitor weigert sich komplett was zu empfangen......habe die
main.c angehänt.
Was mir im Moment auch nicht klar ist, warum meine LED durchgehend
leuchtet....theoretisch sollte da ein deutlich wahrnehmbares Blinken
vorhanden sein...
Vielen Dank im Voraus
Max
DrMaex schrieb:
> zu schicken aber es ist auf keinem Fall das, was ich schicken will. Am> Hyperterminal empfange ich nur Smilies, Dreiecke und so weiter.
Wetten dass die Bitrate falsch ist? Da die Lib zwar umständlich aber
richtig rechnet, geht sie vermutlich von einer falschen Annahme über den
Takt des betreffenden APB Busses aus.
Hmm also ehrlich gesagt stehe ich etwas auf dem Schlauch....
habe die clk_Init() etwas verändert was allerdings keine Veränderung
gebracht hat...ich schildere meinen Gedankengang bzw. Interpretation:
//Systemtak von PLL antreiben ->System läuft mit 72 MHz
32
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
33
34
//warten bis Systemtakt-Herkunft übernommen wurde
35
while(RCC_GetSYSCLKSource()!=0x08)
36
{
37
}
38
39
// Takte für die Peripherie setzen
40
41
//AHB Takt (HCLR) 72 MHz
42
RCC_HCLKConfig(RCC_SYSCLK_Div1);
43
44
//USb Takt 72/1.5=48 MHz
45
RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);
46
47
// APB2 takt 72 MHz (Dieser Takt treibt u. A. den USART1 an)
48
RCC_PCLK2Config(RCC_HCLK_Div1);
49
50
//APB1 Takt 72/2=36 MHz (u. A. USART2,USART3)
51
RCC_PCLK1Config(RCC_HCLK_Div2);
52
53
//ADC Takt (APB2)/8=9MHz
54
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
55
}
Also demnach sollte der uC keine Annahmen mehr beim Ausrechnen der
Baud-Rate machen..... es kommen aber immer noch keine richtigen Zeichen
an. Habe vorläufig kein Hyperterminal zuhause, aber sowohl Tera-Term als
Advanced Serial Port Monitor zeigen keine gescheiten Zeichen an. Auch
ein Atmel328(Arduino) dessen RX auf TX umgeleitet wird kann die Daten
nicht interpretieren die aus dem Pin des STM32 rauskommen. Wo steckt
mein Denkfehler??
Danke
Gruß
Max
Welche Möglichkeiten des Debuggings stehen dir zu Verfügung? Mit Oszi
kannst du feststellen, was tatsächlich an Baudrate aus der UART
rauskommt. Mit JTAG kannst du dir ansehen, was der Lib-Code als
Taktfrequenz annimmt - da gibt's ein paar Variablen zu, eine davon
verwendet die Lib für die Baudratendefinition. Vielleicht stimmt das
nicht überein - z.B. mit 8MHz Quarz gerechnet und 12MHz sind drin.
Alternativ kannst du mal den Quarz ignorieren und ohne PLL auf Basis des
HSI arbeiten. Für den ersten Test ist der genau genug. Nur muss auch
dann die Angabe der Taktfrequenz irgendwo im Programm oder Projekt einen
gewissen Bezug zur Realität haben.
Mit der Berechnung selbst kann ich leider nichts anfangen.
Wenn ich probiere das Programm zu debuggen sehe ich folgendes
(Screenshot im Anhang siehe oben)
Ich vermute das ist genau die Variable die als Baudrate ins Register
geschrieben wird…
Ich bin langsam am verzweifeln…
Mal eine andere Frage bezüglich des Flashens und der Hardware
Konfiguration vielleicht liegt da der Hund begraben:
Also was mich als erstes etwas stutzig macht ist anscheinend braucht ja
die RS232 +-12 Volt als Pegel, mein TX Pin liegt aber bei 3.26
Volt.(Direkt auf Com Verbunden)
Beim Kompilieren geht soweit alles glatt
Man kann sich auch von hinten durch die Brust ins Auge stechen. Wenn du
dir die komplette Taktprogrammierung einsparst läuft IMHO alles auf
HSI=8MHz. Auf was denn sonst ;-).
Den Baudratenteiler programmiert man trivialerweise so:
UARTx->BRR = APBx-Takt / Baudrate;
Dass man sich das Leben auch schwerer machen kann beweist die Lib.
Also scheint es alles zwar kompliziert programmiert zu sein sollte aber
dennoch funktionieren....was heute einem Kumpel aufgefallen ist, ist,
dass der uC selbst sehr heisst wird, nicht lauwarm, heiss! Man kann den
Finger nicht dran lassen, ich mein ok das Ding ist ziemlich schnell und
die LED blinkt fleissig weiter aber hmmm.... leider habe ich keinen
Thermometer zur Hand deswegen die Frage, ist das normal?
p.s. meinst du dass man bereits nach
1
RCC_HSICmd(ENABLE);
2
// wait until the HSI is ready
3
while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY)==RESET);
4
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
5
while(RCC_GetSYSCLKSource()!=0x00)
6
{
7
}
aufhören könnte und die Peripherie Teiler und Takte bekommen
irgendwelche Default-Werte verpasst?
Danke
Gruß
Max
DrMaex schrieb:
> p.s. meinst du dass man bereits nach> aufhören könnte und die Peripherie Teiler und Takte bekommen> irgendwelche Default-Werte verpasst?
Nicht nur dies.
Hast du schon einmal einen Prozessor gesehen, der gänzlich ohne Takt
seine Befehle ausführt? (für Experten: ja, ich weiss das es das gibt,
aber der hier gehört nicht dazu).
Wenn du dir das nicht vorstellen kannst, dann überleg mal, oder noch
besser schau nach, mit welchem Takt der STM32 den obigen Code nach dem
Reset auszuführen beginnt.
DrMaex schrieb:
> dass der uC selbst sehr heisst wird, nicht lauwarm, heiss! Man kann den> Finger nicht dran lassen,
Ganz ganz schlecht. Sollte nicht spürbar warm werden.
Ne, klar ohne Takt wäre es schwierig aber nachdem ich gesehen hatte was
man da einstellen kann habe ich dem ARM einfach alles zugetraut :) Bzw.
halt zumindest, dass die Peripherie nicht ohne explizite Angaben zum
Takt funktioniert.
Beschäftige mich erst seit kurzem mit uC und habe die ganzen Strukturen
noch nicht ganz verinnerlicht und lerne die Sachen eher bei Bedarf, nur
dann kann ich erst den nötigen Ehrgeiz aufbringen. Einfach so ohne
Anwendung schalte ich viel zu schnell auf Durchzug....
Da sich jetzt der Verdacht, dass ein heisser Prozessor nicht gut ist,
bestätigt werde ich wahrscheinlich die Arbeiten an dem STM32-H103 Board
einstellen und mich nach Alternativen umschauen...
Vielen Dank für die Hilfe!
Gruß
Max