Chinaunix首页 | 论坛 | 博客
  • 博客访问: 244881
  • 博文数量: 49
  • 博客积分: 1595
  • 博客等级: 上尉
  • 技术积分: 497
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-21 15:22
文章分类

全部博文(49)

文章存档

2011年(19)

2010年(30)

我的朋友

分类: C/C++

2010-08-03 21:13:51

好久没动手写文章了,今天下午对嵌入式C语言编程进行了思考,也随之对此有了全新的认识,下面总结一下我的心得,希望能给那些对嵌入式编程的认识还处于朦胧状态的朋友一些启示.

我们在学习嵌入式的过程中,总少不了和各式各样的寄存器打交道,对寄存器的正确设置就显得尤为重要.下面就先谈一下如何对寄存器进行设置.

对寄存器进行设置之前必须先知道寄存器的地址,这个在每个处理器的参考手册中都有明确的说明.例如我现在用的处理器芯片是freescaleMCF52277,MCF52277 Reference Manual对每个模块的寄存器都有详细说明,下面以SDRAM控制器为例,进行相关介绍.

 

                                                     Register


 

0xFC0B_8000          SDRAM Mode/Extended Mode Register (SDMR)

0xFC0B_8004          SDRAM Control Register (SDCR)

0xFC0B_8008          SDRAM Configuration Register 1 (SDCFG1)

0xFC0B_800C         SDRAM Configuration Register 2 (SDCFG2)

0xFC0B_8110         SDRAM Chip Select 0 Configuration (SDCS0)

0xFC0B_8114         SDRAM Chip Select 1 Configuration (SDCS1)


 上表为SDRAM控制器相关寄存器的Memory Map(地址映射).

 

最靠左边的Address(地址)栏就是对应的寄存器地址,我们应该清楚的是对寄存器进行设置,也就是对寄存器的地址进行赋值.(认识到这一点是很重要的).

例如,我们要对SDRAM Mode/Extended Mode Register (SDMR)进行设置,用下列语句可以实现:

            0xfc0B8000=0x00001111;

上面的语句就实现了对寄存器SDRAM Mode/Extended Mode Register (SDMR)的设置.

 

但是,这样做会存在这样的问题,:我们每次对寄存器进行设置,都要先找到其对应的寄存器地址,然后还需要手动敲打一大串十六进制数,这样做显然是很不方便,而且在手动输入寄存器的时候很容易出错.

那么我们用什么方法来解决这个问题呢?别着急,我们可以用头文件很好的解决这个问题.

处理器的头文件列表对各个模块的寄存器的都进行了宏定义.例如mcf5227_sdramc.h是对SDRAM控制器的各寄存器进行的宏定义,部分定义如下:

/*********************************************************************

*

* SDRAM Controller (SDRAMC)

*

*********************************************************************/

 

/* Register read/write macros */

#define          (*(vuint32*)(0xFC0B8000))  

#define MCF_SDRAMC_SDCR         (*(vuint32*)(0xFC0B8004))  

#define MCF_SDRAMC_SDCFG1       (*(vuint32*)(0xFC0B8008))  

#define MCF_SDRAMC_SDCFG2       (*(vuint32*)(0xFC0B800C))  

#define MCF_SDRAMC_SDDS         (*(vuint32*)(0xFC0B8100))  

#define MCF_SDRAMC_SDCS0        (*(vuint32*)(0xFC0B8110))  

#define MCF_SDRAMC_SDCS1        (*(vuint32*)(0xFC0B8114))  

#define MCF_SDRAMC_SDCS2        (*(vuint32*)(0xFC0B8118))  

#define MCF_SDRAMC_SDCS3        (*(vuint32*)(0xFC0B811C))  

 

有了头文件的宏定义,我们就可以用如下方式对寄存器进行配置:

MCF_SDRAMC_SDMR=0x00001111:

这种对寄存器进行赋值的方法显然比第一种方式要简单直观,而且不容易出错

 


 

 

阅读(6574) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~