文章目录

  • 前言
  • 一、使用HSE
  • 二、使用HSI
  • 三、代码编写
  • 总结

前言

这一篇记录一下时钟的具体实验。


提示:以下是本篇文章正文内容,下面案例可供参考

一、使用HSE

  一般情况下,我们都是使用 HSE,然后 HSE 经过 PLL 倍频之后作为系统时钟。F429系统时钟最高为 180M,这个是官方推荐的最高的稳定时钟,如果你想铤而走险,也可以超频,超频最高能到 216M

  如果我们使用库函数编程,当程序来到 main 函数之前,启动文件:
startup_stm32f429_439xx.s 已经调用 SystemInit()函数把系统时钟初始化成 180MHZ,SystemInit()在库文件:system_stm32f4xx.c 中定义。如果我们想把系统时钟设置低一点或者超频的话,可以修改底层的库文件,但是为了维持库的完整性,我们可以根据时钟树的流程自行写一个。

二、使用HSI

  当 HSE 直接或者间接(HSE 经过 PLL 倍频)的作为系统时钟的时候,如果 HSE 发生故障,不仅 HSE 会被关闭,连 PLL 也会被关闭,这个时候系统会自动切换 HSI 作为系统时钟,此时 SYSCLK=HSI=16M,如果没有开启 CSS 和 CSS 中断的话,那么整个系统就只能在低速率运行,这是系统跟瘫痪没什么两样。

  如果开启了 CSS 功能的话,那么可以当 HSE 故障时,在 CSS 中断里面采取补救措施,使用 HSI,重新设置系统频率为 180M,让系统恢复正常使用。但这只是权宜之计,并非万全之策,最好的方法还是要采取相应的补救措施并报警,然后修复 HSE。临时使用 HSI 只是为了把损失降低到最小,毕竟 HSI 较于 HSE 精度还是要低点。

  F103 系列中,使用 HSI 最大只能把系统设置为 64M,并不能跟使用 HSE 一样把系统时钟设置为 72M,究其原因是 HSI 在进入 PLL 倍频的时候必须 2 分频,导致 PLL 倍频因子调到最大也只能到 64M,而 HSE 进入 PLL 倍频的时候则不用 2 分频。

  在 F429 中,无论是使用 HSI 还是 HSE 都可以把系统时钟设置为 180M,因为 HSE 或 者 HSI 在进入 PLL 倍频的时候都会被分频为 1M 之后再倍频。还有一种情况是,有些用户不想用 HSE,想用 HSI,但是又不知道怎么用 HSI 来设置
系统时钟,因为调用库函数都是使用 HSE,下面我们给出个使用 HSI 配置系统时钟例子,起个抛砖引玉的作用。

