Hi, Ich habe einen neuen STM32 auf ein Board gelötet und festgestellt, dass einige GPIO's auf HIGH waren, was natürlich bei einigen Schaltungen alles ruinieren kann, wenn die GPIO's als Output definiert sind und auf HIGH gehen. Es müssten doch eigentlich standardmäßig alle GPIO's als Input definiert sein, oder? Habt ihr auch schon ein solches Verhalten beobachtet? Grüsse Bert
Bert S. schrieb: > Es müssten doch eigentlich standardmäßig alle GPIO's als > Input definiert sein, oder? Genau: Input + weak Pullup. Dann misst man immer "high" wenn nix dran hängt. Kann man mit einem 10kOhm Widerstand als Pulldown sicher überprüfen.
Einige GPIO Pins sind Standardmäßig für die SWJ Schnittstelle reserviert. http://stefanfrings.de/stm32/index.html#swj
Das steht doch alles im Datenblatt. Da stehen auch die Default-Werte für alle GPIO-Register. Die meisten Pins sind standardmäßig als Input, Pullup konfiguriert, es gibt aber je nach Controller auch Ausnahmen für einzelne Pins bzw Ports.
Aber als Output sollte kein Pin konfiguriert sein. Wenn ich mich irre, zeig mal ein Beispiel :).
Stefan S. schrieb: > Die meisten Pins sind standardmäßig als Input, > Pullup konfiguriert, Wie kommst du darauf? Bei den F0, F1, F3, F4 steht im Reference Manual "Input Floating".
> Aber als Output sollte kein Pin konfiguriert sein. > Wenn ich mich irre, zeig mal ein Beispiel Der TDO Pin vom JTAG Anschluss.
Stefan U. schrieb: > Der TDO Pin vom JTAG Anschluss. JTAG ist wohl eher als Alternate Function vorkonfiguriert - was aber möglicherweise den selben Effekt hat. Habe ich nie berücksichtigt.
Nein, sowohl JTAG als auch SWD zählen nicht zu den alternativen Funktionen. Die kann man woanders separat deaktivieren und erst danach kann man die Pins als GPIO Pin oder mit alternativer Funktion nutzen.
Natürlich ist JTAG eine Alternate Function. Zumindest beim STM32F4.
1 | Reset values: |
2 | • 0x0A800 0000 for port A |
3 | • 0x0000 0280 for port B |
4 | • 0x0000 0000 for other ports |
Also binär sind die Modes höchstens mit 0b10 vordefiniert, was Alternate Function ist - und nicht Output. "AF0" ist in der Regel JTAG / SWD, was passt da die AF Register alle mit "0" vorgeladen sind. Wie soll ich denn JTAG / SWD sonst von den Pins runterkriegen? Man lernt hier ja nie aus.
1 | To use the serial wire DP to release some GPIOs, the user software must change the GPIO |
2 | (PA15, PB3 and PB4) configuration mode in the GPIO_MODER register. This releases |
3 | PA15, PB3 and PB4 which now become available as GPIOs. |
> Wie soll ich denn JTAG / SWD sonst von den Pins runterkriegen? So: SET_BIT(RCC->APB2ENR, RCC_APB2ENR_AFIOEN); MODIFY_REG(AFIO->MAPR, AFIO_MAPR_SWJ_CFG, AFIO_MAPR_SWJ_CFG_DISABLE); (beim STM32F1) Und jetzt kommt der Witz: Solange AFIOEN noch nicht eingeschaltet ist, kann man JTAG und SWD nicht aus schalten.
Ok, die F4 haben kein "AFIOEN" :). Und auch kein AFIO->MAPR - scheint hier simpler zu sein.
> Ok, die F4 haben kein "AFIOEN"
Gut so, denn tieferen Sinn dieses Bits habe ich bis heute nicht
verstanden. Warum sollte ich global die alternativen Funktionen ein/aus
schalten können, wenn ich ohnehin jede einzelne Alternative Funktion
ein/aus schalten kann?
Stefan U. schrieb: > Warum sollte ich global die alternativen Funktionen ein/aus > schalten können, wenn ich ohnehin jede einzelne Alternative Funktion > ein/aus schalten kann? Damit Du das möglichst schnell machen kannst. Manchmal werden Controller ja auch für kritische Aufgaben eingesetzt.
Nop schrieb: > Damit Du das möglichst schnell machen kannst. Manchmal werden Controller > ja auch für kritische Aufgaben eingesetzt. Was ist denn der Sinn dahinter, was will man damit erreichen?
Ich habe hier einen STM32F303K8T6, bei welchem die Pins PA15 und PB4 beim Einschalten auf HIGH (wahrscheinlich Output push pull) liegen, wobei dadurch ein Transistor durchgeschaltet werden kann und auch an bleibt, wenn ich z.B den Rest-Pin auf LOW halte (StLink eingesteckt am SWD Interface, aber nicht USB). http://www.st.com/content/ccc/resource/technical/document/datasheet/group3/38/c6/ca/d1/f7/d5/4e/30/DM00092070/files/DM00092070.pdf/jcr:content/translations/en.DM00092070.pdf Auf diesen Pins liegen SYS_JTDI und SYS_NJTRST. Gibt es eine Möglichkeit, diese Pins schon vor dem Start-Up richtig zu konfigurieren?
:
Bearbeitet durch User
Bei den relativ neuen LPC84x habe ich gesehen das die ein FAIM haben, ein Fast Initialisation Memory das die Portkonfiguration enthält und schon beim PowerUp einstellt. Nutzt jetzt wahrscheinlich nix beim STM32F303K8T6 wenn der so ein Feature nicht hat, aber wenn man so etwas unbedingt haben möchte gibt es da mittlerweile Lösungen.
Bert S. schrieb: > Es müssten doch eigentlich standardmäßig alle GPIO's als > Input definiert sein, oder? Habt ihr auch schon ein solches Verhalten > beobachtet? Ein solches Verhalten gibt ea bei vielen µC. Allerdings mit unterschiedlichen Auswirkungen. Deswegen ist der allererste Schritt beim Konzipieren eines neuen Projektes, daß man das zuständige Referenzmanual sich genau anschaut und dort das Resetverhalten der Pins nachliest, bei denen es eventuell kritisch sein könnte. W.S.
Du kannst diese Pins nur nach dem Startup konfigurieren:
1 | // Enable alternate functions
|
2 | SET_BIT(RCC->APB2ENR, RCC_APB2ENR_AFIOEN); |
3 | |
4 | // Disable both SWD and JTAG to free PA13, PA14, PA15, PB3 and PB4
|
5 | MODIFY_REG(AFIO->MAPR, AFIO_MAPR_SWJ_CFG, AFIO_MAPR_SWJ_CFG_DISABLE); |
6 | |
7 | or: |
8 | |
9 | // Disable JTAG only to free PA15, PB3* and PB4. SWD remains active
|
10 | MODIFY_REG(AFIO->MAPR, AFIO_MAPR_SWJ_CFG, AFIO_MAPR_SWJ_CFG_JTAGDISABLE); |
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.