"); //-->
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]-->
<!--[endif]-->
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;
}
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。