STM32F103 PLL 将复位值与标志值“CODE WISE”进行比较
Posted
技术标签:
【中文标题】STM32F103 PLL 将复位值与标志值“CODE WISE”进行比较【英文标题】:STM32F103 PLL comparing reset value with a flag value "CODE WISE" 【发布时间】:2021-03-11 17:05:16 【问题描述】:我正在尝试编写STM32f10xx
MCU
并尝试设置时钟。参考手册中写到PLL
开启时,会由硬件设置一个标志位,表示准备就绪或LOCKED
,该标志位称为PLLRDY
。 PLLRDY
由硬件设置为:
1 when the PLL is locked
0 when the PLL is not locked (NOT READY)
CR 寄存器或控制寄存器的复位值默认为ZERO
。和RCC_CR_PLLRDY = 0x02000000
我需要放一个while循环来检查PLL
是否准备好了,我的实现是否正确?
// Turn On PLL
RCC->CR |= RCC_CR_PLLON;
// Wait while the PLL "Phase LOCKED LOOP" is Locked and stable:
// Which is going to be set? the CR itself or the PLLRDY register?
while( !(RCC->CR & RCC_CR_PLLRDY) )
// Error when a certain time passes and the PLL is not ready!
或者应该是
while( !(RCC->CR | RCC_CR_PLLRDY) )
//SOME CODE!
【问题讨论】:
【参考方案1】:!(RCC->CR | RCC_CR_PLLRDY)
这将始终为 false
,因为 RCC_CR_PLLRDY
不为零,non_zero | any_value
始终不为零。
要测试是否设置了某些位,您需要使用&
运算符。
第一个解决方案就OK了
【讨论】:
好的,但是 RCC_CR_PLLRDY 怎么不为零!参考手册指出该位由硬件设置并且寄存器的复位值(RCC_CR_PLLRDY 位本身)为 0。假设最初 RCC_CR_PLLRDY 为零,则 !(ZERO & ZERO) = ONE,如果该位为然后设置 !(ZERO & ONE) = ONE ,这意味着控制将永远停留在这个 while 循环中?我在这里遗漏了什么吗?RCC_CR_PLLRDY
是一个常数,它不为 0。所以RCC->CR | RCC_CR_PLLRDY
将始终为非零 - 独立于值 RCC->CR
- 并且 !(RCC->CR | RCC_CR_PLLRDY)
将始终计算为 false
.这就是按位 OR 的工作原理。
@The_M_Code 我建议您检查编译器设置。当前所有的编译器都可以警告您此类编程错误。以上是关于STM32F103 PLL 将复位值与标志值“CODE WISE”进行比较的主要内容,如果未能解决你的问题,请参考以下文章