Por que primeiro preciso definir um valor e depois a direção do GPIO em um processador incorporado?


16

Eu tenho um emprego em tempo integral como engenheiro de firmware. Recentemente, recebi uma tarefa de revisar as configurações do GPIO e alterar as configurações conforme necessário. Encontrei alguns pinos que foram configurados incorretamente de forma tão natural que os reconfigurei, mas me disseram que fiz isso na ordem errada. Aqui está o que eu estou falando:

Antes:
GPIO1.direction = INPUT;

Depois:
GPIO1.direction = OUTPUT;
GPIO1.value = 0;

No entanto, durante a revisão do código, fui informado de que preciso alterar a ordem de inicialização para o seguinte:

GPIO1.value = 0;
GPIO1.direction = SAÍDA;

Em outras palavras, defina primeiro o valor e, em seguida, defina a direção do pino. Também me disseram que é assim que os processadores modernos precisam ser, porque eles usam dois registradores, um para entrada e outro para saída, no entanto, os processadores antigos usam apenas um registro, portanto a ordem das operações não importa.
(Nota: Moderno = ARM Cortex M3 e superior, Antigo = Intel 8051)

Pedi uma explicação melhor no trabalho, mas não consegui uma boa resposta. Por isso decidi perguntar aqui.

Então, aqui estão as minhas questões:

  1. Por que a ordem de inicialização é importante nos novos processadores?
  2. Por que a ordem de inicialização não importa nos processadores antigos?
  3. De que dois registros eles estão falando nos processadores modernos?
  4. De que registro único eles estão falando nos processadores antigos?

Se alguém pudesse fornecer algum tipo de diagrama, isso seria ainda melhor.


11
Processadores "modernos" e "antigos" são vagos demais para dar uma resposta útil. Arquiteturas diferentes têm configurações de registro diferentes; sem saber de quem você está falando, não há como comentar inteligentemente sobre eles.
21416 Nick Johnson

@ IgnacioVazquez-Abrams Não, na verdade não. Havia engenheiros muito experientes na sala que disseram que você terá falhas na linha se isso for feito do meu jeito.
flashburn

@NickJohnson Modern = ARM Cortex M4 e acima, antigo = Intel 8051.
flashburn

@BrianDrummond LOL. Explicação muito boa. Mas e os processadores antigos, 8051, por exemplo. Por que isso não importa para eles?
flashburn

2
O quarto trimestre seria mais fácil de responder com um link de folha de dados.
Pjc50

Respostas:


22

O 8051 original usava as chamadas portas de saída pseudo-bidirecionais (dreno aberto com pullups), portanto não havia realmente nenhuma configuração de direção da porta.

Obviamente, para portas de saída bidirecionais verdadeiras modernas, é melhor ter um valor conhecido definido antes de ativar o pino da porta para saída, porque, caso contrário, você pode ter um transiente na saída que pode fazer algo indesejável.

Veja minha resposta aqui , por exemplo.

Edit: Aqui está a estrutura de pinos de E / S para um microcontrolador CMOS (relativamente) moderno :

insira a descrição da imagem aqui

TRIS (TRIState) é chamado DDR (Data Direction Register) em muitos outros micros. Nesse caso, se a saída da trava do TRIS estiver alta, os dois transistores estarão 'desligados', mas a porta ainda poderá ser lida.

Aqui está uma estrutura de pinos de E / S um pouco mais complexa para um micro Microchip mais recente .

insira a descrição da imagem aqui

Novamente, a trava do TRIS desativa a saída. Este inclui uma trava LAT que ajuda a evitar problemas de leitura, modificação e gravação . Na série PIC, você deve escrever apenas no registro LAT (e ler no registro PORT).

Aqui está o circuito interno original do pino da porta de E / S clássica 8051 e CMOS 8051 ( desta fonte ):

insira a descrição da imagem aqui

Há um pouco de complexidade extra, pois existe um transistor de aceleração em paralelo com o pull-up que é brevemente ligado para superar a capacitância externa. Como você pode ver, não há controle TRIS / DDR. Os MOSFETs de pull-up usados ​​na operação normal são 'fracos' - eles são pequenos o suficiente (baixo Idss) para que uma saída externa conectada ao pino possa puxar a linha de porta pseudo-bidirecional para baixo.


Obrigada pelo esclarecimento. Não trabalho com hardware há algum tempo, por isso tenho dificuldade em entender a explicação de uma descrição. Você se importaria de fornecer imagens? Diga como ficaria um hardware de configuração de pinos em um processador moderno em comparação com o 8051? Eu realmente apreciaria isto.
flashburn

O que você quer dizer com hardware? O circuito GPIO interno do chip?
Spehro Pefhany

Está correto. Algum tipo de diagrama seria realmente útil.
flashburn

16

Se você definir a direção primeiro, o pino será brevemente configurado para emitir o valor atual de saída. Se você definir o valor primeiro, isso não acontecerá.

Portanto, fazê-lo da maneira recomendada evita falhas na saída, que podem variar de inofensivas a catastróficas, dependendo do que o pino está conectado.


Obrigado. E os processadores antigos, por que isso não importa para eles? Antigo = Intel 8051
flashburn 16/07/2015

Não estou familiarizado com o 8051. Com base no que seus colegas disseram, se o mesmo registro configurar direção e valor, não importará porque o compilador otimizará as duas gravações em uma.
21416 Nick Johnson

2
provavelmente ainda seria um bom hábito fazê-lo dessa maneira "nova" para processadores antigos também pela razão acima. Diferentes processadores podem ter requisitos diferentes, diferentes fornecedores podem sugerir melhor que outros, e diferentes empresas / empregadores / equipes podem ter políticas diferentes sobre esses detalhes.
billt

2
na verdade ... sempre suponha que o DIO esteja conectado ao laser orbital da desgraça;) #
Michael

4

Supondo que a direção padrão seja uma entrada (ou seja, High-Z, que está fazendo sentido, pois não queremos que o MCU force nenhum valor nas linhas conectadas), essa ordem de configuração da porta é preferível, mas não necessária. Na verdade, é necessário quando seu aplicativo exige que, na inicialização, o valor da porta não seja, digamos 1. Então você definirá o valor para 0e depois mudará a direção. Nesse caso, você evita a possível "falha" momentânea entre definir a direção e o valor, o que pode resultar em um pico nesse pino. E é verdade para todos os processadores que possuem essa lógica, não apenas os novos.

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.