Was passiert auf dem STM32, wenn zwei Pins so konfiguriert sind, dass sie dieselbe alternative Funktion haben?

10

Beim Lesen des Handbuchs STM32F051 scheint es möglich zu sein, dieselbe alternative Funktion an zwei Pins zu konfigurieren. Beispielsweise könnten Sie mehrere USART1_TX-Pins gleichzeitig haben. Oder zum Beispiel der problematischere Fall von zwei USART_RX-Pins. Das Handbuch enthält keine Informationen zu diesem Fall. Ist das legal / sicher? Ist das nützlich?

Joeforker
quelle
2
Interessante Frage. Ich kann sehen, warum es manchmal nützlich ist, zum Beispiel beim Debuggen, die TX-Ausgabe an einen anderen Pin zu übertragen oder an einigen Stellen gepufferte Uhren zu erhalten. Es könnte sich jedoch lohnen, den entsprechenden manuellen Link hinzuzufügen, um zu vermeiden, dass jemand danach suchen muss.
PeterJ
Wieder - Interessante Frage. Aber wie wäre es mit der Zuweisung von USART_RX von zwei verschiedenen Pins? Man würde hoffen, dass die Chipdesigner ein Prioritätsschema für einander über das andere geplant hatten, anstatt interne Konflikte aus den beiden Quellen zuzulassen.
Michael Karas
Ich habe das noch nie versucht, aber basierend auf dem, woran ich mich aus den Pin-Diagrammen erinnere, würden Sie die Pins im Grunde intern miteinander verbinden.
rjp

Antworten:

5

Auf Prozessoren, die Per-Pin-Register zur Auswahl von E / A-Funktionen verwenden, ist es im Allgemeinen möglich, eine Ausgangsfunktion ohne Konflikte an mehrere Pins weiterzuleiten. Alle Pins geben den gleichen Ausgang wieder. Der Effekt der Verbindung mehrerer Pins mit einem Eingang ist häufig nicht spezifiziert. Wenn beispielsweise ein UART die E / A-Pins 3 und 4 mit einem UART verbunden hatte, verhält es sich möglicherweise so, als wäre der UART mit einem "UND" -Gatter verbunden, das die Pins 3 und 4 als Eingänge verwendet, oder als wäre er verbunden an einen Pin und ignorieren den anderen, oder es werden beide Pins über Transistoren mit mäßigem Widerstand mit dem Eingangspuffer des UART verbunden, oder es wird zusätzlicher Strom gezogen, wenn Pin 3 hoch und 4 niedrig ist oder umgekehrt, oder umgekehrt könnte fast alles andere tun, was man sich vorstellen kann. Ich nicht

Ein etwas besserer Entwurfsansatz, der in einigen Microchip-Teilen (möglicherweise auch in einigen STM-Teilen) verwendet wird, besteht darin, dass jede E / A-Funktion einen Multiplexer enthält, um auszuwählen, von welchem ​​Pin die Eingabe akzeptiert werden soll, und dass der Pin einen Multiplexer enthält, um das I anzuzeigen / O-Funktion, von der Daten ausgegeben werden sollen. Ein solches Design ermöglicht es, dass ein Pin mehrere E / A-Funktionen speist und gleichzeitig alle Mehrdeutigkeiten beseitigt, die durch widersprüchliche Konfigurationen entstehen.

Superkatze
quelle
3

Ja, es ist nützlich. Ergebnis des Experiments mit STM32F407VGT6: Beide AF-Pins können gleichzeitig als AF verwendet werden, zumindest wenn diese Pins als AF-Eingänge verwendet werden. Das Experiment bestand darin, TIM1 bei steigender Flanke des externen Triggersignals "TIM1_ETR" auszulösen. Das Signal "TIM1_ETR" kann auf die Pins PE7 und / oder PA12 des MCU-Pakets abgebildet werden.

Das Experiment: Initialisieren Sie beide Pins PE7 und PA12 als AF "TIM1_ETR" für TIM1:

{
    GPIO_InitTypeDef GPIO_InitStruct = { 0 };
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

    GPIO_InitStruct.Pin = GPIO_PIN_7;
    HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); // configure PE7 as AF

    GPIO_InitStruct.Pin = GPIO_PIN_12;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // configure PA12 as AF
}

Das Ergebnis - TIM1 wird durch Ansteigen der Flanke an einem der Pins PE7 oder PA12 gestartet.

Dies zeigt den Weg zu MUX (Wechsel) AF-Pins zur Laufzeit:

