【STM32标准库】【基础知识】时钟系统
文章目录
- 时钟
- 时钟的作用
- 时钟的产生
- F4系列的时钟系统
- 时钟源
- 总线
- 标准库的时钟设置
- 内部高速时钟设置
- 外部高速时钟设置
- AHB时钟设置
- APB1/2时钟设置
- 默认值
文章基于适用于STM32F4系列,作者使用STM32F401CCU6开发板。
本文章基于此系列和开发板展开讨论。
时钟
时钟的作用
学习过数电课程的应该知道,时钟对于时序逻辑电路的重要性。
时钟在本质上就是一个确定频率(周期)的波形,在数字电路中是以方波的形式出现的。
时钟为存在先后次序的电路(逻辑关系)提供了一个时间基准。缺失了这个基准时序逻辑电路将无法正常运行
时钟的产生
产生最初时钟的方式常用的有两种。
一是RC震荡回路,这是利用电容的充放电产生周期性的波形。 它对于电容和电阻的精度要求高,而且震荡频率稳定性也欠佳,优点在于可以在制造完成后改变其频率
二是石英晶体震荡器,简称晶振,这种震荡器利用了石英晶体的压电效应。
无源晶振可以将其认为是一个检波器,允许特定频率的信号通过,加上放大电路(起振是利用电路的固有噪声)就可以产生时钟信号了。
有源晶振就是将放大器和无源晶振打包起来。
优点是成本低,精度高(再好的RC震荡电路也无法比及同水平的晶振),缺点是因为是利用特定形状的晶体,因此无法在出厂后改变其频率
三是锁相环(PLL),为了解决前两个方案的缺点,聪明的人们发明了一种叫做锁相环的东西,具体原理,这里只需要知道它可以时两个频率接近,相位接近的信号变成同相位同频率的信号。或者接近频率乘倍数的信号相位相同(其实就是跳过一个或几个周期,利用其边沿锁相),就像这样
上面的是晶振输入的标准信号
我们可以使用PLL进行分频和倍频操作。分频可以使用数电中的分频器然后送入锁相环进行锁相,倍频可以利用VCO产生高频时钟然后分频后送入PLL锁相
因此,我们可以使用这3个系统产生单片机所使用的时钟信号。
F4系列的时钟系统
时钟源
STM32F4系列有多个时钟源用于不同需求的外设
下表中的频率为本单片机所支持的,如果使用其他单片机请自行查询
缩写 | 中文名称 | 频率 | 作用 |
---|---|---|---|
HSI | 高速内部时钟 | 默认16MHz | 备用系统时钟 |
HSE | 高速外部时钟 | 最大50MHz(最大晶振为25MHz) | PLL倍频后做系统时钟 |
LSI | 低速内部时钟 | 32KHz | 看门狗用 |
LSE | 低速外部时钟 | 32.768KHz | RTC用 |
总线
STM32F4系列有两种总线,AHB(高性能总线)用于高性能模块之间的连接,APB(外设总线)用于连接低速设备
AHB的时钟是系统时钟经过分频得到的,一般情况是与系统时钟相同。 AHB最高工作频率同系统时钟
APB有2根总线,他们的时钟不相同。 APB2的时钟频率大于APB1
APB2最高工作频率为84MHz, APB1最高工作频率为42MHz,
APB1和APB2可以分别分频AHB的时钟
下表中的频率为本单片机所支持的,如果使用其他单片机请自行查询
这是在标准库中查询时可能用到的一些名词解释
缩写 | 名称 | 最大频率 | 来源 |
---|---|---|---|
SYSCLK | 系统时钟 | 168MHz | HSI,或HSE,或Main PLL直接驱动 |
HCLK | 高速设备的时钟(如CPU) | SYSCLK | 经AHB预分频器分频SYSCLK |
PCLK1 | APB1时钟 | 42MHz | 经APB1预分频器分频HCLK |
PCLK2 | APB2时钟 | 84MHz | 经APB2预分频器分频HCLK |
关于挂载在APB1/2总线下的计时器有一点需要注意
如果APB1/2没有分频,也就是分频系数的值为1,分频选项的宏定义一般为DIV1结尾
则定时器的时钟就是APB1/2的时钟
如果分频了,就是分频选项的值为2或4或8或16,分频选项的宏定义一般为DVI2/DVI4等
则定时器的时钟频率为APB1/2的时钟的两倍
标准库的时钟设置
内部高速时钟设置
注意:需要找到自己单片机型号所对应的宏定义处
输入HSI_VALUE跳转到定义处即可修改内部RC震荡器的数值(单位Hz)
外部高速时钟设置
注意:需要找到自己单片机型号所对应的宏定义处
输入HSE_VALUE跳转到定义处即可修改外部晶振的数值(单位Hz)
注意,因为系统时钟是由外部晶振通过PLL倍频得到的,因此需要修改系统时钟和PLL参数
输入SystemCoreClock跳转到定义处即可修改系统时钟的值(单位Hz)
输入PLL_M跳转到定义处即可修改有关系统时钟的PLL倍频选项
输入PLL_N跳转到定义处即可修改有关系统时钟的PLL倍频选项
输入PLL_P跳转到定义处即可修改有关系统时钟的PLL倍频选项
输入PLL_Q跳转到定义处即可修改有关系统时钟的PLL倍频选项
注意这四个的取值是有范围的
2 <= PLL_Q <= 152 <= PLL_M <= 63
192 <= PLL_N <= 432
PLL_P是2, 4, 6, 8其中之一
PLL的VCO的频率的计算公式是
PLL_VCO = [ ( HSE或HSI ) / PLL_M ] * PLL_N
其中HSE是外部晶振频率(单位MHz)
其中HSI是内部RC振荡器频率(单位MHz)
系统时钟频率是PLL_VCO经过分频后得到的
计算公式如下
SYSCLK = PLL_VCO / PLL_P
也就是说
SYSCLK = [ ( HSE或HSI ) / PLL_M ] * PLL_N / PLL_P
PLLQ是关于USB,SDIO,RNG的时钟,其值为
PLL_VCO / PLLQ
AHB时钟设置
注意:需要找到自己单片机型号所对应的宏定义处
输入**SetSysClock()**跳转到定义处,在下面有个带注释的寄存器操作代码
/* HCLK = SYSCLK / 1*/RCC->CFGR |= RCC_CFGR_HPRE_DIV1;
也就是这个,直接修改RCC_CFGR_HPRE_DIV1为自己需要的分频数,可以为
#define RCC_CFGR_HPRE_DIV1 ((uint32_t)0x00000000) /*!< SYSCLK not divided */
#define RCC_CFGR_HPRE_DIV2 ((uint32_t)0x00000080) /*!< SYSCLK divided by 2 */
#define RCC_CFGR_HPRE_DIV4 ((uint32_t)0x00000090) /*!< SYSCLK divided by 4 */
#define RCC_CFGR_HPRE_DIV8 ((uint32_t)0x000000A0) /*!< SYSCLK divided by 8 */
#define RCC_CFGR_HPRE_DIV16 ((uint32_t)0x000000B0) /*!< SYSCLK divided by 16 */
#define RCC_CFGR_HPRE_DIV64 ((uint32_t)0x000000C0) /*!< SYSCLK divided by 64 */
#define RCC_CFGR_HPRE_DIV128 ((uint32_t)0x000000D0) /*!< SYSCLK divided by 128 */
#define RCC_CFGR_HPRE_DIV256 ((uint32_t)0x000000E0) /*!< SYSCLK divided by 256 */
#define RCC_CFGR_HPRE_DIV512 ((uint32_t)0x000000F0) /*!< SYSCLK divided by 512 */
默认情况下,HCLK = SYSCLK
APB1/2时钟设置
注意:需要找到自己单片机型号所对应的宏定义处
输入SetSysClock() 跳转到定义处,在下面有个带注释的寄存器操作代码
/* PCLK2 = HCLK / 1*/RCC->CFGR |= RCC_CFGR_PPRE2_DIV1;/* PCLK1 = HCLK / 2*/RCC->CFGR |= RCC_CFGR_PPRE1_DIV2;
修改RCC_CFGR_PPRE2_DIV1和RCC_CFGR_PPRE1_DIV2即可
APB2可以取值为
#define RCC_CFGR_PPRE2_DIV1 ((uint32_t)0x00000000) /*!< HCLK not divided */
#define RCC_CFGR_PPRE2_DIV2 ((uint32_t)0x00008000) /*!< HCLK divided by 2 */
#define RCC_CFGR_PPRE2_DIV4 ((uint32_t)0x0000A000) /*!< HCLK divided by 4 */
#define RCC_CFGR_PPRE2_DIV8 ((uint32_t)0x0000C000) /*!< HCLK divided by 8 */
#define RCC_CFGR_PPRE2_DIV16 ((uint32_t)0x0000E000) /*!< HCLK divided by 16 */
APB1可以取值为
#define RCC_CFGR_PPRE1_DIV1 ((uint32_t)0x00000000) /*!< HCLK not divided */
#define RCC_CFGR_PPRE1_DIV2 ((uint32_t)0x00001000) /*!< HCLK divided by 2 */
#define RCC_CFGR_PPRE1_DIV4 ((uint32_t)0x00001400) /*!< HCLK divided by 4 */
#define RCC_CFGR_PPRE1_DIV8 ((uint32_t)0x00001800) /*!< HCLK divided by 8 */
#define RCC_CFGR_PPRE1_DIV16 ((uint32_t)0x00001C00) /*!< HCLK divided by 16 */
也就是说,APB1默认是2倍分频,APB2默认是不分频
默认值
前提:使用25MHz的外部晶振,没有修改标准库函数
根据上面的式子可以计算出各个时钟的默认值,这里只给结果了
缩写 | 名称 | 默认频率(单位MHz) |
---|---|---|
PLL_VCO | 锁相环的压控振荡器 | 336 |
SYSCLK | 系统时钟 | 84 |
HCLK | AHB时钟 | 84 |
PCLK1 | APB1时钟 | 42 |
PCLK2 | APB2时钟 | 84 |
因此STM32所有的定时器的时钟频率均为84MHz,也就是系统时钟频率
【STM32标准库】【基础知识】时钟系统相关推荐
- STM32标准库修改HSI时钟教程
目录 前言 一.官方标准库是如何改变时钟的? 二.修改系统时钟 前言 在我们常用的STM32 Blue Pill(如下图所示)上,一般在学习时都会使用默认的72Mhz晶振.但当我们自己设计电路板时,如 ...
- 【STM32】STM32标准库与HAL库对照学习教程特别篇--系统时钟RCC详讲
[STM32]STM32标准库与HAL库对照学习教程特别篇--系统时钟RCC详讲 一.前言 二.时钟是什么 三.时钟树 1.时钟树图 2.时钟树讲解 左边部分 中间部分 右边部分 特殊部分 四.初始化 ...
- STM32标准库的引入视频课程-第3季第6部分-朱有鹏-专题视频课程
STM32标准库的引入视频课程-第3季第6部分-1017人已学习 课程介绍 本课程是<朱有鹏老师单片机完全学习系列课程>第3季第6个课程,本课程详细讲解了STM32官方新标 ...
- 视频教程-STM32标准库的引入视频课程-第3季第6部分-单片机/工控
STM32标准库的引入视频课程-第3季第6部分 互联网课程品牌<朱老师物联网大讲堂>创始人.精通U-Boot.Linux kernel移植及驱动程序开发;精通C.C++.Java.C#等语 ...
- IAR新建stm32工程,完美移植stm32标准库(附源码)
开发环境:Window 10 64bit 开发工具:IAR Embedded Workbench 硬件:stm32f103c8t6 基于IAR 开发工具,新建立STM32F1系列的最小开发例程,并加入 ...
- 了解库开发,我们从STM32标准库开发学起
摘要:从STM32新建工程.编译下载程序出发,让新手由浅入深,尽享STM32标准库开发的乐趣. 自从CubeMX等图像配置软件的出现,同学们往往点几下鼠标就解决了单片机的配置问题.对于追求开发速度的业 ...
- STM32标准库工程中移植TencentOS-tiny
一.移植前的准备 1. 引言 因为项目的原因需要将原有的标准库工程升级为基于TencentOS-tiny的RTOS工程,所以花费一点时间记录移植过程,提供一份向基于STM32标准库的老工程中移植Ten ...
- (一)使用TrueSTUDIO软件新建一个基于STM32标准库工程
一.TrueSTUDIO说明 不管是还在学习的还是已经工作的应该都很熟悉Keil和IAR这两款用来开发嵌入式的软件,在国内普遍用的这两款编译软件都是破解版的,并没有经过正规渠道授权注册,这就导致了在开 ...
- 计算机操作员 国家题库,计算机操作员中最新国家题库基础知识部分.doc
计算机操作员中最新国家题库基础知识部分 第1章 信息技术原理概述PAGE PAGE 22国家职业资格培训教程配套辅导练习第一章 信息技术原理概述计算机的概念.分类及应用1.信息革命的概念 迄今为止,人 ...
- 基于STM32标准库的MS5837程序移植
基于STM32标准库的MS5837程序移植 一.准备工作 1. 硬件电路 2. 新建工程 二.开始移植 1. IIC底层模拟 2. MS5837移植 3. 主函数编写 4. 代码调试结果 三.源代码下 ...
最新文章
- 重新拾起ActionScript,物已是人已非--浅谈软件之美
- 契约式设计(DbC)感想(二)
- js 浏览器复制功能
- 主机不支持php5.4,GoDaddy Linux主机不再支持PHP5.3版本 | Godaddy美国主机中文指南
- Servlet的文件上传
- 电脑故障维修判断指导大全(5)
- 被嘲“狗都不如”的那个人,年入1000万了
- android 录音原始文件_Android 11可能最终会取消Android对视频录制的4GB文件大小限制...
- Django之ModelForm使用
- 一起话单业务量下降问题的排查过程
- 蓝桥杯官网 试题 PREV-113 历届真题 估计人数【第十届】【决赛】【研究生组】【C++】【Java】【Python】三种解法
- ubuntu kernel panic查看源文件
- 病毒之Worm.Win32.AutoRun
- 计算机没有进程管理器,win10系统任务管理器中没有进程的处理办法
- ios开发的p12和provision
- phpstorm+xdebug远程调试
- 供应链环境下VMI运作模式研究
- 春赏百花秋望月,夏沐凉风冬听雪
- 如何批量给视频加文字水印?
- oracle reco进程停止,ORA-01089 数据库无法正常关闭