C15-标志位控制中断开关

 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_Line12EXTI_Line13 和 EXTI_Line14 的按位或操作结果,表示不屏蔽这些中断。反之,如果 BITFLAG_HARD_LIMIT_ENABLE 位被设置为0(即为假),则屏蔽中断的掩码被设置为 EXTI_Line12EXTI_Line13 和 EXTI_Line14 的按位与取反操作结果,表示屏蔽这些中断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值