STM32F103 PLL比较复位值和标志值;“代码方面”;

STM32F103 PLL比较复位值和标志值;“代码方面”;,stm32,stm32f1,Stm32,Stm32f1,我正在尝试编程一个STM32f10xxMCU并尝试设置时钟。参考手册中规定,当打开PLL时,硬件将设置一个标志,指示其已就绪或已锁定,标志位称为PLLRDY。PLLRDY由硬件设置为: 1 when the PLL is locked 0 when the PLL is not locked (NOT READY) CR寄存器或控制寄存器的重置值默认为零。并且RCC\u CR\u PLLRDY=0x02000000 我需要设置一个while循环来检查PLL是否准备就绪,我的实现是否正确 //打

我正在尝试编程一个
STM32f10xx
MCU
并尝试设置时钟。参考手册中规定,当打开
PLL
时,硬件将设置一个标志,指示其已就绪或
已锁定
,标志位称为
PLLRDY
PLLRDY
由硬件设置为:

1 when the PLL is locked
0 when the PLL is not locked (NOT READY)
CR寄存器或控制寄存器的重置值默认为
。并且
RCC\u CR\u PLLRDY=0x02000000

我需要设置一个while循环来检查
PLL
是否准备就绪,我的实现是否正确

//打开PLL
碾压混凝土->碾压混凝土=碾压混凝土;
//等待PLL“锁相环”锁定且稳定:
//将设置哪一个?CR本身还是PLLRDY寄存器?
而(!(碾压混凝土->碾压混凝土和碾压混凝土)
{
//特定时间过去且PLL未准备就绪时出错!
}
还是应该如此

while(!(碾压混凝土->碾压混凝土)
{
//一些代码!
}

!(RCC->CR | RCC | CR | CR | CR | Pr | PLLRDY)
这将始终是
false
因为
RCC | CR | PLLRDY
不是零,并且
非零|任何|值
始终

要测试是否设置了某些位,需要使用
&
运算符


第一个解决方案是OK

OK,但是RCC\u CR\u PLLRDY怎么不是零呢!参考手册规定该位由硬件设置,寄存器(RCC_CR_PLLRDY位本身)的重置值为0。假设最初RCC_CR_PLLRDY为零,那么!(零和零)=1,如果设置了位,则!(0&1)=1,这意味着控制将始终停留在这个while循环中?我在这里遗漏了什么吗?
RCC\u CR\u PLLRDY
是一个常量,它不是0。因此
RCC->CR | RCC_CR_PLLRDY
将始终为非零–与值
RCC->CR
无关–和
!(RCC->CR | RCC_CR_PLLRDY)
将始终计算为
false
。这就是按位OR的工作方式。@我建议您检查编译器设置。所有当前的编译器都可以警告您此类编程错误。