Cosa succede sull'STM32 quando due pin sono configurati per avere la stessa funzione alternativa?


10

Leggendo il manuale STM32F051, sembra che sia possibile configurare la stessa funzione alternativa su due pin; ad esempio, potresti avere più pin USART1_TX contemporaneamente. O ad esempio il caso più problematico di due pin USART_RX. Il manuale non parla in questo caso. È legale / sicuro? È utile?


2
Domanda interessante. Riesco a capire perché a volte sarebbe utile, ad esempio durante il debug per ottenere l'output TX su un altro pin o ottenere clock bufferizzati in alcuni punti. Potrebbe valere la pena aggiungere il relativo link manuale per salvare chiunque debba cercarlo.
PeterJ,

Ancora una volta - domanda interessante. Ma che dire del caso di assegnare USART_RX da due pin diversi? Si potrebbe sperare che i progettisti di chip abbiano pianificato uno schema prioritario l'uno sull'altro anziché consentire una contesa interna da parte delle due fonti.
Michael Karas,

Non l'ho mai provato, ma in base a ciò che ricordo dagli schemi dei pin, fondamentalmente finiresti per collegare i pin internamente.
rjp,

Risposte:


5

Sui processori che utilizzano i registri per-pin per selezionare le funzioni I / O, è generalmente possibile instradare una funzione di uscita su più pin senza conflitti; tutti i pin avranno lo stesso output. L'effetto di avere più pin collegati a un ingresso è spesso non specificato; se ad esempio un UART avesse i pin I / O 3 e 4 collegati a un UART, potrebbe comportarsi come se l'UART fosse collegato a una porta "AND" che prendeva i pin 3 e 4 come input, oppure potrebbe comportarsi come se fosse collegato a un pin e ignorare l'altro, oppure potrebbe collegare entrambi i pin al buffer di input di UART attraverso transistor con una moderata resistenza, oppure potrebbe assorbire corrente extra quando il pin 3 è alto e 4 è basso o viceversa, oppure potrebbe fare qualsiasi altra cosa immaginabile. Io non

Un approccio di progettazione un po 'più gradevole, utilizzato in alcune parti Microchip (forse anche in alcune parti STM) è di avere ciascuna funzione I / O che includa un multiplexer per selezionare da quale pin deve accettare l'input e che il pin includa un multiplexer per indicare l'I / O funzione da cui dovrebbe produrre dati. Tale progettazione consente di avere un pin che alimenta più funzioni di I / O, eliminando contemporaneamente le ambiguità poste da configurazioni in conflitto.


3

Sì, è utile. Risultato dell'esperimento su STM32F407VGT6: entrambi i pin AF possono essere utilizzati contemporaneamente come AF, almeno se si utilizzano questi pin come input AF. L'esperimento era di innescare TIM1 sul fronte di salita del trigger esterno - segnale "TIM1_ETR". Il segnale "TIM1_ETR" può essere mappato ai pin PE7 e / o PA12 del pacchetto MCU.

L'esperimento: inizializzare entrambi i pin PE7 e PA12 come AF "TIM1_ETR" per 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
}

Il risultato: TIM1 viene avviato dal fronte di salita su uno qualsiasi dei pin PE7 o PA12.

Questo rivela il modo per MUX (cambiare) pin AF in fase di esecuzione:

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 */
}

Questo può essere utile, quindi sono necessarie due diverse fonti per l'attivazione del timer, questo può salvarci fuori dal MUX IC :). Entrambi gli ingressi possono essere utilizzati contemporaneamente, se inizializzati come mostrato all'inizio del post. Gli ingressi non sono collegati insieme, intendo che il segnale su PA12 non viene trasferito su PE7 e viceversa (perché i GPIO sono impostati come ingressi).

Il codice è generato da "STM32CubeF4 v5.3" + "Pacchetto firmware V1.24.0 / 08-febbraio-2019."


2

Fondamentalmente, i pin sono GPIO che possono essere assegnati a funzioni alternative, ad es. UART_RX. Ogni funzione alternativa ha il suo pin predefinito e pin alternativi a cui è possibile rimappare la funzione. Se dai un'occhiata al manuale di riferimento dell'STM32F103 nella sezione 9.1.5, dicono:

Per ottimizzare il numero di funzioni I / O periferiche per diversi pacchetti di dispositivi, è possibile rimappare alcune funzioni alternative ad altri pin. Ciò è possibile grazie al software, programmando i registri corrispondenti (fare riferimento ai registri AFIO a pagina 177. In tal caso, le funzioni alternative non vengono più associate alle loro assegnazioni originali .


Il modo in cui lo faccio è: una volta assegnati i nuovi pin, l'assegnazione precedente viene rimossa, quindi non è possibile avere tecnicamente più pin collegati alla stessa funzione periferica.
dext0rb

1
Non è possibile, perché (almeno sull'F103, non ho lavorato con gli altri derivati ​​dell'STM32), il pin alternativo non può essere assegnato alla funzione senza usare la funzione di rimappatura, anche se lo si imposta come AF_Output in la configurazione GPIO. E dopo la rimappatura, la funzione non è più disponibile sul pin originale. Spero che questo chiarisca cosa intendevo dire.
Manu3l0us

1
Il modo in cui ciò avviene è molto diverso nelle diverse sottofamiglie. La struttura del registro F1 può vietarlo, ma la struttura F3 è diversa, in cui si configura il pin su una funzione alternativa anziché la funzione su un pin, quindi sembrano possibili duplicati. In effetti, non stai rispondendo alla situazione della domanda posta, che sembra riguardare una parte in cui la struttura del registro lo consente.
Chris Stratton,

1
@Chris Stratton STM32F302 Manuale di riferimento sezione 8.3.2: "I pin I / O del dispositivo sono collegati a periferiche / moduli di bordo attraverso un multiplexer che consente solo una funzione alternativa (AF) di una periferica collegata a un pin I / O alla volta. in questo modo, non ci possono essere conflitti tra le periferiche disponibili sullo stesso pin I / O. " Ma in realtà, questo non dice nulla sull'I / O multiplo su un AF. Esistono anche più opzioni per i pin di input?
Manu3l0us

1
Apprezzo anche le informazioni di F1x, ho usato anche quella :-)
joeforker
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.