STM32 Noções básicas sobre configurações de GPIO

41

Na biblioteca Periférica Padrão do STM32, precisamos configurar o GPIO.

Mas existem 3 funções que não sei como configurá-las;

  • GPIO_InitStructure.GPIO_Speed
  • GPIO_InitStructure.GPIO_OType
  • GPIO_InitStructure.GPIO_PuPd

No GPIO_Speed , há 4 configurações para escolher

GPIO_Speed_2MHz  /*!< Low speed */
GPIO_Speed_25MHz /*!< Medium speed */
GPIO_Speed_50MHz /*!< Fast speed */
GPIO_Speed_100MHz

Como sei qual velocidade eu escolho? Existe alguma vantagem ou desvantagem no uso de alta ou baixa velocidade? (por exemplo: consumo de energia?)

No GPIO_OType , há duas configurações para escolher

GPIO_OType_PP // Push pull
GPIO_OType_OD // Open drain

Como saber qual escolher? e o que é dreno aberto e push pull?

No GPIO_PuPd , há 3 configurações para escolher

GPIO_PuPd_NOPULL // No pull
GPIO_PuPd_UP     // Pull up
GPIO_PuPd_DOWN   // Pull down

Eu acho que essas configurações estão relacionadas à configuração inicial do push pull.

Tim
fonte
Relacionado: como forçar explicitamente o modo "open drain" em microcontroladores que não têm suporte nativo para ele, como AVR / Arduino, PIC, etc: electronics.stackexchange.com/a/354993/26234
Gabriel Staples

Respostas:

45
  • GPIO_PuPd (pull-up / pull-down)

    Nos circuitos digitais, é importante que as linhas de sinal nunca possam "flutuar". Ou seja, eles precisam sempre estar em um estado alto ou baixo. Ao flutuar, o estado é indeterminado e causa alguns tipos diferentes de problemas.

    A maneira de corrigir isso é adicionar um resistor da linha de sinal para Vcc ou Gnd. Dessa forma, se a linha não estiver sendo ativada alta ou baixa, o resistor fará com que o potencial seja desviado para um nível conhecido.

    O ARM (e outros microcontroladores) possuem circuitos internos para fazer isso. Dessa forma, você não precisa adicionar outra parte ao seu circuito. Se você escolher "GPIO_PuPd_UP", por exemplo, é equivalente a adicionar um resistor entre a linha de sinal e o Vcc.

  • GPIO_OType (tipo de saída):

    Push-Pull: este é o tipo de saída que a maioria das pessoas considera "padrão". Quando a saída é baixa, é ativamente "puxada" para o chão. Por outro lado, quando a saída é definida como alta, ela é "empurrada" ativamente em direção a Vcc. Simplificado, fica assim:

    empurrar puxar

    Uma saída de dreno aberto, por outro lado, só está ativa em uma direção. Ele pode puxar o pino em direção ao solo, mas não pode empurrá-lo alto. Imagine a imagem anterior, mas sem o MOSFET superior. Quando não está puxando para o chão, o MOSFET é simplesmente não condutor, o que faz com que a saída flutue:

    opendrain

    Para este tipo de saída, é necessário adicionar um resistor de pull-up ao circuito, o que fará com que a linha fique alta quando não for acionada em baixa. Você pode fazer isso com uma parte externa ou definindo o valor GPIO_PuPd como GPIO_PuPd_UP.

    O nome vem do fato de que o dreno do MOSFET não está conectado internamente a nada. Esse tipo de saída também é chamado de "coletor aberto" ao usar um BJT em vez de um MOSFET.

  • GPIO_Speed

    Basicamente, isso controla a taxa de giro (o tempo de subida e queda) do sinal de saída. Quanto mais rápida a taxa de variação, mais ruído é irradiado do circuito. É uma boa prática manter a taxa de variação lenta e apenas aumentá-la se você tiver um motivo específico.

bitsmack
fonte
obrigado! pela ótima resposta;), você se importa de explicar um pouco mais sobre problemas diferentes quando está no estado flutuante?
Tim
3
A idéia é que permanecer por um período de tempo em uma tensão de entrada intermediária possa ativar parcialmente os FETs superiores e inferiores em um bloco de entrada e diminuir parcialmente a fonte de alimentação através deles, resultando em consumo excessivo de energia ou (em casos especialmente graves) ) danos potencialmente.
22715 Chris Stratton
@ Tim Sim, o que Chris Stratton apenas disse :)
bitsmack
3
@ Tim Além disso, quando as linhas estão flutuando, é muito fácil perturbar os níveis de tensão. Apenas acenando sua mão ao redor do circuito pode mudar o estado da entrada, por causa das interações capacitivos ...
bitsmack
1
@ Tim Depende realmente da aplicação. Se você está lendo um interruptor (ou botão), isso realmente não importa. Se você estiver fazendo interface com outros componentes, isso depende da interface. Por exemplo, para comunicações SPI, a linha CS está ativa-baixa. Nesse caso, você desejaria um resistor pull-up, para que o CS nunca caísse inadvertidamente. Você pode pensar que isso é desnecessário se você sempre conduzir ativamente a linha com um microcontrolador. Mas e antes de o microcontrolador inicializar? Ou se redefinir? O resistor pull-up remove qualquer ambiguidade ...
bitsmack
5

GPIO Speed ​​é a frequência máxima que o GPIO pode produzir. Configurações mais baixas podem economizar energia.

O tipo de saída é se o pino indica altos e baixos (push pull) ou se a saída gira no portão de um FET que está conectado ao pino no dreno (dreno aberto). Isso pode ser conveniente se você precisar de algum pino conectado para poder puxar um barramento baixo sem colocar outros pinos em curto.

Os resistores de puxar prendem a saída do pino ao trilho de força e os prendem por um resistor ao terra. Isso controlará, entre outras coisas, a tensão do pino, mesmo que o bit esteja em um estado de alta impedância. Isso é importante para fazer coisas como usar um interruptor local para alterar um valor de entrada digital. Mesmo com o interruptor aberto, a entrada é previsível.

Scott Seidman
fonte