ARM裸机学习(GPIO)

一、底层函数解析

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;
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值