分类: C/C++
2010-08-03 21:13:51
好久没动手写文章了,今天下午对嵌入式C语言编程进行了思考,也随之对此有了全新的认识,下面总结一下我的心得,希望能给那些对嵌入式编程的认识还处于朦胧状态的朋友一些启示.
我们在学习嵌入式的过程中,总少不了和各式各样的寄存器打交道,对寄存器的正确设置就显得尤为重要.下面就先谈一下如何对寄存器进行设置.
对寄存器进行设置之前必须先知道寄存器的地址,这个在每个处理器的参考手册中都有明确的说明.例如我现在用的处理器芯片是freescale的MCF52277,在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_
0xFC0B_8110 SDRAM Chip Select 0 Configuration (SDCS0)
0xFC0B_8114 SDRAM Chip Select 1 Configuration (SDCS1)
最靠左边的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*)(0xFC0B
#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*)(0xFC0B
有了头文件的宏定义,我们就可以用如下方式对寄存器进行配置:
MCF_SDRAMC_SDMR=0x00001111:
这种对寄存器进行赋值的方法显然比第一种方式要简单直观,而且不容易出错