Arm STM32清除和设置位

Arm STM32清除和设置位,arm,stm32,Arm,Stm32,我是STM32新手,无法理解位运算。例如,我想设置adjustCAN\MCR寄存器。我需要设置该寄存器的第16位并清除第15位。我知道我可以做这样的事情: CAN1-> MCR |= CAN1_MCR_DBF; CAN1->MCR ~= (CAN1_MCR_RESET); CAN1->MCR |= (0b10 << 15); 我想知道我是否可以做这样的事情: CAN1-> MCR |= CAN1_MCR_DBF; CAN1->MCR ~= (CA

我是STM32新手,无法理解位运算。例如,我想设置adjust
CAN\MCR
寄存器。我需要设置该寄存器的第16位并清除第15位。我知道我可以做这样的事情:

CAN1-> MCR |=  CAN1_MCR_DBF;
CAN1->MCR ~= (CAN1_MCR_RESET);
CAN1->MCR |= (0b10 << 15);
我想知道我是否可以做这样的事情:

CAN1-> MCR |=  CAN1_MCR_DBF;
CAN1->MCR ~= (CAN1_MCR_RESET);
CAN1->MCR |= (0b10 << 15);

我怎样才能用手臂做那件事?我知道这些都是简单的问题,但我找不到任何有用的答案。

对于第一个问题,您可以这样做:(未测试:因为我没有宏的定义或您需要的更多详细信息,我只能猜测)

这不是一个很好的代码,很难读取,但好处是寄存器上只有一个“读-修改-写”操作

撇开代码可读性不谈,请记住,在某些情况下,最好在两个单独的操作中修改两位。在目前的情况下,我不知道,只有产品数据表可以告诉您设置/清除位是否有一些限制(至少在STM32H7上没有can_MCR寄存器)

关于第二个问题,我假设您在STM32上缺少寄存器位字段定义,所以我猜您使用的是STMicro HAL头文件

有几种方法可以处理寄存器,但据我所知,STMicro的头文件不使用位字段,因此如果(CAN1_MCR.B1==1){},您可能无法执行类似于
的操作


如果要使用位字段,可能需要重新定义STM32寄存器

通常使用或来设置位和清除位。所以如果你需要同时做这两件事,那就是两个操作。这是C代码,与arm没有任何关系,你只是碰巧使用了基于arm的C代码。同样,如果你想从你使用的寄存器/变量中分离出一位(或多位)。但是你可以在PIC中使用这种技巧。确实,还有其他架构。cortex-m架构中有一个设计特性,实际上允许您隔离位,而不必使用两个操作。但是芯片供应商启用了它吗?用于该功能的地址空间是什么?至少有一个stm32芯片文档只列出了一个地址,并且必须从他们的库中找出另一个地址。在基于cortex-m的产品中寻找“位带”。
CAN1->MCR = ( CAN1->MCR & (~(CAN1_MCR_DBF | CAN1_MCR_RESET)) ) |  CAN1_MCR_DBF;