Forum: Mikrocontroller und Digitale Elektronik Neuer uC wie initialisiert?


von Bert S. (kautschuck)


Lesenswert?

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

von Jim M. (turboj)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

Einige GPIO Pins sind Standardmäßig für die SWJ Schnittstelle 
reserviert.
http://stefanfrings.de/stm32/index.html#swj

von Stefan S. (chiefeinherjar)


Lesenswert?

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.

von Curby23523 N. (Gast)


Lesenswert?

Aber als Output sollte kein Pin konfiguriert sein. Wenn ich mich irre, 
zeig mal ein Beispiel :).

von Dr. Sommer (Gast)


Lesenswert?

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".

von Stefan F. (Gast)


Lesenswert?

> Aber als Output sollte kein Pin konfiguriert sein.
> Wenn ich mich irre, zeig mal ein Beispiel

Der TDO Pin vom JTAG Anschluss.

von Curby23523 N. (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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.

von Curby23523 N. (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

> 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.

von Curby23523 N. (Gast)


Lesenswert?

Ok, die F4 haben kein "AFIOEN" :). Und auch kein AFIO->MAPR - scheint 
hier simpler zu sein.

von Stefan F. (Gast)


Lesenswert?

> 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?

von Nop (Gast)


Lesenswert?

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.

von nix verstanden (Gast)


Lesenswert?

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?

von Bert S. (kautschuck)


Lesenswert?

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
von Johannes S. (Gast)


Lesenswert?

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.

von W.S. (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.