ARM裸机学习(二)

来源:互联网 发布:淘宝抢购怎么看名次 编辑:程序博客网 时间:2024/05/21 19:39

一、底层函数解析

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;                                  //返回该位的电平}elsereturn BIT_RESET;}



原创粉丝点击