使寄存器中某一位置1,保持其他位不变

1、使寄存器中某一位置1,保持其他位不变

把某一位清零的办法就是先只有这一位是1,再取反,只有这一位是零,其他位都是1,再与上这个寄存器,那么就是使其他位不变,只有这一位&0,变成0,然后再或1。

例如:

  #define  TIM_CCMR1_OC2PE                     ((uint16_t)0x0008)
  #define  TIM_OCPreload                       ((uint16_t)0x0008)

  tmpccmr1 = TIMx->CCMR1;
 
  tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC1PE); //其实可以直接或上0x0008
 
  tmpccmr1 |= TIM_OCPreload;
 
  TIMx->CCMR1 = tmpccmr1;

tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC1PE);中,先把第四位的1取反,其他位取反后都是1,1与上任何数都是它本身,第四位的零与上任何数都是0了,也就把这位写零了。

2、使寄存器中某一位先取反再清零,保持其他位不变

 这个利用的就是一个位异或上1就是对其取反,异或上零就是保持不变。

  #define  TIM_CCMR1_OC2PE                     ((uint16_t)0x0008)
  #define  TIM_OCPreload                       ((uint16_t)0xfff7)

  tmpccmr1 = TIMx->CCMR1;
 
  tmpccmr1 ^= (uint16_t)((uint16_t)TIM_CCMR1_OC1PE);  //先把第四位取反
 
  tmpccmr1 &= TIM_OCPreload; //第四位清零
 
  TIMx->CCMR1 = tmpccmr1;

 

你可能感兴趣的:(寄存器,位操作)