Forum: Mikrocontroller und Digitale Elektronik Wo werden Port A-Register für die Pins 13 und 14 konfiguriert, um SWD zu konfigurieren?


You were forwarded to this site from EmbDev.net. Back to EmbDev.net
von Max M. (koeltrad)


Angehängte Dateien:

Lesenswert?

STM32F407VGT6
Hier ist mein Code:
#include "main.h"
int main(void)
{
RCC->AHB1ENR|=RCC_AHB1ENR_GPIOAEN;
 while (1)
 {
 }
}
Für die Register von Port A (Pins 13 und 14) erfolgt die Konfiguration 
in den IDE-Einstellungen? Im Code habe ich nicht die Konfiguration von 
Port A Register gefunden, aber SWD funktioniert trotzdem.
Welche Einstellungen sind erforderlich, um SWD auf den Pins 13 und 14 
von Port A zu installieren?
Ich habe mir das GPIOA_MODER-Register angesehen, es sieht so aus:
1010 1000 0000 0000 0000 0000 0000 0000
Es stellt sich heraus, dass die Pins 13 und 14 auf den Alternate 
function mode eingestellt sind.
Aus irgendeinem Grund ist Pin 15 von Port A ebenfalls auf den Alternate 
function mode eingestellt, obwohl Pin 15 von Port A ein general purpose 
pin.
Ich habe diese Bits gelöscht GPIOA->MODER=0; , aber sie werden nicht 
überschrieben, wenn die IDE neu gestartet wird.
Ich muss den ganzen Chip löschen, um wieder hineinzukommen.
--------------------------
Die Register von Port A beginnen bei Adresse 0x40020000.

: Bearbeitet durch User
von A. B, (Gast)


Lesenswert?

Die Alternate-Konfiguration für die SWD bzw. JTAG-Pins wird automatisch 
beim Reset des uC eingestellt. Das steht im RM drin:

8.4.1 GPIOx_MODERx Reset values:
•0xA800 0000 for port A

38.4.2 Flexible SWJ-DP pin assignment
After RESET (SYSRESETn or PORESETn), all five pins used for the SWJ-DP 
are assigned as dedicated pins immediately usable by the debugger host 
(note that the trace outputs are not assigned except if explicitly 
programmed by the debugger host). However, the STM32F4xx MCUs offers the 
possibility of disabling some or all of the SWJ-DP ports and so, of 
releasing the associated pins for general-purpose IO (GPIO) usage. For 
more details on how to disable SWJ-DP port pins, please refer to Section 
8.3.2: I/O pin multiplexer and mapping.

Es gibt also softwareseitig nichts einzustellen, sondern nur etwas NICHT 
zu verstellen. Also die entprechenden Bits in den GPIO-Registern einfach 
so lassen ...

von Max M. (koeltrad)


Lesenswert?

Gefunden in der Beschreibung des Moder Registers Reset values: 0xA800 
0000 für Port A.
Ich habe das STM32 ST-LINK Utility durchlaufen, die gelöschten Bits im 
Moder-Register (GPIOA->MODER=0;) werden tatsächlich wiederhergestellt.
Der Zugriff über die IDE auf den Mikrocontroller ist jedoch nicht 
möglich.
----------------------
0xA800 0000 ist 1010 1000 0000 0000 0000 0000 0000 0000
Alle Register von Port A werden auf diesen Wert gesetzt.
Ok, vielleicht wird dieser Wert für einen anderen Pin/Register von Port 
A benötigt, und der 15 Pin ist auf diesen Wert gesetzt, nur um nicht 
jeden Pin separat zu konfigurieren.
Für die Pins 13 und 14 wird benötigt folgenden Wert des Moder-Registers: 
0x2800 0000
----------------------
Und wo Werden die Reset values für jedes Register/Port gespeichert?
Ich denke, sie sollten im Flash-Speicher gespeichert werden?

: Bearbeitet durch User
von Max M. (koeltrad)


Lesenswert?

Ich kann über die IDE auf den Mikrocontroller zugreifen, aber nur mit: 
Connect during reset.
Ich klicke auf reset Taste und in der IDE auf Debug.
Die IDE hat also keine Zeit, die Register für sich neu zu konfigurieren, 
was bedeutet, dass sich etwas geändert hat und nicht wiederhergestellt 
wurde.
Was hat sich geändert und wurde nach dem Löschen der Bits des Moder 
Registers nicht wiederhergestellt GPIOA->MODER=0; ?

von A. B, (Gast)


Lesenswert?

Der JTAG-Port umfasst fünf(!!!) Pins. SWD nutzt davon nur zwei, den Rest 
kann man dann ggf. anderweitig verwenden, steht auch unter 38.4.2.

Wenn die eigene Firmware die Pin-Konfiguration verbiegt ... tja, dann 
gibt's Probleme. Deshalb wie schon gesagt: Nicht an der Konfiguration 
dieser Pins rühren, es sei den, man weiß genau, was man tut.

Wo sind diese Reset-Werte hardwaremäßig gespeichert? Entweder sind die 
fest in den Registern verdrahtet (denke ich eher nicht) oder sie liegen 
im "information block" und werden beim Reset durch eine einfache state 
machine in die Register geladen. Zumindest bei einigen neueren STM32 
werden zumindest einige erst bei der Konfiguration nach der 
Chip-Fertigung festgelegt und können daher nicht fest verdrahtet sein.

Aber letzlich egal, sie können halt vom Anwender so oder so nicht 
geändert werden.

von Max M. (koeltrad)


Angehängte Dateien:

Lesenswert?

Gefunden. Aber die STM32-Pin-Beschreibung besagt, dass diese Pins 
zunächst PA15, PB3, PB4 frei sind.
Für die Pins PA13 und PA14 steht geschrieben, dass sie zunächst belegt 
sind.

von A. B, (Gast)


Lesenswert?

Darüber steht ja auch "Board functions". Stammt wohl aus der Doku eine 
Nucleo-Boards oder so? Das heißt das nur, dass die Pins vom STLink auf 
dem Board nicht benötigt werden, und daher "frei" verfügbar sind. Das 
hat aber rein gar nichts damit zu tun, das die nach einem Reset zunächst 
für den JTAG-Port konfiguriert sind. Chip != Board

Nochmal zur Wiederholung: "After RESET (SYSRESETn or PORESETn), all five 
pins used for the SWJ-DP are assigned as dedicated pins immediately 
usable by the debugger host" ****ALL FIVE****

von Max M. (koeltrad)


Lesenswert?

A. B, schrieb:
> Stammt wohl aus der Doku eine
> Nucleo-Boards oder so?
Nein, dies ist die Dokumentation des exakt gleichen Boards wie meines 
STM32F407
https://www.st.com/resource/en/user_manual/dm00039084-discovery-kit-with-stm32f407vg-mcu-stmicroelectronics.pdf
A. B, schrieb:
> Pins vom STLink auf
> dem Board nicht benötigt werden, und daher "frei" verfügbar sind.
Das sind die Pins 13 und 14.
Ich dachte, dass der Bindestrich genau das Gegenteil anzeigt, dass diese 
Pins belegt sind und es besser ist, sie nicht zu verwenden.
Free I/O? -(Nein)

: Bearbeitet durch User
von Max M. (koeltrad)


Angehängte Dateien:

Lesenswert?

Alles ist klar. Ich möchte ein wenig hinzufügen, vielleicht braucht es 
jemand.

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.