Até o momento, nos posts anteriores, os pinos da GPIO foram utilizados apenas como saídas. Para ilustrar o uso da GPIO como entrada, será usado o botão do tipo pushbutton, que representa a forma mais simples de adentrar uma informação, pois será monitorado apenas dois estados: pressionado ou não. Para tanto, a placa STM32F4Discovery disponibiliza um botão para uso: o botão B1 (User), que pode ser acessado através da porta A, pino 0.
Face da placa onde pode ser observado o botão azul (User), próximo ao botão preto (Reset) |
Note que há presente na placa um segundo botão, de cor
preta. Trata-se do reset, utilizado
apenas para reinicializar a execução do código residente em flash.
Do ponto de vista da programação, a configuração
da porta/ pino é similar a de um pino de saída, respeitadas as devidas peculiaridades,
como será explicado a seguir, a partir do código fonte proposto, exibido
abaixo. Neste, a aplicação será a monitoração do botão de usuário, de forma que
se estiver pressionado, ele acenderá todos os LEDs da placa. Caso contrário, permanecerão
desligados.
Na linha 36, é configurado, como de costume, o clock da
porta A, habilitando-a para fins do propósito de uso do botão. Segue que na
linha 39 é indicado o pino 0 (conforme mencionado previamente) e na linha 41 é habilitado
obviamente o modo de entrada.
Especial atenção deve ser dada à configuração presente na
linha 45. Sendo o botão da placa ligado à tensão de alimentação, trata-se assim
de um dispositivo do tipo “pull-up”. Desta forma, do lado do software, o
pino deve ser declarado como uma entrada do tipo “pull-down”, exatamente ao
contrário do tipo de ligação física do dispositivo, como mostrado na linha 45. Deve-se
por isso tomar cuidado ao se usar botões externos conectados aos pinos, uma vez
que estes podem ser conectados à placa tanto em modo pull-up como pull-down,
devendo-se fazer a devida correspondência reversa no respectivo código.
Por fim, conclui-se a configuração desta porta de entrada
nas linhas 47, onde é definida a velocidade (lembrando que uma taxa mais baixa
implicará em maior economia de energia), sendo que na linha 49 a porta é
inicializada, como de praxe.
A fim de monitorar o botão para verificar seu
estado, dentro do propósito do programa, é usada a função GPIO_ReadInputDataBit embutida em uma chamada if,
concluindo assim as modificações importantes do código.
O resultado pode ser visto no vídeo abaixo, onde pode ser percebido a colocação de um botão externo conectado ao pino 0 da porta A (mesmo do botão User), funcionando em paralelo.
Com relação a este botão externo, deve-se atentar para que ele seja do tipo pull-up, ou seja, alimentado e não aterrado (observar que o botão é ligado ao pino de alimentação de 3 V disponibilizado pela placa). Além disso, notar o resistor colocado em série com este botão, a fim de prevenir uma corrente elevada que possa danificar a placa.O resultado pode ser visto no vídeo abaixo, onde pode ser percebido a colocação de um botão externo conectado ao pino 0 da porta A (mesmo do botão User), funcionando em paralelo.
Com este post, encerraremos a série relacionada à manipulação do periférico mais elementar disponibilizado pela placa, que são as portas de GPIO. Em posts futuros, abordaremos outros periféricos, a começar pela exploração mais aprofundada dos Timers, já abordado de forma simplificada em post anterior.
Nenhum comentário:
Postar um comentário