You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 16:57:29