查看文章 |
GPIO不同于一般单片机的I/O口,它的全名是General Perpose I/O Module,所不同的就是,它是普通意义上的I/O口。一般单片机也有复用的I/O口,可是也有很多引脚不能够复用,比如中断引脚等。而GPIO的含义就是,所有的引脚都可以当I/O口来使用,当然一般还是除了电源、振荡器的引脚,当然在ColdFire中,BDM的引脚也不可以当作I/O口使用。 在ColdFire中,I/O口的命名与其他单片机也不太相同,是用两个字母命名的,除了会给记忆造成点麻烦外, 也没有其他什么不好。 GPIO模块包含必要的寄存器: 1、输出寄存器PORTn 输出的数据需要写到这个寄存器,由于GPIO每个I/O口包含的位数不一定相同,所以I/O口对应的寄存器不一定是8位都使用的。 <!--[if !vml]--> 2、数据方向寄存器DDRn 这个很熟悉了,需要初始化为使用的数据传输方向。 3、引脚数据设置寄存器SETn 可以设置引脚状态,并反映其状态。 4、输出数据清除寄存器CLRn 可以按位清除输出数据。 5、复用功能寄存器PnPAR 可以设置当前I/O口是使用GPIO功能还是使用其复用的特殊功能。 6、线或寄存器PWOR 设置线或,即不使用拉电阻。 7、驱动能力寄存器 可以设置驱动能力,2mA或者10mA。
可以看到,CF的GPIO和9S12单片机的I/O口倒也没有很大的区别,无非就是设置数据方向并且读写I/O口,只要复用功能寄存器设置合理的话,可以任意使用其片上资源。但是值得注意的是,CF的GPIO模块没有中断功能,而9S12有,比如说9S12的J口和H口都可以使用中断,为什么CF没有呢,因为CF有单独的中断控制器,比如MCF52235,它可以接16个中断源。当然这16个引脚也是GPIO的引脚。 下面给个例子程序,非常简单。例子实现对应I/O连接发光二极管的闪烁。 void delay() { unsigned long i=200000; while(i--) {
} }
int main() { //printf("Hello World in C\n\r");
//fflush(stdout); MCF_GPIO_DDRTC=0xff; while(1) { MCF_GPIO_PORTTC=0x55; delay(); MCF_GPIO_PORTTC=0xaa; delay(); }// Idle
return 0; } |
本文引用通告地址:http://moran.spaces.eepw.com.cn/articles/trackback/item/32394
