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:
- Por que a ordem de inicialização é importante nos novos processadores?
- Por que a ordem de inicialização não importa nos processadores antigos?
- De que dois registros eles estão falando nos processadores modernos?
- De que registro único eles estão falando nos processadores antigos?
Se alguém pudesse fornecer algum tipo de diagrama, isso seria ainda melhor.
Respostas:
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 :
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 .
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 ):
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.
fonte
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.
fonte
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 para0
e 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.fonte