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


发布评论