Neuer uC wie initialisiert?

OP #5345368
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
Gast #5345544
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.
Gast #5345573
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.
Gast #5345584
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?
Gast #5345611
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.
OP #5354948
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?
Gast #5355075
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.
Gast #5355127
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.
Gast #5355380
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);

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren