1
// Bit field and masking macros
#define bit(n) (1 << n) //给指定位赋1
#define bit_true(x,mask) (x |= mask)//
#define bit_false(x,mask) (x &= ~mask)
#define bit_toggle(x,mask) (x ^= mask)
#define bit_istrue(x,mask) ((x & mask) != 0)
#define bit_isfalse(x,mask) ((x & mask) == 0)
bit_true(x, mask)
用于将给定位字段x
中的指定标志位mask
置为1,使用按位或操作符|
实现。bit_false(x, mask)
用于将给定位字段x
中的指定标志位mask
置为0,使用按位与取反操作符~
和按位与操作符&
实现。bit_toggle(x, mask)
用于将给定位字段x
中的指定标志位mask
置反,使用按位异或操作符^
实现。bit_istrue(x, mask)
用于判断给定位字段x
中的指定标志位mask
是否为1,使用按位与操作符&
和不等于操作符!=
实现。bit_isfalse(x, mask)
用于判断给定位字段x
中的指定标志位mask
是否为0,使用按位与操作符&
和等于操作符==
实现。
2
uint8_t flags; // Contains default boolean settings
// Define bit flag masks for the boolean settings in settings.flag.
#define BITFLAG_REPORT_INCHES bit(0)
#define BITFLAG_AUTO_START bit(1)
#define BITFLAG_INVERT_ST_ENABLE bit(2)
#define BITFLAG_HARD_LIMIT_ENABLE bit(3)
#define BITFLAG_HOMING_ENABLE bit(4)
3
if (bit_istrue(settings.flags,BITFLAG_HARD_LIMIT_ENABLE)) {
EXTI->IMR|=(EXTI_Line12|EXTI_Line13|EXTI_Line14); //不屏蔽中断
} else {
EXTI->IMR&=~(EXTI_Line12|EXTI_Line13|EXTI_Line14); //屏蔽中断
}
代码中根据 settings.flags
中 BITFLAG_HARD_LIMIT_ENABLE
位的状态来控制中断的开关。如果 BITFLAG_HARD_LIMIT_ENABLE
位被设置为1(即为真),则屏蔽中断的掩码被设置为 EXTI_Line12
、EXTI_Line13
和 EXTI_Line14
的按位或操作结果,表示不屏蔽这些中断。反之,如果 BITFLAG_HARD_LIMIT_ENABLE
位被设置为0(即为假),则屏蔽中断的掩码被设置为 EXTI_Line12
、EXTI_Line13
和 EXTI_Line14
的按位与取反操作结果,表示屏蔽这些中断。