嵌入式开发学习之--RCC(下)
文章目录
- 前言
- 一、使用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(下)相关推荐
- 嵌入式开发学习之--RCC(上)
提示:本篇主要介绍一下不同时钟的特性和作用,了解为主. 文章目录 前言 一.RCC简介 二.系统时钟简介 2.1HSE 高速外部时钟信号 2.2锁相环 PLL 2.3系统时钟 SYSCLK 2.4AH ...
- 嵌入式全栈工程师_我花了半个月,整理出了这篇嵌入式开发学习指南(学习路线+知识点梳理)...
不好意思久等了 这篇文章让小伙伴们久等了. 一年多以来,关于嵌入式开发学习路线.规划.看什么书等问题,被问得没有一百,也有大几十次了.但是无奈自己对这方面了解有限,所以每次都没法交代,搞得实在不好意思 ...
- 嵌入式开发学习路线图
之前看到别人在学习视频中的回复,觉得很全面,分享给大家 --------------我就是个搬运工 基础学习Ⅰ---Linux入门 目前嵌入式主要开发环境有 Linux.Wince等:L ...
- 华清远见嵌入式开发学习的6大阶段
分享一下华清远见嵌入式开发学习的6大阶段.19年嵌入式培训经验,值得一看. 第一阶段:嵌入式系统开发基础理论 阶段目标 掌握Linux操作系统的使用,精通使用C语言编程,熟练掌握嵌入式Linux的开发 ...
- 肝了半个月,我整理出了这篇嵌入式开发学习学习路线+知识点梳理)
不好意思久等了 这篇文章让小伙伴们久等了. 一年多以来,关于嵌入式开发学习路线.规划.看什么书等问题,被问得没有一百,也有大几十次了.但是无奈自己对这方面了解有限,所以每次都没法交代,搞得实在不好意思 ...
- 嵌入式开发学习的几种线路图方向
致谢:嵌入式开发学习的几种线路图方向 摘要: 嵌入式学习是一个循序渐进的过程,如果是希望向嵌入式软件方向发展的话,目前最常见的是嵌入式开发Linux方向,关注这个方向,我认为大概分3个阶段: 1.嵌入 ...
- 嵌入式开发学习笔记9-做一个好玩的LED闪烁
嵌入式开发学习笔记9-做一个好玩的LED闪烁 前言 实际操作 程序功能 实现思路 程序源码 实现效果展示 前言 LED小灯闪烁实质是控制单片机上的I/O口,通过向I/O口循环输入高低电平,从而控制LE ...
- 利用SpiderMonkey进行嵌入式开发——学习总结
利用SpiderMonkey进行嵌入式开发--学习总结 许峰 2007/07/30 最近在学习javascript引擎SpiderMonkey,学了一个星期了,终于有点眉目,现将学习经验记录下来,已被 ...
- 嵌入式开发学习笔记5-了解单片机中的特殊功能寄存器(寄存器B、累加器A和程序状态字PSW)
嵌入式开发学习笔记5-了解单片机中的特殊功能寄存器(寄存器.累加器和程序状态字) 累加器A 寄存器B 程序状态字PSW 累加器A 累加器A是ACC(Accumulator)的缩写,累加器A是一个具有特 ...
最新文章
- Linux Shell 只列出目录的方法
- the vm session was closed before any attempt to power it on
- 检测到在集成的托管管道模式下不适用的 ASP.NET 设置, HTTP 错误 500.23 解决方案...
- CKEditor安装
- MySQL数据库的主键和外键详解
- 【正点原子MP157连载】第六章STM32Cube固件包-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南
- HTML5浏览器兼容性解决方案
- 莫拉蒂和4个干儿子的情感
- Hankson 的趣味题
- 共享充电宝方案原理,具体部件组成以及主控MUC参数
- 吃热狗游戏Java_《我的世界》吃才是王道“食物工艺”让你尝遍八大菜系
- SIP-sipp的使用
- Symantec Backup Exec 2012 Agent For Linux安装
- 环回接口是做什么的?
- 华为云桌面公有云版正式商用背后的五大黑科技
- vue-lazyload 使用说明
- 七剑战歌 - 川井宪次
- windows/Linux c++ 获取CMD指令执行的返回结果
- 如何解决winows启动后出现grub?
- 入手评测 i58300h和i510210u哪个好