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,该标志位称为PLLRDYPLLRDY 由硬件设置为:

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”进行比较的主要内容,如果未能解决你的问题,请参考以下文章

问题编程和运行STM32F103C8

STM32F103ZET6 GPIO的使用

stm32f103c8t6最小系统板可以调速吗

STM32F103 PWM输出实验(HAL库)

STM32F103X datasheet学习笔记---RCC(reset and clock control)

STM32F103的MCU简介