打印

arm 头文件 寄存器配置

[复制链接]
4215|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
afisk|  楼主 | 2010-9-24 22:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问各位大侠,请给小弟解释一下arm头文件里面寄存器配置的一个问题:
#define ADC_CR          (AT91_CAST(AT91_REG *)  0x00000000)这条语句和#define ADC_CR            0x00000000 有什么区别么?只是定义一下寄存器的地址么?#define ADC_CR          (AT91_CAST(AT91_REG *)  0x00000000) 具体是什么意思啊,谢谢

相关帖子

沙发
kkjiongquan| | 2010-9-24 23:04 | 只看该作者
本帖最后由 kkjiongquan 于 2010-9-24 23:06 编辑

它们两区别就大了,一个只把0x00000000用ADC_CR 作为名字来代替,可以不太准确的说,就是ADC_CR =0x00000000 。而 #define  ADC_CR (AT91_CAST(AT91_REG *)  0x00000000)就得看AT91_CAST与AT91_REG 定义为什么了,(AT91_REG *)  0x00000000)就是把0x00000000转换成指向AT91_REG类型数据的指针。至于AT91_CAST我就猜不到了,你把它的定义贴出来才知道嘛~~

使用特权

评论回复
板凳
afisk|  楼主 | 2010-9-25 09:28 | 只看该作者
2# kkjiongquan
好的,我把这段代码补全了,kkjiongquan 你看一下。
先有这段语句
#ifndef  _ASSEMBLE_
typedef volatile unsigned int AT91_REG;   //硬件寄存器定义
#define  AT91_CAST(a)     (a)
#else
#define    AT91_CAST(a)
#endif
然后有下面的语句
#define ADC_CR          (AT91_CAST(AT91_REG *)  0x00000000)

使用特权

评论回复
地板
kkjiongquan| | 2010-9-25 16:39 | 只看该作者
本帖最后由 kkjiongquan 于 2010-9-25 16:41 编辑

这里的宏定义AT91_CAST没有什么意思,它对(a)没操作。所以这里整句#define ADC_CR          (AT91_CAST(AT91_REG *)  0x00000000)的意思就是ADC_CR代表一个指针,指针的内容就是寄存器的内容,你可以用:*ADC_CR=具体值;的方式对寄存器进行赋值。

使用特权

评论回复
5
ldyeah| | 2010-9-25 20:30 | 只看该作者
和#define ADC_CR  ((volatile unsigned int *) 0x00000000)一样。只是注意volatile关键字,对硬件寄存器定义一般都要加上volatile关键字,目的是让程序每次执行时都会重新去读取这个变量,防止其他地方对这个变量进行过改动。如果LZ知道,当我没说

使用特权

评论回复
6
kkjiongquan| | 2010-9-25 22:40 | 只看该作者
五楼看漏typedef囖~~ 5# ldyeah

使用特权

评论回复
7
afisk|  楼主 | 2010-9-26 08:33 | 只看该作者
4# kkjiongquan
谢谢,请问你说的“这里的宏定义AT91_CAST没有什么意思,它对(a)没操作。”指的是#define  AT91_CAST(a)     (a) 中右边的(a)吧?那么下面程序中第五行的#define    AT91_CAST(a) 是不是什么也没有定义呢?

我把这个arm9的头文件的一小段程序再列出来

#ifndef  _ASSEMBLE_      //第一行
typedef volatile unsigned int AT91_REG;   //硬件寄存器定义  第二行
#define  AT91_CAST(a)     (a)   //第三行
#else                                      //第四行
#define    AT91_CAST(a)     //第五行
#endif                              //第六行
然后有下面的语句

