最近项目需要在调试STM32时遇到外部晶振时钟不稳定,查看RCC_CR寄存器的第17位始终处于0,表示外部晶振始终处于不稳定状态:

当HSE开启时,如果HSERDY一直处于0时,则芯片会启动内部16Mhz晶振,但是此时PLL分频无效,整个系统降到了16Mhz,无法忍受,立刻启动内部时钟源HSI为系统时钟, 同时通过配置PLL,将系统时钟配置到168Mhz,

由于系统设置时钟源是在系统起来厚,main函数之前设置的,在SetSysClock(),首先需要自己设置HSI为系统时钟源,代码如下:

/*** @brief  Configures HSI as the System clock source**/
void HSI_SetSysClock()
{__IO uint32_t HSIStartUpStatus = 0;RCC_DeInit();//set HSIRCC_HSICmd(ENABLE);HSIStartUpStatus = RCC->CR & RCC_CR_HSIRDY;if (HSIStartUpStatus == RCC_CR_HSIRDY){    /* Select regulator voltage output Scale 1 mode */RCC->APB1ENR |= RCC_APB1ENR_PWREN;PWR->CR |= PWR_CR_VOS;// HCLK = SYSCLK / 1RCC_HCLKConfig(RCC_SYSCLK_Div1);/* HCLK = SYSCLK / 1*/RCC->CFGR |= RCC_CFGR_HPRE_DIV1;#if defined(STM32F40_41xxx) || defined(STM32F427_437xx) || defined(STM32F429_439xx) ||  defined(STM32F412xG) || defined(STM32F446xx) || defined(STM32F469_479xx)    /* PCLK2 = HCLK / 2*/RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;/* PCLK1 = HCLK / 4*/RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;
#endif /* STM32F40_41xxx || STM32F427_437x || STM32F429_439xx  || STM32F412xG || STM32F446xx || STM32F469_479xx */#if defined(STM32F401xx) || defined(STM32F413_423xx)/* PCLK2 = HCLK / 1*/RCC->CFGR |= RCC_CFGR_PPRE2_DIV1;/* PCLK1 = HCLK / 2*/RCC->CFGR |= RCC_CFGR_PPRE1_DIV2;
#endif /* STM32F401xx || STM32F413_423xx */#if defined(STM32F40_41xxx) || defined(STM32F427_437xx) || defined(STM32F429_439xx) || defined(STM32F401xx) || defined(STM32F469_479xx)    /* Configure the main PLL */RCC->PLLCFGR = HSI_PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |(RCC_PLLCFGR_PLLSRC_HSI) | (PLL_Q << 24);
#endif /* STM32F40_41xxx || STM32F401xx || STM32F427_437x || STM32F429_439xx || STM32F469_479xx */#if  defined(STM32F412xG) || defined(STM32F413_423xx) || defined(STM32F446xx)/* Configure the main PLL */RCC->PLLCFGR = HSI_PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |(RCC_PLLCFGR_PLLSRC_HSI) | (PLL_Q << 24) | (PLL_R << 28);
#endif /* STM32F412xG || STM32F413_423xx || STM32F446xx *//* Enable the main PLL */RCC->CR |= RCC_CR_PLLON;/* Wait till the main PLL is ready */while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {}#if defined(STM32F427_437xx) || defined(STM32F429_439xx) || defined(STM32F446xx) || defined(STM32F469_479xx)/* Enable the Over-drive to extend the clock frequency to 180 Mhz */PWR->CR |= PWR_CR_ODEN;while((PWR->CSR & PWR_CSR_ODRDY) == 0){}PWR->CR |= PWR_CR_ODSWEN;while((PWR->CSR & PWR_CSR_ODSWRDY) == 0){}      /* Configure Flash prefetch, Instruction cache, Data cache and wait state */FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;
#endif /* STM32F427_437x || STM32F429_439xx || STM32F446xx || STM32F469_479xx */#if defined(STM32F40_41xxx)  || defined(STM32F412xG)  /* Configure Flash prefetch, Instruction cache, Data cache and wait state */FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;
#endif /* STM32F40_41xxx  || STM32F412xG */#if defined(STM32F413_423xx)  /* Configure Flash prefetch, Instruction cache, Data cache and wait state */FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_3WS;
#endif /* STM32F413_423xx */#if defined(STM32F401xx)/* Configure Flash prefetch, Instruction cache, Data cache and wait state */FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_2WS;
#endif /* STM32F401xx *//* Select the main PLL as system clock source */RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));RCC->CFGR |= RCC_CFGR_SW_PLL;/* Wait till the main PLL is used as system clock source */while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);{}}
}

将上述代码添加到,设置外部时钟源失败异常处理流程SetSysClock()函数中:

系统恢复如初,系统时钟源恢复到168Mhz,很happy

