首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ARM GPIO口位操作

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位)的位变量,既可按字访问也可按位进行访问
这和定义字节位变量的方法相同,请看:
继承事业,薪火相传
返回列表