// *****************************************************************************
//              SOFTWARE API DEFINITION  FOR Error Correction Code controller
// *****************************************************************************
#ifndef __ASSEMBLY__                           
typedef struct _AT91S_ECC {                    //第十一行
AT91_REG  ECC_CR;  //  ECC reset register       第十二行
AT91_REG  ECC_MR;  //  ECC Page size register
AT91_REG  ECC_SR;  //  ECC Status register
AT91_REG  ECC_PR;  //  ECC Parity register
AT91_REG  ECC_NPR;  //  ECC Parity N register
AT91_REG  Reserved0[58];  //
AT91_REG  ECC_VR;  //  ECC Version register
} AT91S_ECC, *AT91PS_ECC;                       //  第十九行
#else
#define ECC_CR          (AT91_CAST(AT91_REG *)  0x00000000) // (ECC_CR)  ECC reset register        第二十一行
#define ECC_MR          (AT91_CAST(AT91_REG *)  0x00000004) // (ECC_MR)  ECC Page size register
#define ECC_SR          (AT91_CAST(AT91_REG *)  0x00000008) // (ECC_SR)  ECC Status register
#define ECC_PR          (AT91_CAST(AT91_REG *)  0x0000000C) // (ECC_PR)  ECC Parity register
#define ECC_NPR         (AT91_CAST(AT91_REG *)  0x00000010) // (ECC_NPR)  ECC Parity N register
#define ECC_VR          (AT91_CAST(AT91_REG *)  0x000000FC) // (ECC_VR)  ECC Version register      第二十六行
#endif
// -------- ECC_CR : (ECC Offset: 0x0) ECC reset register --------
#define AT91C_ECC_RST         (0x1 <<  0) // (ECC) ECC reset parity        // 第二十九行
// -------- ECC_MR : (ECC Offset: 0x4) ECC page size register --------
#define AT91C_ECC_PAGE_SIZE   (0x3 <<  0) // (ECC) Nand Flash page size
// -------- ECC_SR : (ECC Offset: 0x8) ECC status register --------
#define AT91C_ECC_RECERR      (0x1 <<  0) // (ECC) ECC error
#define AT91C_ECC_ECCERR      (0x1 <<  1) // (ECC) ECC single error
#define AT91C_ECC_MULERR      (0x1 <<  2) // (ECC) ECC_MULERR
// -------- ECC_PR : (ECC Offset: 0xc) ECC parity register --------
#define AT91C_ECC_BITADDR     (0xF <<  0) // (ECC) Bit address error
#define AT91C_ECC_WORDADDR    (0xFFF <<  4) // (ECC) address of the failing bit
// -------- ECC_NPR : (ECC Offset: 0x10) ECC N parity register --------
#define AT91C_ECC_NPARITY     (0xFFFF <<  0) // (ECC) ECC parity N
// -------- ECC_VR : (ECC Offset: 0xfc) ECC version register --------
#define AT91C_ECC_VR          (0xF <<  0) // (ECC) ECC version register       //第四十二行


有个问题哈
第十一行到第十九行定义了一个有关寄存器的结构体,第二十一行到第二十六行定义了相应寄存器的地址,第二十九行到第四十二行定义了寄存器相应功能位的值,我的表述有错么?

我要对寄存器赋值的话比如这样可以么:AT91PS_ECC->ECC_CR=0x01,直接对结构体的元素赋值,我问了别人说不对,要根据这行#define ECC_CR          (AT91_CAST(AT91_REG *)  0x00000000) // (ECC_CR)  ECC reset register  代码,这样赋值 *ECC_CR=0x01 是对的,问题是那还要那个结构体干嘛?

第二十九行的“ #define AT91C_ECC_RST         (0x1 <<  0)”中, 可以写成这样么 “#define AT91C_ECC_RST         0x1 <<  0 ”?没见过宏定义值加括号的呀
  
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
附件里面是这个头文件,谢谢
结束

AT91SAM9G20.zip

43 KB

arm9 AT91SAM9G20头文件

使用特权

评论回复
8
lelee007| | 2010-9-26 12:19 | 只看该作者
靠,整的也忒麻烦了点,貌似没太大必要

LZ  C语言功底太弱,强烈建议恶补之

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
afisk + 1
9
afisk|  楼主 | 2011-2-12 21:40 | 只看该作者
8# lelee007

谢谢 十分必要的 呵呵

使用特权

评论回复
10
afisk|  楼主 | 2011-2-12 21:41 | 只看该作者
4# kkjiongquan

谢谢你的回答 kkjiongquan!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

53

帖子

1

粉丝