Olá pessoal, nos artigos anteriores realizamos toda a configuração da IDE e da CPU do processador. Agora iremos focar no principal e mais básico de todos os periféricos que a arquitetura ARM nos oferece: GPIO (General Purpose Input Output).
Este periférico é responsável pelas entradas e saídas a serem definidas para cada IO.
Para isso, vou utiliza como base a família LPC21XX, na NXP.
Veja abaixo a disposição do mapa de periféricos presentes nesta plataforma ARM7 (Exemplo: LPC2142).
O GPIO é composto por 4 registradores específicos. Cada qual com uma função de controle ou varredura. São os registradores: IODIR, IOPIN, IOSET, IOCLR;
Cada registrador possui seu endereçamento em 32 bits para representação de todos os IO´s do PORT.
Na figura abaixo, segue um resumo da definição e respectiva função de cada um:
Como plataforma de teste, irei utilizar um Kit ARM 7 desenvolvido pela empresa Eng-House. Este Kit pode ser usado para este estudo bem como para os demais que estarei demonstrando. Mas fiquem livre para testar e aplicar este código em outras plataformas. Só é importante alterar o Device utilizado.
Esta disponibilizado o Download completo do programa no final do Post para servir como referência de estudo.
Abaixo alguns trechos importantes a serem observados:
#define OUT1 (1 << 7) //P0.7_PWM2 #define OUT2 (1 << 8) //P0.8_PWM4 #define OUT3 (1 << 21) //P1.21_PWM5 #define OUT4 (1 << 9) //P1.9_PWM6
O trecho acima mostra uma operação bit a bit para “habilitar/modificar” um bit especifico de um byte que neste caso representa o byte que controla o IO.
Um exemplo de como esta operação ocorre:
O deslocamento à esquerda ocorre a partir do bit 0 em “direção” ao bit 31.
IOSET0 |= OUT1; //coloco a saída P0.7 do microcontrolador em nível ALTO delay(50000); /* Delay 50000us */ IOCLR0|= OUT1; //coloco a saída P0.7 do microcontrolador em nível BAIXO IOSET0 |= OUT2; //coloco a saída P0.8 do microcontrolador em nível ALTO delay(50000); /* Delay 50000us */ IOCLR0|= OUT2; //coloco a saída P0.8 do microcontrolador em nível BAIXO IOSET1 |= OUT3; //coloco a saída P1.21 do microcontrolador em nível ALTO delay(50000); /* Delay 50000us */ IOCLR1|= OUT3; //coloco a saída P1.21 do microcontrolador em nível BAIXO IOSET1 |= OUT4; //coloco a saída P1.9 do microcontrolador em nível ALTO delay(50000); /* Delay 50000us */ IOCLR1|= OUT4; //coloco a saída P1.9 do microcontrolador em nível BAIXO
Notem que eu não preciso seguir sequencialmente os bits do PORT. Eu realizo o acionamento dos mesmos conforme desejo e necessidade. Aleatoriamente.
Muitos podem achar curioso a utilização da expressão:
IOSET0 |= OUT4;
O “|=” é uma abreviação da operação bit a bit:
IOSET0 = IOSET0|OUT4;
Dessa forma realizamos o “SET” para nível Alto do bit P1.9 sem afetar o estado anterior dos demais bits (IO´s) deste PORT.
Abaixo o exemplo completo deste programa para um estudo completo:
Abraços e até a próxima!







