#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
这是一个关于串口的程序中的.h文件
想问:
为什么有的寄存器以这种(*(volatile unsigned *)0x1c80000)
形式读出其中的值呢?寄存器只有8位或16位,这样读出的是32位的,那不是错了?
为什么要这么做呢?
而有的寄存器又以(*(volatile unsigned char *)0x1d04020)
种形式读出,这样不是正好8位吗?
为什么存在以上两种形式,不知怎么回事?还是我对以上读出的理解有问题?
高人指点!!!!!!!!!!
"为什么有的寄存器以这种(*(volatile unsigned *)0x1c80000)
形式读出其中的值呢?寄存器只有8位或16位,这样读出的是32位的,那不是错了?
为什么要这么做呢?"
确定0x1c80000只是一个地址,我们不管这个地址有多大,内存最小存储单位是8位,那么该地址上只存有8位,而unsigned *是0x1c80000和0x1c80001组成的高8位和低8位了(有些体系结构高低顺不一样,这是编译器的处理的..)
没明白,好像和我问的有些出入,请详细解释!!!!!!!!
内存的地址是以字节存存储的,就是说每个地址1个自己,如0x1c80000存以个字节,0x1c80001存1个字节,0x1c80002存1个字节,0x1c80003存1个字节.
如果系统要读1个字节(char型)就直接读0x1c80000地址就可以了
如果系统要读2个字节(unsigned型)假设读0x1c80000为高8位,读0x1c80001为低8位就是16位,只要用上面的形式定义强制定义成unsigned的指到0x1c80000上,系统会自动的读0x1c80000和0x1c80001两地址的值组合起来..
如果系统要读4个字节以此类推..
(*(volatile unsigned *)0x1c80000)的意思是取出当前0x1c800000寄存器位置开始的值,需要几位就用相应类型。
请详细解释,不是很明白。谢谢了!!!!!!!!!!!
我想问的是:unsigned 应该是无符号整型吧,应该是4字节。但是我的这个控制芯片只用到8位或16位的寄存器,为什么要读取32位呢?
还是unsigned根本就不是无符号整型,我说的不对呢?
-----------------------------------是这位老兄说的那样吗?大家帮忙了!
(*(volatile unsigned *)0x1c80000)的意思是取出当前0x1c800000寄存器位置开始的值,需要几位就用相应类型。
"还是unsigned根本就不是无符号整型"
各平台定义不一样,你的平台应该定义是2个字节
(*(volatile unsigned *)0x1c80000)的意思是取出当前0x1c800000寄存器位置开始的值,需要几位就用相应类型。
-----------------------------------是这位老兄说的那样吗?大家帮忙了!
(*(volatile unsigned *)0x1c80000)的意思是取出当前0x1c800000寄存器位置开始的值,需要几位就用相应类型。
-----------------------------------是这位老兄说的那样吗?大家帮忙了!
(*(volatile unsigned *)0x1c80000)的意思是取出当前0x1c800000寄存器位置开始的值,需要几位就用相应类型。
-----------------------------------是这位老兄说的那样吗?大家帮忙了!
你这个文件是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 则是因为他们都是寄存器,可能不经我们手动而自己改变数值(如串口受到数据),因此我们需要将其定义为实时数据类型(普通类型实际上访问是使访问的缓存中的数据,并没有访问实际的物理地址).
受教了。谢谢。还有个问题 mcr p15,0,r0,c15,c1,0 是什么意思,在做什么?
找到了arm汇编的东西,但是没弄明白里面说的具体是怎么回事。
这是对ARM的协处理器CP15进行操作,可以在 书里面的关于协处理器及MMU的章节中找到介绍。
另:44B0就我所知是没有MMU的。
哦,谢谢了。本人初学。不知可否加我。
QQ:123123597
msn:green__hand@hotmail.com
希望多赐教。谢谢了。
我的QQ: 0x52CB387 转换成10进制 防止广告。。。。