一、底层函数解析
1、端口初始化函数
typedef struct{
U32 pinx;
GPIO_MODE mode;
GPIO_UDP udp;
}GPIO_INIT_typedef; //(端口针脚号、端口模式、上拉下拉模式)
void GPIO_INIT(GPIO_PORT portx,GPIO_INIT_typedef gpio_init) //传递进来的是端口号、以及需要初始化的内容(端口模式、上拉下拉模式)
{
int i;
for(i=0;i<32;i++)
{
if((gpio_init.pinx && (1<<i))==(1<<i)) //找到所需要初始化的针脚号
{
if(portx==GPIOA) //因为A口与其他端口的模式有差别所以单独考虑
{
if(gpio_init.mode==MODE_GPCON_OUT) //接下来根据不同模式进行初始化
{
PORT_BASE[portx]->GPCON &=~(1<<i);
}else if(gpio_init.mode==MODE_GPCON_ALT1)
{
PORT_BASE[portx]->GPCON |=(1<<i);
}
}
else //一般情况如何初始化
{
PORT_BASE[portx]->GPCON &=~(0x3<<(2*i));
PORT_BASE[portx]->GPCON |=(gpio_init.mode<<(2*i));
PORT_BASE[portx]->GPUDP &=~(0x3<<(2*i));
PORT_BASE[portx]->GPUDP |=(gpio_init.udp<<(2*i));
}
}
}
}
const GPIO PORT_BASE[7]={GPIOA_BASE,GPIOB_BASE,GPIOC_BASE,GPIOD_BASE,GPIOE_BASE,GPIOF_BASE,GPIOG_BASE}; //注意:一定要const,要不然数组里的东西会全部被更改掉
2、写入函数
void GPIO_write(GPIO_PORT portx,U32 pinx,BIT_typedef bit) //传递端口号、针脚号、高低电频
{
if(bit==BIT_SET) //判断摸个端口的对应针脚号是否置高电平
{
PORT_BASE[portx]->GPDAT |=pinx; //置高位
}
else if(bit==BIT_RESET)
{
PORT_BASE[portx]->GPDAT &=~pinx;
}
}
3、读取函数
BIT_typedef GPIO_read(GPIO_PORT portx,U32 pinx) //传递端口号、针脚号
{
if((PORT_BASE[portx]->GPDAT & pinx)==pinx) //查找指定端口的指定针脚号
{
return BIT_SET; //返回该位的电平
}
else
return BIT_RESET;
}