【问题标题】:STM32F103 PLL comparing reset value with a flag value "CODE WISE"STM32F103 PLL 将复位值与标志值“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!
}


【问题讨论】:

    标签: stm32 stm32f1


    【解决方案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 我建议您检查编译器设置。当前所有的编译器都可以警告您此类编程错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    相关资源
    最近更新 更多