1.以EPIT为例
EPIT(Enhanced Periodic Interrupt Timer)为增强型周期中断定时器,其中有CR控制寄存器,要设置CR寄存器的SWR位,代码如下:
// Assert software reset for the timer
OUTREG32(&pEPIT->CR, CSP_BITFMASK(EPIT_CR_SWR));
其中CSP_BITFMASK宏定义如下:
#define CSP_BITFMASK(bit) (((1U << (bit ## _WID)) - 1) << (bit ## _LSH))
这里的bit就是EPIT_CR_SWR,结合宏定义,可知此宏定义相当于下面的定义:
#define CSP_BITFMASK(bit) (((1U << (EPIT_CR_SWR_WID)) - 1) << (EPIT_CR_SWR _LSH))
WINCE6.0 BSP包中大部分都是这样对寄存器进行操作,这里的WID是指SWR位的宽度(WIDTH),因为CR的SWR域只有一位,所以EPIT_CR_SWR_WID=1;EPIT_CR_SWR _LSH(LSH表示LEFT SHIT左移)表示CR寄存器SWR域在寄存器中的位置(CR[16]),所以EPIT_CR_SWR _LSH=16
在这方面,飞思卡尔在对寄存器控制代码比三星的规范,但要定义好很多宏。