当手头上没有示波器,如何通过代码测试stm32外部晶振是否工作

1.首先查看stm32手册,可以知道有一个时钟控制寄存器(RCC_CR),在该寄存器中,第16位和第0位和25位和24位分别为:
HSEON:外部高速时钟使能 (External high-speed clock enable)
HSION:内部高速时钟使能 (Internal high-speed clock enable)
PLLRDY:PLL时钟就绪标志 (PLL clock ready flag)
PLLON:PLL使能 (PLL enable)

如下图:


16位.png
0位.png
25和24位.png
  1. 因此,当在串口以%x的形式打印RCC_CR寄存器的值的时候,输出的内容为0x3035283(也有可能为0x3035183)时,,此时第0位和第16位都为1,第25位和第24位也都为1,因此使用了外部晶振作为时钟源(因为stm32开始上电初始化时,需要内部8M晶振工作来进行初始化)。

  2. 当注释掉system_stm32f10x.c中的SystemInit()函数中的SetSysClock()函数,系统将默认使用内部时钟,此时读出RCC_CR寄存器的值为0x5283(或者0x5183),此时第16位、25位、24位都为0,第0位为1。


  • 但是笔者之前在项目开发时,遇到了一个测试值,输出的内容为0x15283。这时,第0位和第16位都为1,但是第25位和24位都为0

经过查阅stm32手册,发现stm32内部有时钟安全系统,如下图所示:

时钟安全系统.png
  • 内容大概就是,当使用HSE振荡器(外部晶振)作为输入时钟时,当发生时钟故障时,PPL输入时钟将会被关闭,切换到内部的HSI振荡器(内部晶振),因此RCC_CR寄存器中25位和24位都为0,此时stm32使用内部晶振作为时钟源

经过笔者的排查,发现确实是外部的晶振损坏了,当换上新的晶振后,工作正常。
因此,当开发项目时,测试发现RCC_CR寄存器中外部PLL时钟的位都为0时,如果外部电路测试没问题的话, 基本上就是外部晶振的问题了。

你可能感兴趣的:(当手头上没有示波器,如何通过代码测试stm32外部晶振是否工作)