嵌入式软件工程师常需要配置寄存器的某些位,这些寄存器通常有指定的offset,在通常的32位或者16位中,某位或者某几位表示了一些特定的功能。软件工程师需要配置这些位用以完成特定的任务。如果可以通过宏函数进行封装,将能避免很多重复性的工作并且提高代码的可读性。
宏函数1 读某个寄存器的某几个位
//将寄存器__REGISTER__的_offset_位(从0开始数)开始的__size__个位取出
//寄存器以16位为例,如果32位将0xffff改为0xffffffff
#define GET_BITS(__REGISTER__, _offset_, __size__)\
do{\
__REGISTER__ &= ~(~((0xffff >> (16 - __size__)) << _offset_));\
__REGISTER__ >>= _offset_;\
}while(0)
宏函数2 写某个寄存器的某几个位
//LET_BITS,将__REGISTER__的__offset__位(从0开始数)开始的__size__个位写__NEW__值
#define CLEAR_BITS(__REGISTER__, __offset__, __size__)\
do{\
__REGISTER__ &= (~((0xffff >> (15 - __offset__+ __size__)) << __size__));\
}while(0)
#define LET_BITS(__REGISTER__, __offset__, __size__, __NEW__)\
do{\
CLEAR_BITS(__REGISTER__, __offset__, __size__);\
__REGISTER__ |= (__NEW__ << __size__);\
}while(0)