基于STM32F407时钟配置学习

2023-05-16


STM32F4x系列时钟树如下:这里写图片描述

1、系统时钟SYSCLK

在STM32F407中,除了一些特定的时钟(例如,USB OTG FS时钟,I2S时钟)外,系统所有外设的时钟均是通过SYSCLK来提供的。也就是说我们经常用到的外设时钟,都是通过SYSCLK分频得到的。下面是和SYSCLK相关的时钟树的图。
这里写图片描述
由图中可以看到,SYSCLK的来源主要有三个。
- HSI 振荡器时钟
- HSE 振荡器时钟
- 主 PLL (PLL) 时钟
下面分别来看下系统时钟SYSCLK的三个来源。

(1) 高速外部时钟HSE(4M~26M)

高速外部时钟是芯片内部的HSE振荡器产生的。高速外部信号(HSE)有两个时钟源。
- HSE外部晶振/陶瓷振荡器
- HSE外部用户时钟
下图是HSE/LSE的时钟源硬件配置
这里写图片描述

外部晶振/陶瓷振荡器( HSE晶振)

这种方式是通过在OSC_IN和OSC_OUT接入外部晶振实现的。在这种模式下,因为晶振起振需要一定的时间,因此可以通过RCC 时钟控制寄存器(RCC_CR) 中的HSERDY 标志指示高速外部振荡器是否稳定。时钟启动后,HSERDY被硬件置1。如果在RCC时钟中断寄存器(RCC_CIR)中使能中断,则可以触发中断。
HSE晶振可以通过RCC时钟控制寄存器(RCC_CR)的HSEON打开或者关闭。

HSE外部时钟源(HSE旁路)

这种方式是指通过OSC_IN引脚输入一个外部时钟源,这个时钟源是外部产生的现成的时钟信号。在这种模式下,必须使用占空比大约为50%的外部时钟信号来驱动OSC_IN引脚。
此模式通过RCC时钟控制寄存器(RCC_CR)的HSEBYP和HSEON位一起置1进行选择。

注意:

  • RCC->CR |= ((uint32_t)RCC_CR_HSEON|RCC_CR_HSEBYP)此时选择的是HSE旁路,如果HSE是HSE晶振,则晶振启动不了,时钟源会默认选择HSI。
  • RCC->CR |= ((uint32_t)RCC_CR_HSEON)此时选择HSE晶振。
  • HSE外部晶振频率在stm32f4xx.h里的HSE_VALUE更改。

(2) 高速内部时钟HSI

STM32F407内部自带一个16M的内部晶振,这个晶振产生的时钟信号可以直接用作系统时钟SYSCLK。也可以作为PLL的输入。内部晶振的优点是成本低,启动速度也比外部晶振要快,但是内部晶振的精度比外部晶振要差。可以通过RCC时钟控制寄存器(RCC_CR)中的HSIRDY 标志来判断HSI RC时钟信号是否稳定。

(3) 主PLL时钟

STM32F407具有两个PLL,用于产生不同的时钟信号。这里主要来讨论主PLL时钟。主PLL时钟的时钟源有两个信号,分别是上边提到的HSI信号和HSE信号。PLL通过把这两个信号倍频,分频等达到更高频率的时钟信号。一般来说,由于HSI和HSE的时钟频率较低,SYSCLK一般都不会选择HSI时钟和HSE时钟作为系统时钟,而主PLL产生的时钟一般会用作系统时钟。(但是,我刚接手的项目工程确实用了HSI作为系统时钟,搞了一天,最后还是借用RCC_GetClocksFreq(&get_rcc_clock) 这个函数查看实时时钟才发现问题,怪我太蠢。)下面是主PLL的内部结构框图。
这里写图片描述
由图可以看出PLL的时钟源主要有两个:HSE时钟信号和HIS时钟信号。其中PLL_M,PLL_N,PLL_P,PLL_Q是一个分频器,而PLL_M是一个倍频器。假设图中经过PLL_N之后的时钟信号为PLL_VCO,PLL使用外部时钟信号HSE作为时钟源。那么有如下关系。
锁相环压腔振荡器时钟PLL_VCO = (HSE / PLL_M)* PLL_N
系统时钟SYSCLK = PLL_VCO/ PLL_P
所以,如果外部晶振的频率已经确定了,那么确定PLL_M,PLL_N,PLL_P的系数就可以得到对应频率的系统时钟SYSCLK,其中PLL_M,PLL_N,PLL_P可以有多种组合,只要满足相应的条件即可。例如,假设外部晶振为8M,对STM32F407来说,系统时钟的最大频率为168M,那么久可以分别设置PLL_M = 8,PLL_N = 336,PLL_P = 2。来产生168M的时钟。即SYSCLK = ( 8 /8 ) * 336 / 2 = 168M。
通过配置主PLL,我们就得到了系统的主时钟SYSCLK,下一步我们就可以通过这个时钟来分频得到各个外设的时钟。

