STM32F407 Ich habe nur Pin 12 von Port D für die Ausgabe aktiviert. Aber gleichzeitig werden andere Pins eingeschaltet, immer auf unterschiedliche Weise. Manchmal schalten sich zwei Pins ein, manchmal schaltet sich ein anderer Pin ein. Ich habe diese Pins nicht eingeschaltet, aber sie geben einen hohen Signalpegel. Vielleicht sollten unbenutzte Pins abgeschaltet werden, ist das eine Art Nebeneffekt?
Kommt drauf an. Auf deine Hardware, auf deine Firmware, vielleicht auch auf's Wetter.
Mein Code int main(void) { RCC->AHB1ENR|=RCC_AHB1ENR_GPIODEN; GPIOD->MODER|= 1<<24; HAL_SYSTICK_Config(SystemCoreClock); while (1) { GPIOD->ODR|=1<<12; HAL_Delay(1); GPIOD->ODR&=~(1<<12); HAL_Delay(1); } } Pin 5 von Port D gibt immer 3 Volt aus. Geprüft mit einem Multimeter Dies ist im GPIOD_IDR-Register ersichtlich Pin 5 im GPIOD_IDR-Register ist immer eingeschaltet.
Max M. schrieb: > Mein Code > int main(void) > { > RCC->AHB1ENR|=RCC_AHB1ENR_GPIODEN; > GPIOD->MODER|= 1<<24; > HAL_SYSTICK_Config(SystemCoreClock); > while (1) > { > GPIOD->ODR|=1<<12; > HAL_Delay(1); > GPIOD->ODR&=~(1<<12); > HAL_Delay(1); > } > } > Pin 5 von Port D gibt immer 3 Volt aus. Geprüft mit einem Multimeter > Dies ist im GPIOD_IDR-Register ersichtlich > Pin 5 im GPIOD_IDR-Register ist immer eingeschaltet. Statische Elektrizität? Was passiert wenn du den Port über 10k mit GND verbindest? LG, Sebastian
Sebastian schrieb: > Was passiert wenn du den Port über 10k mit GND > verbindest? LD8 beginnt zu leuchten USB LD8: red LED indicates an over-current from VBUS of CN5 and is connected to the I/O PD5 of the STM32F407VGT6. Aber im GPIOD_IDR-Register werden nur die Pins aktiviert, die ich aktiviert habe. Das heißt, der Fehler verschwindet. --------------- Davor war Pin 5 im GPIOD_IDR-Register aktiviert, an Pin 5 von Port D waren 3 Volt, im GPIOD_ODR-Register war alles korrekt. --------------- Ja, wenn ich Pin 5 mit Masse verbinde, dann hat das GPIOD_IDR-Register von Pin 5 einen Wert von Null. Aber warum erscheinen an Pin 5 des GPIOD 3 Volt?
:
Bearbeitet durch User
IDR: 1 0000 0010 0000 ODR: 1 0000 0000 0000
Max M. schrieb: > Aber warum erscheinen an Pin 5 des GPIOD 3 Volt? Weil dein Messgerät viel zu Hochohmig ist um hier was vernünftiges zu messen. Dazu noch einen offenen/hochohmigen Eingangspin der überhaupt nicht auf einem definierten Pegel liegt und die Fehlmessung ist perfekt. Passenden pull-down dran und schon ist Ruhe und du kannst Messen oder auch den Pin in der Software abfragen und bekommst einen stabilen zustand. Offenen/unbeschaltete Input-Pins sind immer ein guter Ausgangspunkt für lustige Effekte:-)
Max M. schrieb: > Ich habe nur Pin 12 von Port D für die Ausgabe aktiviert. > Aber gleichzeitig werden andere Pins eingeschaltet, immer auf > unterschiedliche Weise. > Manchmal schalten sich zwei Pins ein, manchmal schaltet sich ein anderer > Pin ein. Der µC kann nicht wissen, dass Du keine Ahnung hast. Generell, immer, ohne Ausnahme, gehören am Anfang des Programmes alle Ports in einen definierten Zustand gesetzt.
(prx) A. K. schrieb: > NB: Portpins sollte man über das BSRR ansteuern, nicht das ODR. Dies sind nahezu identische Register. ODR - Output Data Register; BSRR - Bit Set Reset Register--hier kann das Bit verändert werden, ohne dass man vorher lesen muss.
Sebastian schrieb: > Was passiert wenn du den Port über 10k mit GND > verbindest? Irgend W. schrieb: >Weil dein Messgerät viel zu Hochohmig ist um hier was vernünftiges zu >messen. Wenn es statische Elektrizität wäre, glaube ich nicht, dass LD8 zu leuchten beginnen würde, wenn ich Pin 5 über einen 10-kΩ-Widerstand mit Masse verbinde. LD8: red LED indicates an over-current from VBUS
:
Bearbeitet durch User
Max M. schrieb: > BSRR - Bit Set Reset Register--hier kann das Bit verändert werden, ohne > dass man vorher lesen muss. Vor allem aber ist diese Aktion atomar.
Manfred schrieb: > Generell, immer, ohne Ausnahme, gehören am Anfang des Programmes alle > Ports in einen definierten Zustand gesetzt. Den haben sie ab Reset doch schon.
Manfred schrieb: > Generell, immer, ohne Ausnahme, gehören am Anfang des Programmes alle > Ports in einen definierten Zustand gesetzt. Setze ich so nicht alle Pins von Port D auf Null? GPIOD->MODER&=0UL; GPIOD->IDR&=0UL; Danach bleibt Pin 5 immer noch eingeschaltet, Pin 5 von Port D bleibt 3 Volt. IDR: 0000 0000 0010 0000
:
Bearbeitet durch User
Max M. schrieb: > Danach bleibt Pin 5 immer noch eingeschaltet Da ist garnichts "Eingeschaltet", du stellst alles auf "Input" und IDR zeigt dir beliebigen Scheißdreck an den dein Radioempfänger gerade einfängt. Schalt wenigstens mal die internen pull-downs ein (GPIOx_PUPDR) wenn du überall Null haben willst und die Pins extern nicht vernünftig beschaltet sind. So ein Blick in das Handbuch Kap. "7.3 GPIO functional description" wäre sicher nicht verkehrt...
Irgend W. schrieb: > du stellst alles auf "Input" und IDR > zeigt dir beliebigen Scheißdreck an den dein Radioempfänger gerade > einfängt. Ich versuche diesen Effekt loszuwerden. GPIOD->PUPDR|=0x800UL; Ich habe es ganz am Anfang versucht. Dies ist der Pull-Down für Pin 5. In dem Fall beträgt die Spannung an Pin 5 nicht 3 Volt, sondern 1,5 Volt. Vollständiger Code: RCC->AHB1ENR|=RCC_AHB1ENR_GPIODEN; GPIOD->MODER&=0UL; GPIOD->IDR&=0UL; GPIOD->PUPDR|=0x800UL; ---------------------------- IDR Register: 0000 0000 0010 0000 An Pin 5 == 1,5 Volt Und beginnt ein wenig LD8 zu leuchten LD8: red LED indicates an over-current from VBUS Ist das normal? Der Wert des Pull-Down-Widerstands beträgt etwa 10 kOhm. Oder sind 1,5 Volt beim Pull Down normal? Wenn dies der Fall ist, fängt Pin 5 von Port D die Störung auf und schaltet sich ein, und 1,5 Volt sind genug Spannung, um sie nicht als logische 1 wahrzunehmen. Ich mochte den Wert des IDR-Registers nicht, der nicht der Realität entsprach.
:
Bearbeitet durch User
Wenn Pin 5 per Software auf 0 gesetzt ist, Pin 5 aber aufgrund einer Störung auf 1 gesetzt ist, wie kann ich dann Pin 5 als Eingang verwenden, wenn er nicht abgeschaltet werden kann? Pin 5 mit dem PUPDR-Register ein- und auszuschalten?
:
Bearbeitet durch User
Max M. schrieb: > und 1,5 Volt sind genug Spannung, um sie nicht als > logische 1 wahrzunehmen. Hier lag ich falsch. 1,5 Volt reichen aus, um Pin 5 in eine logische 1 umzuwandeln. Das IDR-Register sieht doch so aus: IDR Register: 0000 0000 0010 0000
:
Bearbeitet durch User
Wo ist der Vorteil wenn man zum löschen GPIOD->MODER &= 0UL; nimmt und nicht GPIOD->MODER = 0UL; Ich hätte die letztere reine Zweisung genommen. Aber vielleicht habe ich ja einen Trick übersehen?
PittyJ schrieb: > Aber vielleicht habe ich > ja einen Trick übersehen? ))In diesem Fall ist es GPIOD->MODER &= 0UL; und das ist GPIOD->MODER = 0UL; gleich. Es gab hier GPIOD->MODER &= 0UL; einen anderen Ausdruck: etwa so GPIOD->MODER &= ~(1<<12); Ich habe vergessen & zu löschen So a==0; int a = 0b11111111111; a&=0; Und so auch a==0; int a = 0b11111111111; a=0;
:
Bearbeitet durch User
Das ist eher ein Hard, denn ein Softwarethema. Also nur mit source, ohne Schaltplanschnipsel ist die Betrachtung nicht vollständig. Klassischerweise spricht man hier nicht vom Einschalten, sondern vom Tristate (Hochohmig). Der verhält sich wie die ein in der Luft hängendes Kabel vom Multimeter, da kann auch je nach Potential eine Spannung angezeigt werden. um solches Fehlermessungen auszuschliessen könnte dieses Pin mit 100k gegen Masse geschaltete werden. bei tristate stellt sih auch die Frage nach internen/externenen PullUps resp. downs. Erst wenn das geklärt ist, kann man über per LatchUp, ESD o.ä. kaputtgeschossenen Pins spekkulieren. Beitrag "Tri-State-Eingang abfragen" https://www-user.tu-chemnitz.de/~heha/hsn/chm/ATmegaX8.chm/14.htm
Ich gebe auch zu Bedenken das der STM32 Startup Code vor dem Sprung nach main() einen Aufruf von SystemInit() macht. D.h. HAL kann da Hardware wie GPIO Ports oder UARTs initialisieren ohne das Code in main() aufgerufen wird.
Max, was genau meinst du mit "Einschalten"? Jeder digitale Pin kann folgende Zustände haben: Ausgang HIGH Ausgang LOW Eingang HIGH Eingang LOW Eingang undefiniert Der letzte Status sollte vermieden werden, weil er Fehlfunktionen (bis hin zum Latch-Up) auslösen kann. Bei Batteriebetrieb stört auch ohne Latch-Up bereits die erhöhte Stromaufnahme. Unter ein-/aus-geschaltet verstehe ich die Versorgung des Ports mit Takt. Das ist nämlich das Einzige, was man da ein- bzw aus-schalten kann, und zwar über die GPIOIEN Bits in den RCC...ENR Registern.
Stefan ⛄ F. schrieb: > Eingang HIGH Im GPIOD-> IDR-Register meinte ich mit dem Wort "eingeschaltet", wenn der Bitstatus 1 ist. Ok, heißt also anders: Eingang HIGH
Pin PD5 ist über einen 47-kΩ-Widerstand mit einer 3-Volt-Stromversorgung verbunden. In meinem PD-Board ist dies wahrscheinlich ein reservierter Pin für die Überspannungserkennung. Ich weiß noch nicht, wie ich es benutzen soll. https://www.st.com/content/ccc/resource/technical/layouts_and_diagrams/schematic_pack/group1/83/aa/1d/e9/d8/3e/40/a6/MB997-F407VGT6-C01_Schematic/files/MB997-F407VGT6-C01_Schematic.pdf/jcr:content/translations/en.MB997-F407VGT6-C01_Schematic.pdf
Max M. schrieb: > Pin PD5 ist über einen 47-kΩ-Widerstand mit einer 3-Volt-Stromversorgung > verbunden. Na dann ist ja klar, wo der HIGH Pegel her kommt. Works as designed. > Ich weiß noch nicht, wie ich es benutzen soll. Was willst du denn mit dem Pin anstellen? kannst du keinen anderen freien Pin verwenden?
Stefan ⛄ F. schrieb: > Was willst du denn mit dem Pin anstellen? Ich fange gerade an, STM32 zu lernen. Ich versuche zu verstehen, wie alles funktioniert. Ich habe nicht verstanden, warum an Pin 5 ein High-Pegel anliegt, obwohl ich ihn nicht gesetzt habe und auch Pull-Down nicht geholfen hat. Jetzt ist alles klar.
:
Bearbeitet durch User
Generell sollte man sich schon mit dem Schaltplan des Discovery Boardes vertraut machen, das man zu benutzen gedenkt. Nur weil da 100 Pins heraus geführt sind, heißt das nicht, das alle 100 auch frei verwendbar sind. Eigentlich ist das auch klar im Manual dokumentiert. Diversen Diskussionen nach ist der Power Switch empfindlich. Vielleicht hast du ihn mal kurzgeschlossen oder überlastet.
Stefan ⛄ F. schrieb: [...] > Diversen Diskussionen nach ist der Power Switch empfindlich. Vielleicht > hast du ihn mal kurzgeschlossen oder überlastet. Da ist kein Defekt notwendig um die Messergebnisse zu erklären. Ohne Pulldown wird PD5 über 47k auf 3V3 gezogen -> High. Mit 10k Pulldown fließt Strom über die rote LED und den 680R (parallel zu den 47k Pullup). Damit ergibt sich dann 3V3 abzüglich der Flussspannung der LED an PD5, da dürften 1V5 gut passen. Also alles working as designed.
Woanders fällt es ab ca. 1 Volt. 2.255-1.5==0,755Volt Vermutlich am Innenwiderstand des Netzteils.
:
Bearbeitet durch User
Ich schätze der NFAULT-Ausgang ist Open Collector, darum der 47k. Im Fehlerfall geht der Ausgang auf GND, die rote LED geht an, und PD5 geht LOW. Oder? LG, Sebastian
Ralf D. schrieb: > Da ist kein Defekt notwendig um die Messergebnisse zu erklären. Ich hatte darauf hingewiesen, weil er meinte dass die Overcurrent LED unerwartet aufleuchtet. Hatt dabei vergessen, dass er das selbst durch den 10kΩ Widerstand bewirkte. Deine Erklärung ist völlig richtig. > Also alles working as designed.
Max M. schrieb: > Vermutlich am Innenwiderstand des Netzteils. An der LED LD8 fallen 1,6 Volt ab. Geprüft mit einem Multimeter.
(prx) A. K. schrieb: > Manfred schrieb: >> Generell, immer, ohne Ausnahme, gehören am Anfang des Programmes alle >> Ports in einen definierten Zustand gesetzt. > Den haben sie ab Reset doch schon. Der Zustand mag durchaus definiert sein, aber er wird ziemlich sicher nicht der sein, den meine Schaltungsumgebung braucht. Irgend W. schrieb: >> Danach bleibt Pin 5 immer noch eingeschaltet > Da ist garnichts "Eingeschaltet", du stellst alles auf "Input" und IDR > zeigt dir beliebigen Scheißdreck an den dein Radioempfänger gerade > einfängt. Aus diesem Grund setzt man unbeschaltete Anschlüsse als Ausgang.
Manfred schrieb: > Aus diesem Grund setzt man unbeschaltete Anschlüsse als Ausgang. Nein, auf tristate. Oder abzwicken, oder ... Beitrag "Unbenutzte AVR-Pins wie beschalten (EMV)?"
Beitrag #7071542 wurde von einem Moderator gelöscht.
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.