新唐的库中有 很多的msk,也就是掩码,有时候为了设置多bit的寄存器如32bit寄存器中的 某些位,比如不连续的bit1和bit10,这时候也可以用方便多位操作的掩码,这样,可以把这两个bit的4种取值情况通过掩码而传入,但不影响寄存器中其他bit的值,
一般我们c书上只讲了单个bit,
其实这个掩码 ,可以用比较明显的位置信息来表是:
如上面的可以表述成这样 0x00000402 这是新唐的做法,
其实也可以这样写: ((1<<10)|(1<<1))
这样比较一目了然.
所谓mask,其实质就是把要操作的bit置为1其余为0的一个数,这样我们操作的时候,如果要对对应的bit置0,就可以:
Reg &=~(mask);
要置1,
就是reg |=mask;
如果mask有几个 bit ,且不连续的话,要赋值一个特殊的值,有0 有1, 就必须先清零各位,然后利用mask代入
如: Reg= Reg& (~mask);
然后再利用或,代入新的值;
Reg |= Newval;
这个值仅在mask对应的bit上有0和1的取值变化,
其余都为0;
例如: 新唐的P14口的MFP配置:
#define SYS_MFP_P14_GPIO 0x00000000UL /*!< P1_MFP pin 4 setting for GPIO */
#define SYS_MFP_P14_AIN4 0x00000010UL /*!< P1_MFP pin 4 setting for AIN4 */
#define SYS_MFP_P14_SPISS0 0x00001000UL /*!< P1_MFP pin 4 setting for SPISS0 */
#define SYS_MFP_P14_CPN0 0x00001010UL /*!< P1_MFP pin 4 setting for CPN0 */
#define SYS_MFP_P14_ACMP0_N 0x00001010UL /*!< P1_MFP pin 4 setting for ACMP0_N */
#define SYS_MFP_P14_Msk 0x00001010UL /*!< P1_MFP pin 4 mask */
我要配置P14口为AIN4;可以这样操作
SYS->P1_MFP &= ~SYS_MFP_P14_Msk;
SYS->P1_MFP |= SYS_MFP_P14_AIN4;
非常秒的mask,还记得avr时代的端口port操作吗?
PORTA !=(1<<PA0)|(1<<PA3); //细看PA0原来就是0; PA3原来就是3
标准c的位操作, mask恰到好处, 美妙的新唐bsp
犹记v2xx版本的犀利,如今,更加高效的v3xx来临,虽有所不适应,但依旧去努力适应吧! |