标题:
ARM GPIO口位操作
[打印本页]
作者:
yuyang911220
时间:
2014-10-30 20:16
标题:
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位)的位变量,既可按字访问也可按位进行访问
这和定义字节位变量的方法相同,请看:
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0