
最近在做单极倍频SPWM
STM32G474, I2C设备地址,总出现多余地址0x20,是什么原因?
为什么STM32G431的串口用不了2.5M的波特率
上电连接USB显示DFU模式
STM32G491RE上电出现DFU模式
STM32G431的3.3V引脚对地电阻变小
STM32G473RC timer8的CCDS bit, Capture/Compare DMA selection.
STM32G431 数据手册上有个图有点不理解
STM32G473RC多个定时器同步的问题
STM32CubeG4 HAL库 V1.6.1 版本中的 stm32g4xx_hal.h 文件宏定义BUG
[md]位或操作,用于对特定位置1,保留其它位,二者结合做为最终结果;
直接赋值,新值直接替换寄存器原内容。
其实 两种写法目的也不太一样,自然期待的结果也可能不同。
我查看了手册关于该寄存器的描述,是个可读写的寄存器。
不管你是基于位操作还是直接写 都是接受的,但是不同操作或手段,目的是不一样的,结果也可能不一样。
比方 你这样写 SPI3->CR2 |= 0x3 << 8;
实际上是将寄存器原来的初始值跟(0x3 << 8)相或后的值存放到寄存器;显然,这种情况下的结果跟原来的值强关联的。具体到这里,只有bit8 bit9被替换为B11了。
现在DS段共4位,当你执行这个操作后,最后DS的值可能是3,7或F呢。除非你在执行这个操作前先对DS段清零。
反过来,如果你这样写,SPI3->CR2 = 0x0300;
就是用0x0300直接覆盖寄存器原来的内容,强行替换,以前是什么值根本不关心。具体到这里,你这样操作后,DS段内容肯定是3.推荐使用cube库,这样很多细节都避免了。
使用cube对比过,单步调试对比了也,寄存器状态都是一样的。cube可以正确改写CR2的DR位,但是寄存器直接写入就不行
SPI3->CR2|=0x3<<8; //失败
SPI3->CR2=0x0300; //成功
这是为啥?😄
不支持位操作?