三、代码编写

  代码如下(示例):

 /*
2 * m: VCO 输入时钟 分频因子,取值 2~63
3 * n: VCO 输出时钟 倍频因子,取值 192~432
4 * p: SYSCLK 时钟分频因子 ,取值 2,4,6,8
5 * q: OTG FS,SDIO,RNG 时钟分频因子,取值 4~15
6 * 函数调用举例,使用 HSE 设置时钟
7 * SYSCLK=HCLK=180M,PCLK2=HCLK/2=90M,PCLK1=HCLK/4=45M
8 * HSE_SetSysClock(25, 360, 2, 7);
9 * HSE 作为时钟来源,经过 PLL 倍频作为系统时钟,这是通常的做法
10
11 * 系统时钟超频到 216M 爽一下
12 * HSE_SetSysClock(25, 432, 2, 9);
13 */
14 void HSE_SetSysClock(uint32_t m, uint32_t n, uint32_t p, uint32_t q)
15 {16 __IO uint32_t HSEStartUpStatus = 0;
17
18 // 使能 HSE,开启外部晶振,野火 F429 使用 HSE=25M
19 RCC_HSEConfig(RCC_HSE_ON);
20
21 // 等待 HSE 启动稳定
22 HSEStartUpStatus = RCC_WaitForHSEStartUp();
23
24 if (HSEStartUpStatus == SUCCESS) {25 // 调压器电压输出级别配置为 1,以便在器件为最大频率
26 // 工作时使性能和功耗实现平衡
27 RCC->APB1ENR |= RCC_APB1ENR_PWREN;
28 PWR->CR |= PWR_CR_VOS;
29
30 // HCLK = SYSCLK / 1
31 RCC_HCLKConfig(RCC_SYSCLK_Div1);
32
33 // PCLK2 = HCLK / 2
34 RCC_PCLK2Config(RCC_HCLK_Div2);
35
36 // PCLK1 = HCLK / 4
37 RCC_PCLK1Config(RCC_HCLK_Div4);
38
39 // 如果要超频就得在这里下手啦
40 // 设置 PLL 来源时钟,设置 VCO 分频因子 m,设置 VCO 倍频因子 n,
41 // 设置系统时钟分频因子 p,设置 OTG FS,SDIO,RNG 分频因子 q
42 RCC_PLLConfig(RCC_PLLSource_HSE, m, n, p, q);
43
44 // 使能 PLL
45 RCC_PLLCmd(ENABLE);
46
47 // 等待 PLL 稳定
48 while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {49 }
50
51 /*-----------------------------------------------------*/
52 //开启 OVER-RIDE 模式,以能达到更高频率
53 PWR->CR |= PWR_CR_ODEN;
54 while ((PWR->CSR & PWR_CSR_ODRDY) == 0) {55 }
56 PWR->CR |= PWR_CR_ODSWEN;
57 while ((PWR->CSR & PWR_CSR_ODSWRDY) == 0) {58 }
59 // 配置 FLASH 预取指,指令缓存,数据缓存和等待状态
60 FLASH->ACR = FLASH_ACR_PRFTEN
61 | FLASH_ACR_ICEN
62 | FLASH_ACR_DCEN
63 | FLASH_ACR_LATENCY_5WS;
64 /*-----------------------------------------------------*/
65
66 // 当 PLL 稳定之后,把 PLL 时钟切换为系统时钟 SYSCLK
67 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
68
69 // 读取时钟切换状态位,确保 PLLCLK 被选为系统时钟
70 while (RCC_GetSYSCLKSource() != 0x08) {71 }
72 } else {73 // HSE 启动出错处理
74
75 while (1) {76 }
77 }
78 }

  形参说明:

  HSI 为 16M,参数 m 我们一般也设置为 16,所以我们需要修改系统时钟的时候只需要修改参数 n 和 p 即可,SYSCLK=PLLCLK=HSI/m*n/p。

  函数调用举例:HSI_SetSysClock(16, 360, 2, 7) 把系统时钟设置为 180M,这个跟库里面的系统时钟配置是一样的。HSI_SetSysClock(16, 432, 2, 9)把系统时钟设置为 216M,这个是超频,要慎用。


总结

  时钟很关键,他是各个设备的生命线,一旦时钟没有正确配置,那么基于时钟的所有外设都会出问题。以后经常用经常配置就熟悉了。

