如何用C语言在SPI的CR寄存器中将多个位设置为0?
SPI波特率预分频器位设置问题解答
首先,你写的SPI1->CR1 &= ~(1<<3);不行——这只会将位3清零,但位4和位5的原有状态不会被改变,而你需要把位3-5全部设置为000,所以必须一次性清零这三个位。
正确的操作方式是构造一个覆盖位3-5的掩码,将这三个位对应的位置设为1,取反后与寄存器做与操作,确保这三个位被统一置0:
// 写法1:逐个指定位 SPI1->CR1 &= ~((1 << 3) | (1 << 4) | (1 << 5));
或者用更简洁的连续位掩码写法:
// 写法2:用二进制掩码 SPI1->CR1 &= ~(0b111 << 3); // 写法3:用十六进制掩码(0b111等价于0x7) SPI1->CR1 &= ~(0x7 << 3);
至于你参考视频里的SPI1->CR1 |= (3 << 3),是因为对方需要将位3-4设置为011(十进制3),属于置位特定位的操作,和你需要的清零一组位逻辑完全不同,再加上MCU型号差异导致寄存器位定义不同,所以不用参考这个写法。
内容的提问来源于stack exchange,提问作者Kim
相关产品推荐
相关产品推荐

