2023年12月24日发(作者:)

学ARM之路, I/O口编程实例

I/O口编程实例

通过一个对G口的操作实例控制LED1和LED2实现轮流闪烁

对I/O口的操作是通过对相关寄存器的读/写实现的。要对寄存器进行读/写操作,首先要对寄存器进行定义。有关I/O相关寄存器的宏定义代码如下:

#define rGPACON (*(volatile unsigned*)0x56000000) //Port A控制寄存器

#define rGPADAT (*(volatile unsigned*)0x56000004) //Port A数据寄存器

#define rGPBCON (*(volatile unsigned*)0x56000010) //Port B控制寄存器

#define rGPBDAT (*(volatile unsigned*)0x56000014) //Port B数据寄存器

#define rGPBUP (*(volatile unsigned*)0x56000018) //Port B上拉电阻禁止寄存器

#define rGPCCON (*(volatile unsigned*)0x56000020) //Port C控制寄存器

#define rGPCDAT (*(volatile unsigned*)0x56000024) //Port C数据寄存器

#define rGPCUP (*(volatile unsigned*)0x56000028) //Port C上拉电阻禁止寄存器

#define rGPDCON (*(volatile unsigned*)0x56000030) //Port D控制寄存器

#define rGPDDAT (*(volatile unsigned*)0x56000034) //Port D数据寄存器

#define rGPDUP (*(volatile unsigned*)0x56000038) //Port D上拉电阻禁止寄存器

#define rGPECON (*(volatile unsigned*)0x56000040) //Port E控制寄存器

#define rGPEDAT (*(volatile unsigned*)0x56000044) //Port E数据寄存器

#define rGPEUP (*(volatile unsigned*)0x56000048) //Port E上拉电阻禁止寄存器

#define rGPFCON (*(volatile unsigned*)0x56000050) //Port F控制寄存器

#define rGPFDAT (*(volatile unsigned*)0x56000054) //Port F数据寄存器

#define rGPFUP (*(volatile unsigned*)0x56000058) //Port F上拉电阻禁止寄存器

#define rGPGCON (*(volatile unsigned*)0x56000060) //Port G控制寄存器

#define rGPGDAT (*(volatile unsigned*)0x56000064) //Port G数据寄存器

#define rGPGUP (*(volatile unsigned*)0x56000068) //Port G上拉电阻禁止寄存器

#define rGPHCON (*(volatile unsigned*)0x56000070) //Port H控制寄存器

#define rGPHDAT (*(volatile unsigned*)0x56000074) //Port H数据寄存器

#define rGPHUP (*(volatile unsigned*)0x56000078) //Port H上拉电阻禁止寄存器

要想实现对G口的配置,只要在地址0x56000060中给32位的每一位赋值就可以了。如果G口的某个引脚被配置为输出引脚,在PDATG对应的地址位写入1时该引脚输出高电平;写入0时该引脚输出低电平。如果该引脚被配置为功能引脚,则该引脚作为相应的功能引脚使用。

下面是实现LED1和LED2轮流闪烁的程序代码:

void Main(void){

int flag,i;

Target_Init();//进行硬件初始化操作,包括对I/O口的初始化操作

for(; ;){

if(flag==0){

for(i=0;i<1000000;i++); //延时

rGPGCON=rGPGCON&0xfff0ffff|0x00050000; //配置第8、第9位为输出引脚

rGPGDAT=rGPGDAT&0xeff|0x200; //第8位输出为低电平

//第9位输出为高电平

for(i=0;i<10000000;i++); //延时

flag=1;

}

else{

for(i=0;i<1000000;i++); //延时

rGPGCON=rGPGCON&0xfff0ffff|0x00050000; //配置第8、第9位为输出引脚

rGPGDAT=rGPGDAT&0xdff|0x100; //第8位输出为高电平

//第9位输出为低电平

for(i=0;i<10000000;i++); //延时

flag=0;

}

}

}