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?


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.


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."


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 .


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.