当手头上没有示波器,如何通过代码测试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时,如果外部电路测试没问题的话, 基本上就是外部晶振的问题了。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1 综述 1.1 时钟源 在STM32中,一共有5个时钟源,分别是HSI、HSE、LSI、LSE、PLL。 HSI...
    hackvilin阅读 3,874评论 0 6
  • 此文用于记录学习STM32中所学习或者巩固的知识,主要围绕但并不局限于STM32。 本次学习并非为了深入了解使用S...
    yhhk阅读 2,301评论 0 11
  • STM32使用内部RC振荡器时,OSC32_IN,OSC32_OUT接法: 1)对于100脚或144脚的产品,OS...
    酝锦阅读 2,378评论 0 0
  • 姓名:周崇杰 学号:16140120059 专业:机械设计制造及其自动化 转载自:http://blog.csd...
    CJbaby阅读 4,971评论 0 5
  • 1 简介 STM32F10x标准外设库是一个完整的包,包含了所有标准外设的设备驱动,适用于STM32价值系列(高、...
    hackvilin阅读 7,251评论 0 13

友情链接更多精彩内容