嵌入式开发学习之--RCC(下)相关推荐

  1. 嵌入式开发学习之--RCC(上)

    提示:本篇主要介绍一下不同时钟的特性和作用,了解为主. 文章目录 前言 一.RCC简介 二.系统时钟简介 2.1HSE 高速外部时钟信号 2.2锁相环 PLL 2.3系统时钟 SYSCLK 2.4AH ...

  2. 嵌入式全栈工程师_我花了半个月,整理出了这篇嵌入式开发学习指南(学习路线+知识点梳理)...

    不好意思久等了 这篇文章让小伙伴们久等了. 一年多以来,关于嵌入式开发学习路线.规划.看什么书等问题,被问得没有一百,也有大几十次了.但是无奈自己对这方面了解有限,所以每次都没法交代,搞得实在不好意思 ...

  3. 嵌入式开发学习路线图

    之前看到别人在学习视频中的回复,觉得很全面,分享给大家 --------------我就是个搬运工 基础学习Ⅰ---Linux入门        目前嵌入式主要开发环境有 Linux.Wince等:L ...

  4. 华清远见嵌入式开发学习的6大阶段

    分享一下华清远见嵌入式开发学习的6大阶段.19年嵌入式培训经验,值得一看. 第一阶段:嵌入式系统开发基础理论 阶段目标 掌握Linux操作系统的使用,精通使用C语言编程,熟练掌握嵌入式Linux的开发 ...

  5. 肝了半个月,我整理出了这篇嵌入式开发学习学习路线+知识点梳理)

    不好意思久等了 这篇文章让小伙伴们久等了. 一年多以来,关于嵌入式开发学习路线.规划.看什么书等问题,被问得没有一百,也有大几十次了.但是无奈自己对这方面了解有限,所以每次都没法交代,搞得实在不好意思 ...

  6. 嵌入式开发学习的几种线路图方向

    致谢:嵌入式开发学习的几种线路图方向 摘要: 嵌入式学习是一个循序渐进的过程,如果是希望向嵌入式软件方向发展的话,目前最常见的是嵌入式开发Linux方向,关注这个方向,我认为大概分3个阶段: 1.嵌入 ...

  7. 嵌入式开发学习笔记9-做一个好玩的LED闪烁

    嵌入式开发学习笔记9-做一个好玩的LED闪烁 前言 实际操作 程序功能 实现思路 程序源码 实现效果展示 前言 LED小灯闪烁实质是控制单片机上的I/O口,通过向I/O口循环输入高低电平,从而控制LE ...

  8. 利用SpiderMonkey进行嵌入式开发——学习总结

    利用SpiderMonkey进行嵌入式开发--学习总结 许峰 2007/07/30 最近在学习javascript引擎SpiderMonkey,学了一个星期了,终于有点眉目,现将学习经验记录下来,已被 ...

  9. 嵌入式开发学习笔记5-了解单片机中的特殊功能寄存器(寄存器B、累加器A和程序状态字PSW)

    嵌入式开发学习笔记5-了解单片机中的特殊功能寄存器(寄存器.累加器和程序状态字) 累加器A 寄存器B 程序状态字PSW 累加器A 累加器A是ACC(Accumulator)的缩写,累加器A是一个具有特 ...

最新文章

  1. Linux Shell 只列出目录的方法
  2. the vm session was closed before any attempt to power it on
  3. 检测到在集成的托管管道模式下不适用的 ASP.NET 设置, HTTP 错误 500.23 解决方案...
  4. CKEditor安装
  5. MySQL数据库的主键和外键详解
  6. 【正点原子MP157连载】第六章STM32Cube固件包-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南
  7. HTML5浏览器兼容性解决方案
  8. 莫拉蒂和4个干儿子的情感
  9. Hankson 的趣味题
  10. 共享充电宝方案原理,具体部件组成以及主控MUC参数
  11. 吃热狗游戏Java_《我的世界》吃才是王道“食物工艺”让你尝遍八大菜系
  12. SIP-sipp的使用
  13. Symantec Backup Exec 2012 Agent For Linux安装
  14. 环回接口是做什么的?
  15. 华为云桌面公有云版正式商用背后的五大黑科技
  16. vue-lazyload 使用说明
  17. 七剑战歌 - 川井宪次
  18. windows/Linux c++ 获取CMD指令执行的返回结果
  19. 如何解决winows启动后出现grub?
  20. 入手评测 i58300h和i510210u哪个好

热门文章

  1. 周易六十四卦——讼卦
  2. activiti入门系列文章9 - 委派与转办
  3. speedoffice(Word)如何调整页边距
  4. java 实时监控微信扫码支付,支付成功跳转到成功页面
  5. SWUSTOJ #617 班级课程成绩计算
  6. 【HTCVR】VRTK插件案例分析之0038~044
  7. 高可用集群篇(五)-- K8S部署微服务
  8. 一等奖,iPhone XR来了!A/B Test,个人中心首页改版实验分析报告(5000字详解)...
  9. 与武汉和黄州相关的几首诗词赋
  10. 用友软件T3版本不同的开账时间,期初余额应该如何录入?