初学者一个关于.h中定义的一些问题,高人指点。

chym168   2007-10-6 22:02 楼主
#ifndef __44B0X_H__
#define __44B0X_H__

#ifdef __cplusplus
extern "C" {
#endif

#include "option.h"

/* System */
#define rSYSCFG                (*(volatile unsigned *)0x1c00000)

/* Cache */
#define rNCACHBE0        (*(volatile unsigned *)0x1c00004)
#define rNCACHBE1        (*(volatile unsigned *)0x1c00008)

/* Bus control */
#define rSBUSCON        (*(volatile unsigned *)0x1c40000)
   
/* Memory control */
#define rBWSCON                (*(volatile unsigned *)0x1c80000)
#define rBANKCON0        (*(volatile unsigned *)0x1c80004)
#define rBANKCON1        (*(volatile unsigned *)0x1c80008)
#define rBANKCON2        (*(volatile unsigned *)0x1c8000c)
#define rBANKCON3        (*(volatile unsigned *)0x1c80010)
#define rBANKCON4        (*(volatile unsigned *)0x1c80014)
#define rBANKCON5        (*(volatile unsigned *)0x1c80018)
#define rBANKCON6        (*(volatile unsigned *)0x1c8001c)
#define rBANKCON7        (*(volatile unsigned *)0x1c80020)
#define rREFRESH        (*(volatile unsigned *)0x1c80024)
#define rBANKSIZE        (*(volatile unsigned *)0x1c80028)
#define rMRSRB6                (*(volatile unsigned *)0x1c8002c)
#define rMRSRB7                (*(volatile unsigned *)0x1c80030)

/* UART */
#define rULCON0                (*(volatile unsigned *)0x1d00000)
#define rULCON1                (*(volatile unsigned *)0x1d04000)
#define rUCON0                (*(volatile unsigned *)0x1d00004)
#define rUCON1                (*(volatile unsigned *)0x1d04004)
#define rUFCON0                (*(volatile unsigned *)0x1d00008)
#define rUFCON1                (*(volatile unsigned *)0x1d04008)
#define rUMCON0                (*(volatile unsigned *)0x1d0000c)
#define rUMCON1                (*(volatile unsigned *)0x1d0400c)
#define rUTRSTAT0        (*(volatile unsigned *)0x1d00010)
#define rUTRSTAT1        (*(volatile unsigned *)0x1d04010)
#define rUERSTAT0        (*(volatile unsigned *)0x1d00014)
#define rUERSTAT1        (*(volatile unsigned *)0x1d04014)
#define rUFSTAT0        (*(volatile unsigned *)0x1d00018)
#define rUFSTAT1        (*(volatile unsigned *)0x1d04018)
#define rUMSTAT0        (*(volatile unsigned *)0x1d0001c)
#define rUMSTAT1        (*(volatile unsigned *)0x1d0401c)
#define rUBRDIV0        (*(volatile unsigned *)0x1d00028)
#define rUBRDIV1        (*(volatile unsigned *)0x1d04028)

#ifdef __BIG_ENDIAN
#define rUTXH0                (*(volatile unsigned char *)0x1d00023)
#define rUTXH1                (*(volatile unsigned char *)0x1d04023)
#define rURXH0                (*(volatile unsigned char *)0x1d00027)
#define rURXH1                (*(volatile unsigned char *)0x1d04027)
#define WrUTXH0(ch)        (*(volatile unsigned char *)(0x1d00023))=(unsigned char)(ch)
#define WrUTXH1(ch)        (*(volatile unsigned char *)(0x1d04023))=(unsigned char)(ch)
#define RdURXH0()        (*(volatile unsigned char *)(0x1d00027))
#define RdURXH1()        (*(volatile unsigned char *)(0x1d04027))  
#define UTXH0                (0x1d00020+3)  //byte_access address by BDMA
#define UTXH1                (0x1d04020+3)
#define URXH0                (0x1d00024+3)  
#define URXH1                (0x1d04024+3)  

#else //Little Endian
#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)
#endif

/* SIO */
#define rSIOCON                (*(volatile unsigned *)0x1d14000)
#define rSIODAT                (*(volatile unsigned *)0x1d14004)
#define rSBRDR                (*(volatile unsigned *)0x1d14008)
#define rIVTCNT                (*(volatile unsigned *)0x1d1400c)
#define rDCNTZ                (*(volatile unsigned *)0x1d14010)

/* IIS */
#define rIISCON                (*(volatile unsigned *)0x1d18000)
#define rIISMOD                (*(volatile unsigned *)0x1d18004)
#define rIISPSR                (*(volatile unsigned *)0x1d18008)
#define rIISFCON        (*(volatile unsigned *)0x1d1800c)

#ifdef __BIG_ENDIAN
#define rIISFIF                ((volatile unsigned short *)0x1d18012)

#else //Little Endian
#define rIISFIF                ((volatile unsigned short *)0x1d18010)
#endif

回复评论 (18)

这是一个关于串口的程序中的.h文件

想问:
      为什么有的寄存器以这种(*(volatile unsigned *)0x1c80000)
形式读出其中的值呢?寄存器只有8位或16位,这样读出的是32位的,那不是错了?
为什么要这么做呢?

而有的寄存器又以(*(volatile unsigned char *)0x1d04020)
种形式读出,这样不是正好8位吗?

为什么存在以上两种形式,不知怎么回事?还是我对以上读出的理解有问题?


高人指点!!!!!!!!!!
点赞  2007-10-6 22:06
大家帮忙
点赞  2007-10-7 09:11
"为什么有的寄存器以这种(*(volatile unsigned *)0x1c80000)  
形式读出其中的值呢?寄存器只有8位或16位,这样读出的是32位的,那不是错了?
为什么要这么做呢?"

确定0x1c80000只是一个地址,我们不管这个地址有多大,内存最小存储单位是8位,那么该地址上只存有8位,而unsigned *是0x1c80000和0x1c80001组成的高8位和低8位了(有些体系结构高低顺不一样,这是编译器的处理的..)
点赞  2007-10-7 10:57
没明白,好像和我问的有些出入,请详细解释!!!!!!!!
点赞  2007-10-7 14:09
内存的地址是以字节存存储的,就是说每个地址1个自己,如0x1c80000存以个字节,0x1c80001存1个字节,0x1c80002存1个字节,0x1c80003存1个字节.

如果系统要读1个字节(char型)就直接读0x1c80000地址就可以了
如果系统要读2个字节(unsigned型)假设读0x1c80000为高8位,读0x1c80001为低8位就是16位,只要用上面的形式定义强制定义成unsigned的指到0x1c80000上,系统会自动的读0x1c80000和0x1c80001两地址的值组合起来..

如果系统要读4个字节以此类推..
点赞  2007-10-7 15:11
(*(volatile unsigned *)0x1c80000)的意思是取出当前0x1c800000寄存器位置开始的值,需要几位就用相应类型。
点赞  2007-10-8 09:24
请详细解释,不是很明白。谢谢了!!!!!!!!!!!
点赞  2007-10-8 14:09
我想问的是:unsigned 应该是无符号整型吧,应该是4字节。但是我的这个控制芯片只用到8位或16位的寄存器,为什么要读取32位呢?

还是unsigned根本就不是无符号整型,我说的不对呢?

-----------------------------------是这位老兄说的那样吗?大家帮忙了!
(*(volatile unsigned *)0x1c80000)的意思是取出当前0x1c800000寄存器位置开始的值,需要几位就用相应类型。
点赞  2007-10-8 14:14
"还是unsigned根本就不是无符号整型"
各平台定义不一样,你的平台应该定义是2个字节
点赞  2007-10-9 08:20

(*(volatile unsigned *)0x1c80000)的意思是取出当前0x1c800000寄存器位置开始的值,需要几位就用相应类型。
-----------------------------------是这位老兄说的那样吗?大家帮忙了!
点赞  2007-10-9 10:13
(*(volatile unsigned *)0x1c80000)的意思是取出当前0x1c800000寄存器位置开始的值,需要几位就用相应类型。
-----------------------------------是这位老兄说的那样吗?大家帮忙了!
点赞  2007-10-10 17:33
(*(volatile unsigned *)0x1c80000)的意思是取出当前0x1c800000寄存器位置开始的值,需要几位就用相应类型。  
-----------------------------------是这位老兄说的那样吗?大家帮忙了!
点赞  2007-10-11 10:37
你这个文件是ARM7 TDMI的一个头文件。
你需要了解ARM汇编中对于不同长度的数据使用不同的访问指令,换句话讲就是:访问4字节的是使用LDR/STR,访问1字节使用LDRB/STRB
另外你需要一份S3C44B0的说明书,上面已经很明确的表达了“寄存器只能以其规定的字长进行访问”,而资料上的寄存器列表也已经列举出各个寄存器的访问字长。我们所需要的就是按照说明书规定的字长去访问相应的寄存器。。。
#define rBWSCON (*(volatile unsigned *)0x1c80000) //rBWSCON寄存器规定是WORD字长的(ARM的WORD字长为4字节)因此使用unsigned类型
#define rUTXH1 (*(volatile unsigned char *)0x1d04020) //rUTXH1 寄存器规定是byte字长的,因此使用unsigned char 类型

至于volatile 则是因为他们都是寄存器,可能不经我们手动而自己改变数值(如串口受到数据),因此我们需要将其定义为实时数据类型(普通类型实际上访问是使访问的缓存中的数据,并没有访问实际的物理地址).
点赞  2007-10-15 22:29
受教了。谢谢。还有个问题        mcr p15,0,r0,c15,c1,0 是什么意思,在做什么?
找到了arm汇编的东西,但是没弄明白里面说的具体是怎么回事。
点赞  2007-10-22 09:22
这是对ARM的协处理器CP15进行操作,可以在 书里面的关于协处理器及MMU的章节中找到介绍。
另:44B0就我所知是没有MMU的。
点赞  2007-10-22 22:22
哦,谢谢了。本人初学。不知可否加我。
QQ:123123597
msn:green__hand@hotmail.com

希望多赐教。谢谢了。
点赞  2007-10-23 09:44
我的QQ: 0x52CB387 转换成10进制 防止广告。。。。
点赞  2007-10-23 11:05
好的,谢谢。哈哈!!!!!!
点赞  2007-10-23 19:33
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复