在ARM32寄存器读写经常会看到这样的写法,现在明白为什么要这么写了
v_pMEMRegs->rBWSCON = (v_pMEMRegs->rBWSCON&~(0xf<<16))|(0xd<<16);
分析:先~(0xf<<16))到的结果是0XFFF0FFFF,
然后v_pMEMRegs->rBWSCON&~(0xf<<16),和以前的寄存器值相与,保存除第16后的四位其它位的值,第十六位的后四位清零。
最后和(0xd<<16)相或
整个过程就是保证除要操作的位变化,而不影响到其它位以前的值
和这个写法其实是一致的
v_pIOPregs->rEXTINT0 &= ~(0x7 << 12); // Configure EINT3 as High level tiggered Mode
v_pIOPregs->rEXTINT0 | = (0x1 << 12);