O que acontece no STM32 quando dois pinos são configurados para ter a mesma função alternativa?

10

Lendo o manual STM32F051, parece possível configurar a mesma função alternativa em dois pinos; por exemplo, você pode ter vários pinos USART1_TX ao mesmo tempo. Ou, por exemplo, o caso mais problemático de dois pinos USART_RX. O manual é silencioso neste caso. Isso é legal / seguro? Isso é útil?

joeforker
fonte
2
Pergunta interessante. Eu posso ver por que às vezes seria útil, por exemplo, durante a depuração para obter a saída TX para outro pino ou para obter relógios em buffer em alguns lugares. Talvez valha a pena adicionar no link do manual relevante para salvar qualquer um que precise procurá-lo.
PeterJ
Mais uma vez - pergunta interessante. Mas e o caso de atribuir USART_RX a partir de dois pinos diferentes? Seria de esperar que os projetistas de chips tivessem planejado um esquema de prioridade um para o outro, em vez de permitir a contenção interna das duas fontes.
Michael Karas
Eu nunca tentei isso, mas com base no que me lembro dos diagramas de pinos, você basicamente acabaria conectando os pinos internamente.
Rjp 31/10/2013

Respostas:

5

Em processadores que usam registradores por pinos para selecionar funções de E / S, geralmente é possível rotear uma função de saída para vários pinos sem conflito; todos os pinos ecoam a mesma saída. O efeito de ter vários pinos conectados a uma entrada geralmente não é especificado; se, por exemplo, um UART tivesse os pinos de E / S 3 e 4 conectados a um UART, ele poderia se comportar como se o UART estivesse conectado a uma porta "AND" que utilizasse os pinos 3 e 4 como entradas, ou ele poderia se comportar como se estivesse conectado a um pino e ignore o outro, ou ele pode conectar os dois pinos ao buffer de entrada do UART por meio de transistores que tenham uma quantidade moderada de resistência, ou pode extrair corrente extra quando o pino 3 estiver alto e 4 estiver baixo ou vice-versa, ou pode fazer qualquer outra coisa imaginável. Eu não'

Uma abordagem de design um pouco mais agradável, usada em algumas peças do microchip (talvez também em peças STM) é fazer com que cada função de E / S inclua um multiplexador para selecionar de qual pino deve aceitar a entrada e que o pino inclua um multiplexador para indicar o I / O função a partir da qual deve gerar dados. Esse projeto possibilita que um pino alimente várias funções de E / S, enquanto elimina simultaneamente quaisquer ambiguidades impostas por configurações conflitantes.

supercat
fonte
3

Sim, é útil. Resultado da experiência no STM32F407VGT6: Os dois pinos AF podem ser usados ​​como AF simultaneamente, pelo menos se forem usados ​​como entradas AF. O experimento foi acionar o TIM1 na borda ascendente do sinal de acionamento externo - sinal "TIM1_ETR". O sinal "TIM1_ETR" pode ser mapeado para os pinos PE7 e / ou PA12 do pacote MCU.

O experimento: inicialize os pinos PE7 e 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
}

O resultado - TIM1 é iniciado pela borda ascendente em qualquer um dos pinos PE7 ou PA12.

Isso revela o caminho para os pinos AF MUX (mudança) no tempo de execução:

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

Isso pode ser útil, pois são necessárias duas fontes diferentes para o disparo do temporizador; isso pode nos salvar do MUX IC externo :). Ambas as entradas podem ser usadas simultaneamente, se inicializadas como mostrado no início do post. As entradas não estão conectadas juntas, quero dizer que o sinal no PA12 não é transferido para o PE7 e vice-versa (porque os GPIOs são definidos como entradas).

O código é gerado pelo "STM32CubeF4 v5.3" + "Pacote de firmware V1.24.0 / 08-fevereiro-2019."

Dainius_m
fonte
2

Basicamente, os pinos são GPIOs que podem ser atribuídos a funções alternativas, por exemplo, UART_RX. Toda função alternativa possui seu pino padrão e pinos alternativos nos quais a função pode ser remapeada. Se você verificar o manual de referência do STM32F103 na seção 9.1.5, eles dizem:

Para otimizar o número de funções de E / S periféricas para diferentes pacotes de dispositivos, é possível remapear algumas funções alternativas para outros pinos. Isso é conseguido pelo software, programando os registros correspondentes (consulte os registros do AFIO na página 177). Nesse caso, as funções alternativas não são mais mapeadas para suas atribuições originais .

Manu3l0us
fonte
A maneira como eu entendo isso é: depois de atribuir os novos pinos, a atribuição anterior é removida, para que você não possa tecnicamente ter vários pinos conectados à mesma função periférica.
dext0rb
11
Não é possível, porque (pelo menos no F103, eu não trabalhei com os outros derivados do STM32), o pino alternativo não pode ser atribuído à função sem usar o recurso remap, mesmo se você o configurar como AF_Output no a configuração do GPIO. E após o remapeamento, a função não está mais disponível no pino original. Espero que isso esclareça o que eu quis dizer.
Manu3l0us
11
A maneira como isso é feito é muito diferente nas diferentes subfamílias. A estrutura do registro F1 pode proibi-lo, mas a estrutura F3 é diferente, onde você configura o pino para uma função alternativa em vez da função para um pino, portanto, mapeamentos duplicados parecem possíveis. Com efeito, você não está respondendo à situação da pergunta, que parece ser sobre uma parte em que a estrutura do registro permite.
Chris Stratton
11
@ Chris Stratton STM32F302 Ref manual secção 8.3.2: "O dispositivo de I / O estão conectados a bordo periféricos / módulos através de um multiplexador que permite função alternativa apenas um de periférica (AF) conectado a um pino de I / O de cada vez no. dessa forma, não pode haver conflito entre periféricos disponíveis no mesmo pino de E / S. " Mas, na verdade, isso não diz nada sobre várias E / S em um AF. Existem várias opções para os pinos de entrada?
Manu3l0us
11
Agradeço a informação F1X também, eu usei essa também :-)
joeforker