¿Qué sucede en el STM32 cuando dos pines están configurados para tener la misma función alternativa?

10

Leyendo el manual STM32F051, parece que es posible configurar la misma función alternativa en dos pines; por ejemplo, podría tener múltiples pines USART1_TX al mismo tiempo. O, por ejemplo, el caso más problemático de dos pines USART_RX. El manual no dice nada sobre este caso. ¿Es esto legal / seguro? ¿Esto es útil?

joeforker
fuente
2
Interesante pregunta. Sin embargo, puedo ver por qué a veces sería útil, por ejemplo, mientras se depura para obtener la salida TX a otro pin o para obtener relojes almacenados en búfer en algunos lugares. Sin embargo, podría valer la pena agregar el enlace del manual correspondiente para evitar que cualquiera tenga que buscarlo.
PeterJ
De nuevo, una pregunta interesante. Pero, ¿qué tal el caso de asignar USART_RX desde dos pines diferentes? Uno esperaría que los diseñadores de chips hayan planeado un esquema de prioridad para uno sobre el otro en lugar de permitir la contención interna de las dos fuentes.
Michael Karas
Nunca he intentado esto, pero según lo que recuerdo de los diagramas de pines, básicamente terminarías conectando los pines juntos internamente.
rjp

Respuestas:

5

En los procesadores que usan registros por pin para seleccionar funciones de E / S, generalmente es posible enrutar una función de salida a múltiples pines sin conflicto; Todos los pines harán eco en la misma salida. El efecto de tener múltiples pines conectados a una entrada a menudo no se especifica; si, por ejemplo, un UART tenía los pines de E / S 3 y 4 conectados a un UART, podría comportarse como si el UART estuviera conectado a una puerta "Y" que tomaba los pines 3 y 4 como entradas, o podría comportarse como si estuviera conectado a un pin e ignorar el otro, o podría conectar ambos pines al búfer de entrada del UART a través de transistores que tenían una cantidad moderada de resistencia, o podría extraer corriente adicional cuando el pin 3 es alto y 4 es bajo o viceversa, o podría hacer casi cualquier otra cosa imaginable. Yo no'

Un enfoque de diseño algo más agradable, utilizado en algunas partes de Microchip (quizás también algunas partes de STM) es hacer que cada función de E / S incluya un multiplexor para seleccionar de qué pin debe aceptar la entrada, y que el pin incluya un multiplexor para indicar el I / O función desde la que debe generar datos. Tal diseño hace posible que un pin alimente múltiples funciones de E / S, al mismo tiempo que elimina cualquier ambigüedad planteada por configuraciones en conflicto.

Super gato
fuente
3

Sí, es útil. Resultado del experimento en STM32F407VGT6: Ambos pines AF se pueden usar como AF simultáneamente, al menos si se usan estos pines como entradas AF. El experimento fue activar TIM1 en el borde ascendente del activador externo - señal "TIM1_ETR". La señal "TIM1_ETR" se puede asignar a los pines PE7 y / o PA12 del paquete MCU.

El experimento: Inicialice ambos pines PE7 y PA12 como AF "TIM1_ETR" para 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
}

El resultado: TIM1 se inicia con un flanco ascendente en cualquiera de los pines PE7 o PA12.

Esto revela el camino a los pines AF MUX (cambio) en tiempo de ejecución:

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

Esto puede ser útil, entonces se necesitan dos fuentes diferentes para la activación del temporizador, esto puede salvarnos fuera de MUX IC :). Ambas entradas se pueden usar simultáneamente, si se inicializan como se muestra al comienzo de la publicación. Las entradas no están conectadas entre sí, es decir, la señal en PA12 no se transfiere a PE7 y viceversa (porque los GPIO se configuran como entradas).

El código es generado por "STM32CubeF4 v5.3" + "Paquete de firmware V1.24.0 / 08-febrero-2019".

Dainius_m
fuente
2

Básicamente, los pines son GPIO que se pueden asignar a funciones alternativas, por ejemplo, UART_RX. Cada función alternativa tiene su pin predeterminado y pines alternativos a los que se puede reasignar la función. Si consulta el manual de referencia del STM32F103 en la sección 9.1.5, dicen:

Para optimizar el número de funciones periféricas de E / S para diferentes paquetes de dispositivos, es posible reasignar algunas funciones alternativas a otros pines. Esto se logra mediante el software, mediante la programación de los registros correspondientes (consulte Registros AFIO en la página 177. En ese caso, las funciones alternativas ya no se asignan a sus asignaciones originales .

Manu3l0us
fuente
La forma en que entiendo esto es: una vez que asigna los nuevos pines, se elimina la asignación anterior, por lo que técnicamente no puede tener múltiples pines conectados a la misma función periférica.
dext0rb
1
No es posible, porque (al menos en el F103, no he trabajado con las otras derivadas del STM32), el pin alternativo no se puede asignar a la función sin usar la función de reasignación, incluso si lo configura como AF_Output en La configuración de GPIO. Y después de la reasignación, la función ya no está disponible en el pin original. Espero que esto aclare lo que quise decir.
Manu3l0us
1
La forma en que se hace esto es muy diferente en las diferentes subfamilias. La estructura del registro F1 puede prohibirlo, pero la estructura F3 es diferente, donde configura el pin a una función alternativa en lugar de la función a un pin, por lo que parece posible la asignación de duplicados. En efecto, no está respondiendo la situación de la pregunta formulada, que parece ser sobre una parte donde la estructura del registro lo permite.
Chris Stratton
1
@Chris Stratton STM32F302 Ref. Manual, sección 8.3.2: "Los pines de E / S del dispositivo están conectados a periféricos / módulos integrados a través de un multiplexor que permite solo la función alternativa (AF) de un periférico conectado a un pin de E / S a la vez. de esta manera, no puede haber conflicto entre los periféricos disponibles en el mismo pin de E / S ". Pero en realidad, esto no dice nada sobre las E / S múltiples en un AF. ¿Hay incluso múltiples opciones para pines de entrada?
Manu3l0us
1
También aprecio la información de F1x, también la he usado :-)
joeforker