ARM base의 MCU 입장에서의 GPIO는 AMBA bus에 연결된 SOC Periphral 입니다. APB bus에 연결된 Slave라고 보시면 되는거죠. 이런 GPUO들은 Register를 가지고 있고, CPU입장에서는 Register를 통해서 control 가능합니다.
그 control이라는 게 I/O로 쓸 수 있다고 했으니까, 어쩔 때는 input, 어쩔 때는 Output으로 써야 하니까, 이런 I/O는 Register를 통해서 Programmable하답니다.
1) Pin의 Mode를 정할 수 있습니다.
2) Pin의 상태 (Mode)를 활성화 하면서 Data Direction을 정할 수 있습니다.
3) 값을 읽거나, 쓰기 가능
Alternative Funtionally로 pin을 설정하게 되면 Hardware적으로 Path 자체가 해당 Alternative Function의 회로에 연결되므로, GPIO로서의 자격을 상실하게 됩니다.
GPIO는 Hardware적으로는 3상태 버퍼 Tristate Buffer로 구현이 됩니다. 3상태 Buffer라는 건 1, 0, High impedence(HI-Z) 요런 3가지 종류의 상태를 가질 수 있는 Buffer를 의미합니다.

Tristate Buffer를 살펴 보면, Switch가 1일 때는 I값이 o에 그대로 전달됩니다. Switch가 0일 때는 I값이 O에 전달되지 않고 회로가 열려 버려서, 마치 회로가 Open 된 것처럼 됩니다.
이렇게 Open 된 것처럼 된 상태를 Hi-Impedence (HI-Z)라고 읽고, I(Input)와 O(Output)의 연결된 부분이 끊어져서 I와 O는 서로 연관성이 없어지게 됩니다.
Switch를 0으로 만들어 놓고, I와 O를 isolation시키는 거죠, 결국 High impedence란 반대편의 Input을 그대로 받아들이는 상태라고 보시면 됩니다. 이 pin에 물려 있는 다른 편의 pin에 값이 1이며 이쪽도 1, 0이면 이쪽도 0 이런 식의 상태입니다.

출처 : 임베디드 레시피