ARM编程:关于ARM寄存器的宏定义

ARM编程:关于ARM寄存器的宏定义
[gf86530430] [136次] 2008-8-27
请问各位大虾:
在ARM的头文件里,对与寄存器的定义为什么不跟51的一样?代码如下:
#define rUTXH0 (*(volatile unsigned char *)0x1d00020)
#define rUTXH1 (*(volatile unsigned char *)0x1d04020)
#define rURXH0 (*(volatile unsigned char *)0x1d00024)
#define rURXH1 (*(volatile unsigned char *)0x1d04024)
#define WrUTXH0(ch) (*(volatile unsigned char *)0x1d00020)=(unsigned char)(ch)
#define WrUTXH1(ch) (*(volatile unsigned char *)0x1d04020)=(unsigned char)(ch)
#define RdURXH0() (*(volatile unsigned char *)0x1d00024)
#define RdURXH1() (*(volatile unsigned char *)0x1d04024)
#define UTXH0 (0x1d00020)     //byte_access address by BDMA
#define UTXH1 (0x1d04020)
#define URXH0 (0x1d00024)
#define URXH1 (0x1d04024)

对于寄存器 知道地址 直接 用#define URXH1 0x1d04024
就好了,干什么还用(*(volatile unsigned char *)0x1d00020)搞个强制类型转化啊?
请知道的大侠,详细的解答一下,小弟在这里不胜感激!!!!!

 

可以简化后面的程序[qllaoda] [80次] 2008-8-27 10:53:08


用这种方式定义后,你就可以直接用
rUTXH0=xxx或xxx=rUTXH0之类的方式来读写寄存器了

 

但是为什么不直接用#define add呢?[gf86530430] [65次] 2008-8-28 8:39:54


但是,下面有些用于DMA方式的寄存器就没这么写,为什么要有区别,
还有直接定义他的地址不是也可以么?
#define uart 0x00000060
i = uart;
请qllaoda 大侠详细解释一下 ,麻烦!

 

这样当然不行[qllaoda] [64次] 2008-8-28 9:20:37


#define uart 0x00000060
i = uart;

这样的语句,经过宏替换后,就相当于
i=0x00000060;
这样的语句当然达不到读写寄存器的效果。

 


哦 那我这样写呢?[gf86530430] [64次] 2008-8-28 13:00:46


51有个Sfr 这个关键字所以可以直接定义寄存器
如 Sfr SBUF 0xc6;
ARM不支持 这样的方式,
但是 我这样定义不行么?
unsigned int SBUF _at_  0xc6;
如果不考虑 资源占用情况的化,也是可以实现对寄存器固定地址的访问的?
请qllaoda 解释
麻烦了!!

 

ARM编译器不支持sfr关键字。[qllaoda] [45次] 2008-8-28 16:11:33

 

 


但是按照变量的方式定义呢?[gf86530430] [52次] 2008-8-28 16:21:03


假如不考虑资源占用的情况
用变量定义是否可以?
unsigned char SBUF _at_ 0xc5;

 


寄存器不等同于普通变量,那种方法是通用的标准方法,你就别在这个问题上钻牛角尖了[qllaoda] [52次] 2008-8-28 16:48:58

 

 


呵呵,谢谢qllaoda及anno![gf86530430] [36次] 2008-8-29 8:40:29


呵呵,谢谢qllaoda及anno的答复<BR>我就是不明白,知识应该是相通的,可能是有点转牛
角尖了。<BR>结贴吧!

 

是一个地址指针的概念[anno] [62次] 2008-8-28 9:42:30


首先寄存器的话 肯定是定义为指针类型比较好的
51之所以可以那么定义是keil编译器的功能
而标准C的话是不能识别那样的地址定义的
用了volatile是防止编译器优化导致数据读写出错
具体的你可以上网看看volatile的使用规则

 

你那么定义也行,只不过用时加上[ddllxxrr] [50次] 2008-8-28 15:46:07


#define ddllxxrr 1000

(*(volatile unsigned char *)1000 = 33;

 

建议看看C语言的书[anno] [48次] 2008-8-28 17:56:06


不要把c51当标准C语言
你如果有机会接触GCC的话(linux)
就会知道标准c是怎么写的
既然是在学ARM
就接受新的知识
别拿51做比较
ARM很多地方跟51是没有可以相比之处的
硬是要分出所以然来
以为能承前启后
其实是没意义的事

 


结帖成功,感谢[qllaoda]的回答[gf86530430] [27次] 2008-8-29 8:43:35


感谢qllaoda,答案已接受,您获得20分专家分

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值