ARM GPIO口位操作

 问:wince上面能不能定义位变量,,就像51那样,
sbit led=P2^0;这种,操作led这个变量就是操作那个引脚了,,,
arm上面有没有类似的定义??用宏也行
     答:   1。ARM上没有位运算的变量,不过可以通过控制IO寄存器来实现某个IO口操作。
在CE下的话还需要编写符合微软规范的驱动程序。

    2。在WinCE上要想操作GPIO口,就得写驱动程序,通过虚拟地址映射来控制IO口,楼主可以先探索一下如何控制IO口吧,可以参考一下如何写GPIO流驱动。

    3。GPFDAT &=~(1<<0);//GPF0 置低
          GPFDAT |=(1<<0); //GPF0 置高

    4。一、定义一个字节(8位)的位变量,既可按字节访问也可按位进行访问
union flag // 先定义一个联合flag
{
  unsigned char val; // 再定义该联合中的一个字节型变量val
  struct // 定义一个结构型数据,构成位域。  
  {
  unsigned char B0:1; // B0~B7为每一位的名称,可用其他名称替换,例如B0可写成FLAG0。
  unsigned char B1:1; // B1可写成FLAG1
  unsigned char B2:1; // B2可写成FLAG2
  unsigned char B3:1; // B3可写成FLAG3

  unsigned char B4:1; // B4可写成FLAG4
  unsigned char B5:1; // B5可写成FLAG5
 unsigned char B6:1; // B6可写成FLAG6
  unsigned char B7:1; // B7可写成FLAG7 
  } bits; // 再定义该联合中的另一个结构型变量bits
};
volatile union flag flag; // 最后,定义该联合的变量flag,注意这句话中有两点要弄清楚,关键字volatile的本意是“易变”,在C30中一般不能省略;第一个flag是联合的名称,第二个flag是该联合的变量,这第二个flag可写成其他任意名称,例如lcd_ctrl等等。
有了上述定义就可以引用了,引用方法如下:
当按字节操作时,例如这样:flag.val = 0xAA; //变量flag被赋值:0xAA。
当按位操作时,例如这样:flag.bits.B0 = FALSE; // 0
  flag.bits.B1 = TRUE; // 1
  flag.bits.B2 = FALSE; // 0
  flag.bits.B3 = TRUE; // 1
  flag.bits.B4 = FALSE; // 0
 flag.bits.B5 = TRUE; // 1
  flag.bits.B6 = FALSE; // 0
  flag.bits.B7 = TRUE; // 1
在上述定义中,C30在内存中只分配一个字节的变量flag,因而操作起来极为方便,如果将上述定义中的volatile关键字去掉,也可应用于keil c51中,以解决51单片机中位变量有限(20H~2FH共128个位)的矛盾。
二、定义一个字(16位)的位变量,既可按字访问也可按位进行访问
这和定义字节位变量的方法相同,请看:
union flag // 先定义一个联合flag
{
  unsigned int val; // 再定义该联合中的一个字变量val

  struct // 定义一个结构型数据,构成位域。  
  {
  unsigned char B0:1; // B0~B7为每一位的名称,可用其他名称替换,例如B0可写成FLAG0。
  unsigned char B1:1; // B1可写成FLAG1
  unsigned char B2:1; // B2可写成FLAG2
  unsigned char B3:1; // B3可写成FLAG3
unsigned char B4:1; // B4可写成FLAG4
unsigned char B5:1; // B5可写成FLAG5
unsigned char B6:1; // B6可写成FLAG6
unsigned char B7:1; // B7可写成FLAG7  
unsigned char B8:1; // B8写写成FLAG8
 unsigned char B9:1; // B9可写成FLAG9
 unsigned char B10:1; // B10可写成FLAG10
 unsigned char B11:1; // B11可写成FLAG11
unsigned char B12:1; // B12可写成FLAG12
unsigned char B13:1; // B13可写成FLAG13
unsigned char B14:1; // B14可写成FLAG14

unsigned char B15:1; // B15可写成FLAG15  
} bits; // 再定义该联合中的另一个结构型变量bits
};
volatile union flag flag; // 最后,定义该联合的变量flag。
当按字操作时,例如这样:flag.val = 0x55AA; // 变量flag被赋值:0x55AA。
当按位操作时,例如这样:flag.bits.B0 = FALSE;// 0
 flag.bits.B12 = TRUE;// 1
在上述定义中,C30在内存中分配一个字变量flag。 
这是摘录的东西。可以用这种方法定义位变量。用共用体的方式对IO口进行操作是经常使用的一个手段。建议楼主查一下相关的资料。这个问题就很容易解决。看一下定义管脚是如何实现的。
另外,需要用流驱动的方式来调用你的底层。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值