main
{
  GPIO_InitTypeDef GPIO_InitStruct = { 0 };

// Deactivate PA12 input (set as regular input):
        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
        GPIO_InitStruct.Pin = GPIO_PIN_12;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

// select PE7 as a trigger source,
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pin = GPIO_PIN_7;
        HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

// Arm the timer
    arm_tim1();

/* Now timer will be started by rising edge only on PE7 */

// ... later one can select PA12 as trigger source. Deactivate PE7 (set as regular input):
        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
        GPIO_InitStruct.Pin = GPIO_PIN_7;
        HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

// Activate PA12
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pin = GPIO_PIN_12;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

// Arm the timer
    arm_tim1();
/* timer will be started by rising edge only on PA12 */
}

Dies kann hilfreich sein, wenn zwei verschiedene Quellen für die Timer-Triggerung benötigt werden. Dies kann uns einen Offboard-MUX-IC ersparen :). Beide Eingänge können gleichzeitig verwendet werden, wenn sie wie am Anfang des Beitrags gezeigt initialisiert wurden. Die Eingänge sind nicht miteinander verbunden. Ich meine, das Signal auf PA12 wird nicht an PE7 übertragen und umgekehrt (da GPIOs als Eingänge festgelegt sind).

Der Code wird von "STM32CubeF4 v5.3" + "Firmware Package V1.24.0 / 08-February-2019" generiert.

Dainius_m
quelle
2

Grundsätzlich sind die Pins GPIOs, die alternativen Funktionen zugewiesen werden können, z. B. UART_RX. Jede alternative Funktion hat ihren Standard-Pin und alternative Pins, denen die Funktion neu zugeordnet werden kann. Wenn Sie das Referenzhandbuch des STM32F103 in Abschnitt 9.1.5 lesen, heißt es:

Um die Anzahl der Peripherie-E / A-Funktionen für verschiedene Gerätepakete zu optimieren, können einige alternative Funktionen einigen anderen Pins zugeordnet werden. Dies wird durch Software erreicht, indem die entsprechenden Register programmiert werden (siehe AFIO-Register auf Seite 177. In diesem Fall werden die alternativen Funktionen nicht mehr ihren ursprünglichen Zuordnungen zugeordnet .

Manu3l0us
quelle
Die Art und Weise, wie ich das verstehe, ist: Sobald Sie die neuen Pins zugewiesen haben, wird die vorherige Zuordnung entfernt, sodass Sie technisch gesehen nicht mehrere Pins mit derselben Peripheriefunktion verbinden können.
Dext0rb
1
Dies ist nicht möglich, da (zumindest beim F103 habe ich nicht mit den anderen Ableitungen des STM32 gearbeitet) der alternative Pin der Funktion ohne Verwendung der Remap-Funktion nicht zugewiesen werden kann, selbst wenn Sie ihn als AF_Output in eingerichtet haben das GPIO-Setup. Und nach dem Remapping ist die Funktion auf dem Original-Pin nicht mehr verfügbar. Ich hoffe das klärt was ich meinte.
Manu3l0us
1
Die Art und Weise, wie dies gemacht wird, ist in den verschiedenen Unterfamilien sehr unterschiedlich . Die F1-Registerstruktur verbietet dies möglicherweise, aber die F3-Struktur unterscheidet sich, wenn Sie den Pin für eine alternative Funktion anstelle der Funktion für einen Pin konfigurieren, sodass doppelte Zuordnungen möglich erscheinen. Tatsächlich beantworten Sie nicht die Situation der gestellten Frage, bei der es sich anscheinend um einen Teil handelt, für den die Registerstruktur dies zulässt.
Chris Stratton
1
@Chris Stratton STM32F302 Ref Handbuch Abschnitt 8.3.2: "Die Geräte-E / A-Pins sind über einen Multiplexer mit integrierten Peripheriegeräten / Modulen verbunden, sodass jeweils nur die alternative Funktion (AF) eines Peripheriegeräts an einen E / A-Pin angeschlossen werden kann Auf diese Weise kann es keinen Konflikt zwischen Peripheriegeräten geben, die an demselben E / A-Pin verfügbar sind. " Tatsächlich sagt dies jedoch nichts über mehrere E / A auf einem AF aus. Gibt es sogar mehrere Optionen für Eingangsstifte?
Manu3l0us
1
Ich schätze auch die F1x-Informationen, ich habe diese auch verwendet :-)
Joeforker