2、AHBx时钟

经过AHBx预分频器,可以得到AHBx外设时钟。一般来说AHBx分频器的值为1,也就是说AHBx的时钟和系统时钟相等。AHBx上边所挂的外设可以到RCC和AHBx外设相关的寄存器去看,在使能AHBx上的某个外设之前,必须使能该外设时钟。
这里写图片描述

3、APB1和APB2时钟

经过APB1预分频器和APB2预分频器可以得到APB1和APB2外设时钟。在STM32F407里边,APB1的最大时钟为42M,APB2的最大时钟为84M。同样可以在RCC的寄存器下边观测APB1和APB2上边所挂的外设。使用某个外设之前也要使能相应的时钟。
这里写图片描述
由上图可知,APB1和APB2是由AHBx分频得到。分频在system_stm32f4xx.c里的SetSysClock()里实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于STM32F407时钟配置学习 的相关文章

随机推荐

  • 不规则Contours内部像素的操作

    在findContours函数使用了之后 xff0c 有时候就会面临对Contours内部区域的访问 由于contours不一定是凸图形 xff0c 所以使用循环操作的时候总感觉不那么方便 比如在下图中 xff0c 已经使用findCont
  • ros代码中添加使用opencv库,cv::Mat和ros image之间的相互转换

    https blog csdn net sunyoop article details 78630024 ros中很多时候要用到图形处理 xff0c 这时就需要使用opencv库 xff0c 本篇主要将怎么在ros现成node上使用open
  • Ubuntu 16.04 使用

    这篇博客用来专门记录尝试搬迁工作环境到Linux下的使用笔记 xff0c 主要包含有常用软件的安装 xff0c 配置 1 安装输入法 ubuntu 16 04中支持ibus输入系统 1 系统 gt 首选项 gt IBus设置 在弹出的IBu
  • 牛顿迭代法求解方程

    说明 xff1a 该篇博客源于博主的早些时候的一个csdn博客中的一篇 xff0c 由于近期使用到了 xff0c 所以再次作一总结 原文地址 概述 牛顿迭代法 xff08 Newton s method xff09 又称为牛顿 拉夫逊 xf
  • OpenCV - 均值迭代分割

    题外话 之前在博客中写过一篇 区域生长 的博客 xff0c 区域生长在平时经常用到 xff0c 也比较容易理解和代码实现 xff0c 所以在很多情况下大家会选择这种方法 但是区域生长有一个最致命的点就是需要选取一个生长的种子点 为了交流学习
  • IMU原理及姿态融合算法详解

    IMU原理及姿态融合算法详解 一 组成 IMU全称是惯性导航系统 xff0c 主要元件有陀螺仪 加速度计和磁力计 其中陀螺仪可以得到各个轴的加速度 xff0c 而加速度计能得到x xff0c y xff0c z方向的加速度 xff0c 而磁
  • FrankMocap win10安装指导

    本文是相当于将github上frankmocap的安装指导进行了翻译 xff0c 增加了一下windows下安装遇到的坑以及注意事项 如果是linux系统应该安装官方的安装指导安装就可以 xff0c 可以直接参考官方安装指导 安装所有模块
  • ADRC学习(1)系统在调节过程中安排过渡过程的作用

    1 二阶系统的调节过程 考虑对于如下所示的二阶系统 x
  • 笔记本更换SSD后卡顿、假死、失去响应问题探究

    某些笔记本电脑将HDD更换为SSD后 xff0c 系统运行过程中会随机产生半分钟到一分钟的卡顿 xff08 假死 xff09 期间鼠标指针可以运动 xff0c 但所有程序均失去响应 xff0c 也无法打开新的程序 HDD硬盘指示灯常亮 xf
  • 机器人 齐次变换矩阵 位姿变换矩阵(RT矩阵) Matlab参数公式计算

    对于齐次位姿变换 xff08 RT矩阵 xff09 xff0c 有的时候手动计算公式参数太多比较麻烦 xff0c 因此利用matlab参量syms xff0c 可以方便一些 xff0c 可以用于计算机器人正运动学位姿矩阵的参数表示 xff0
  • UART串口校验方式(无校验、奇偶校验、固定校验)

    UART串口校验方式 xff08 奇偶校验 固定校验 无校验 xff09 串口通信校验方式奇偶校验位固定校验位 Stick 无校验位 校验位 xff1a 串口通信中的检错方式 串口在接收数据时 xff0c 如果无检验位 xff0c 则只要检
  • 更改LXDE的语言为中文

    之前给旧笔记本安装了Debian8 43 LXDE嘛 xff0c 运行比较流畅 安装过程中本想选择中文的 xff0c 但是安装界面中旧有中文乱码 xff0c 所以还是选了英语 等装好了系统 xff0c 把apt update 43 upgr
  • 干掉Nouveau安装Linux Nvidia显卡驱动

    https blog csdn net misiter article details 7652731 干掉Nouveau安装Linux Nvidia显卡驱动 首先说明下什么是Nouveau xff0c 为什么有些系统安装N卡驱动的时候会提
  • 【C应用】红外遥控小车程序分析(上)——四轮马达方向控制程序分析

    目录 驱动原理分析 L293D功能分析 代码分析 驱动原理分析 小车采用两片L293D芯片控制四个车轮 xff0c 原理图如下 xff1a 因为L293D可分别控制两路电机 xff0c 为了方便理解L293D芯片的工作原理 xff0c 拿L
  • 【RTOS】RTOS实时操作系统随笔(结合UCOSII相关移植)

    目录 无操作系统下的程序结构及缺陷 有操作系统下的解决方案及CPU工作原理 操作系统调度策略及时间片轮转策略 操作系统TICK及进程切换 UCOSII介绍 UCOSII进程任务切换原理 xff1a UCOS进程的堆栈 xff1a 时钟TIC
  • 【STM32CobeMX】CubeMX建立基于STM32F1VBT6的FreeRTOS

    STM32F103VBT6 内部时钟源RCC 如果使用RTOS 使用了RTOS xff0c 默认使用SysTick xff1b 所以HAL库的时基就要用其他的定时器 当用了RTOS xff0c 就要设置HAL的timebase为其他Time
  • 【QT】手把手制作一个网络调试助手(UDP设计)

    TCP和UDP网络通信类的使用 Porn hub 1 程序框架搭建 接着上一篇文章 xff0c 这里就开始设计UDP的相关功能函数了 xff0c 首先将其UDP的相关配置进行隐藏 xff1b 1 1 构造函数讲解 MainWindow Ma
  • 【PADSVX2.7】PADSVX2.7

    目录 1 文件准备 xff1a 2 解压PADSVX 2 7 ESDM到Install 3 点击Setup 4 替换文件 5 有请馒头大师 6 开始享受VX2 7带来的爽快感觉 xff01 xff01 xff01 1 文件准备 xff1a
  • STM32 CAN的ID过滤配置

    过滤器的过滤模式 STM32提供两种过滤模式供用户设置 xff1a 屏蔽位模式和标识符列表模式 STM32总共提供14个过滤器组来处理CAN接收过滤问题 xff0c 每个过滤器组包含两个32位寄存器CAN FxR0和CAN FxR1组成 x
  • 基于STM32F407时钟配置学习

    STM32F4x系列时钟树如下 xff1a 1 系统时钟SYSCLK 在STM32F407中 xff0c 除了一些特定的时钟 xff08 例如 xff0c USB OTG FS时钟 xff0c I2S时钟 xff09 外 xff0c 系统所