STM32F4设置系统时钟源为内部HSI相关推荐

  1. STM32直接用寄存器设置系统时钟

    时钟对单片机的重要性,就如同心脏对人的重要性,它能驱动处理器内核完成指令,外设也在它的驱动下完成动作.总而言之,时钟是单片机里很重要的一项.那么,我们为什么要设置系统时钟呢?有的外设需要的工作频率不一 ...

  2. 修改STM32F030 时钟源为内部晶振(HEI )

    修改 SetSysClock()函数,将时钟源由默认的HSE改为内部HSI 时钟 system_stm32f0xx.c static void SetSysClock(void) {__IO uint ...

  3. HGP:STM32的用标准库函数自己编写的关于设置系统时钟72Mhz的函数

    /其实在system_stm32f10x.c文件中有设置72MHz的函数,本文是我在学习STM32最底层用寄存器与固件库开发时写的一个例子,当做笔记发在博客上,希望对同样从STM32基层学起的读者有帮 ...

  4. linux 设置系统时钟,linux clock命令查看和设置硬件时钟

    clock调整 RTC 时间 使用clock命令可以查看和设置硬件时钟,可以显示现在时钟,调整硬件时钟,将系统时间设置成与硬件时钟一致,或是把系统时间回存到硬件时钟.clock命令是hwclock命令 ...

  5. qt linux 修改系统时间,在Linux上使用QT设置系统时钟

    您可以使用dbus与定时守护程序进行交互https://www.freedesktop.org/wiki/Software/systemd/timedated/ 设置时间和日期. Qt提供了一种从xm ...

  6. STM32系统时钟设置(标准库)

    1.STM32F407时钟树 2.系统时钟相关的结构 HSE高速外部时钟信号 锁相环PLL 锁相环的主要作用就是对时钟进行倍频,然后把时钟输出到各个功能部件.PLL有两个,一个主PLL,另一个是专用的 ...

  7. stm32f103rct6使用内部晶振作为时钟源

    目录 正点原子库函数 1.void SystemInit(void) 2.FLASH 3.宏定义 4.查看 5.延时 6.最终结果 7.精准延时尝试(失败) HAL库函数 1 宏定义 2 时钟配置 3 ...

  8. 【STM32使用内部RC振荡器】1、时钟源的设置

    PLL 为锁相环倍频输出,其时钟输入源可选择为 HSI/2. HSE 或者 HSE/2. 而HSI固定为8M,故PLL输入固定为4M. HSE通常是外部晶振8M 以下HSI代码设置的各个时钟频率为: ...

  9. STM32使用内部时钟HSI作为系统时钟及配置Systick定时器

    参考:https://blog.csdn.net/huangyangquan/article/details/78790443 https://www.cnblogs.com/dustinzhu/p/ ...

最新文章

  1. eclipse 变成中文
  2. vue自定义指令截取图片中心显示
  3. Java中的低延迟FIX引擎
  4. openwrt 19 overlay 空间不足_重视 | 山西一矿井瓦斯爆炸,有限空间作业切记注意安全...
  5. linux指法教程,Linux的vim的使用
  6. 鹦鹉助手模拟器 梦幻西游 找不到服务器,模拟器玩梦幻 17173鹦鹉助手模拟器上线...
  7. 韵达混合云深度解析:Docker助力大规模云上调度实践
  8. mysql中 show index from tb_name命令各列的含义
  9. 【数论】Concatenated Multiples【codeforces-Round #506-div3-D】
  10. Qt5.9配置安卓开发环境
  11. RNNoise降噪训练
  12. Pandas: Drop函数(Dataframe删除指定行列)
  13. [杜撰的故事]那天以后
  14. Rushcrm:如何利用CRM系统的权限设置
  15. 水晶报表中如何创建自定义的纸张大小格式?
  16. 查询电话联系人(包括sim卡)
  17. 软件架构设计 大型网站技术架构与业务架构融合之道
  18. 使用ATmega8L-8PU 在面包板上搭建自己的Arduino ,并闪亮一个LED
  19. 计算机金融学校排名2015,2015全国金融专业高校排名
  20. OpenGL教程翻译 第二十一课 聚光灯

热门文章

  1. JAVA企业级快速开发平台,JEECG 3.7.3 新春版本发布
  2. JEECG 3.2版本发布,基于代码生成器的智能开发平台
  3. LoadRunner12安装说明以及问题解决
  4. JSON_dump和load
  5. android shareUID
  6. SegmentFault 技术周刊 Vol.16 - 浅入浅出 JavaScript 函数式编程
  7. 基于heartbeatV2版本的ha-gui工具对httpd做高可用集群(1)
  8. Haiku OS 的黎明
  9. .net项目开发工具最新动态
  10. c语言结构体 单科成绩排序,【查错】怎样让结构体其他信息(姓名)对应关键值(成绩)排序输出...