嵌入式硬件篇---HAL库内外部时钟主频锁相环分频器


文章目录

  • 前言
  • 第一部分:STM32-HAL库
    • HAL库编程
      • 优势
        • 1.抽象层
        • 2.易于上手
        • 3.代码可读性
        • 4.跨平台性
        • 5.维护和升级
        • 6.中间件支持
      • 劣势
        • 1.性能
        • 2.灵活性
        • 3.代码大小
        • 4.复杂性
    • 直接寄存器操作编程
      • 优势
        • 1.性能
        • 2.灵活性
        • 3.代码大小
        • 4.学习深度
      • 劣势
        • 1.复杂性
        • 2.可读性
        • 3.可维护性
        • 4.跨平台性
    • 总结
  • 第二部分:STM32内部、外部时钟
    • 内部时钟
      • 1.RC振荡器(HSE)
      • 2.精准内部振荡器(LSI)
      • 3.系统振荡器(MSI)
    • 外部时钟
      • 1.晶振/陶瓷谐振器(HSE)
      • 2.外部时钟输入(HSE bypass)
    • 时钟系统特点
      • 1.稳定性和精度
      • 2.系统启动
      • 3.灵活性
      • 4.时钟树
  • 第三部分:STM32主频&锁相环&分频器
    • STM32的主频
      • 1.主频范围
      • 2.时钟源
    • 锁相环(PLL)
      • PLL的工作原理
        • 1.输入
        • 2.倍频
        • 3.分频
        • 4.相位锁定
      • PLL配置
        • 1.预分频器
        • 2.倍频因子
        • 3.系统时钟分频器
    • 分频器
      • 分频器类型
        • 1.AHB分频器
        • 2.APB分频器
        • 3.其他分频器
      • 分频器设置
    • 示例配置
  • 总结


前言

以上就是今天要讲的内容,本文简单介绍了STM32的HAL库、内外部时钟、微控制器主频、锁相环PPL、分频器相关知识。


第一部分:STM32-HAL库

STM32的HAL(Hardware Abstraction Layer)库是由ST公司提供的一套中间件,用于简化STM32微控制器的编程。除了HAL库之外,另一种常见的编程方法是直接使用寄存器操作,也称为**“裸机编程”或“寄存器级编程”**。以下是两种方法的优缺点详细解释:

HAL库编程

优势

1.抽象层

抽象层:
HAL库提供了一套硬件抽象层,使得开发者不需要直接操作硬件寄存器,降低了编程复杂度。

2.易于上手

易于上手:
对于初学者或需要快速开发的工程师来说,HAL库更容易上手。

3.代码可读性

代码可读性:
HAL库函数通常具有自解释的名称,提高了代码的可读性。

4.跨平台性

跨平台性:
使用HAL库编写的代码可以在不同的STM32系列之间轻松迁移

5.维护和升级

维护和升级:
ST公司定期更新HAL库,修复bug并增加新功能,使得维护和升级更为方便。

6.中间件支持

中间件支持:
HAL库通常与ST提供的其他中间件(如RTOS、USB、Ethernet等)集成良好。

劣势

1.性能

性能:
HAL库可能会引入额外的开销,导致性能不如直接操作寄存器。

2.灵活性

灵活性:
HAL库提供的抽象可能会限制对硬件的某些高级操作

3.代码大小

代码大小:
HAL库可能会增加最终程序的代码大小,对于资源有限的微控制器来说可能是个问题。

4.复杂性

复杂性:
对于简单的应用,HAL库可能显得过于复杂,增加了不必要的代码和配置。

直接寄存器操作编程

优势

1.性能

性能:
直接操作寄存器可以编写出性能最优的代码,因为没有额外的抽象层开销。

2.灵活性

灵活性:
开发者可以完全控制硬件的每一个细节,实现更精细的操作。

3.代码大小

代码大小:
直接操作寄存器通常可以生成更小的代码,节省存储空间。

4.学习深度

学习深度:
通过直接操作寄存器,开发者可以更深入地理解微控制器的内部工作原理。

劣势

1.复杂性

复杂性:
直接操作寄存器需要开发者对硬件有深入的了解,编程难度较高。

2.可读性

可读性:
寄存器操作的代码可能不如HAL库代码直观,可读性较差

3.可维护性

可维护性:
由于代码更接近硬件,维护和升级可能会更加困难。

4.跨平台性

跨平台性:
直接操作寄存器的代码通常不具备跨平台性,迁移到不同的STM32系列可能需要大量修改。

总结

选择HAL库编程还是直接寄存器操作编程,取决于项目的具体需求、开发者的经验以及对性能和资源的要求。对于大多数应用,HAL库提供了足够的性能和方便的接口适合快速开发和维护。而对于那些对性能和资源有极端要求的应用直接操作寄存器可能是更好的选择。在实际开发中,开发者也可能会结合使用这两种方法,以实现最佳的开发效率和性能。

第二部分:STM32内部、外部时钟

STM32微控制器支持多种时钟源,以供系统时钟(SYSCLK)使用。这些时钟源可以分为两大类:内部时钟和外部时钟。

内部时钟

1.RC振荡器(HSE)

高速内部时钟(HSI):
HSI是一个内部RC振荡器,通常频率为16 MHz。
不需要外部时钟元件,因此可以降低成本和电路复杂性。
HSI的精度相对较低,通常在1%左右,但在某些STM32系列中,可以通过内部校准提高精度

2.精准内部振荡器(LSI)

低速内部时钟(LSI):
LSI是一个低功耗、低精度的RC振荡器,通常用于实时时钟(RTC)或者其他对时钟精度要求不高的应用
频率一般在32 kHz左右。

3.系统振荡器(MSI)

多速内部时钟(MSI):
MSI是一个可编程的内部RC振荡器可以在多种频率下工作,通常范围在65 kHz到4 MHz之间
它的精度可以通过软件校准来提高。
MSI特别适用于低功耗应用,因为它可以在低频率下工作,从而降低功耗。

外部时钟

1.晶振/陶瓷谐振器(HSE)

高速外部时钟(HSE):
HSE是一个外部时钟源,可以通过连接一个晶振或陶瓷谐振器到HSE引脚来使用。
它可以提供更高的精度,通常在几十ppm(百万分之几十)。
频率范围通常在4 MHz到32 MHz之间。

2.外部时钟输入(HSE bypass)

外部时钟输入:
HSE也可以通过外部时钟信号直接输入,这称为HSE bypass模式。
在这种模式下,外部时钟源可以是另一个微控制器的时钟输出、时钟发生器等。

时钟系统特点

1.稳定性和精度

内部时钟:通常精度较低,但无需外部元件,成本较低
外部时钟:通常精度较高,但需要**外部晶振或谐振器,**成本相对较高。

2.系统启动

在系统启动时,STM32通常会使用**HSI(高速内部时钟)**作为默认时钟源,随后可以通过软件配置切换到其他时钟源。

3.灵活性

STM32的时钟系统非常灵活,允许在运行时动态地改变时钟配置,以适应不同的运行模式,比如低功耗模式或高性能模式

4.时钟树

STM32具有复杂的时钟树,可以通过多个PLL(锁相环)和分频器来生成多个时钟,用于不同的外设和内核
选择使用内部时钟还是外部时钟,取决于具体的应用需求,如精度、成本、功耗和电路复杂性等因素。通常,对于精度要求高的应用,如通信系统,会使用外部时钟源;而对于成本敏感或低功耗的应用,内部时钟源可能是更好的选择。

第三部分:STM32主频&锁相环&分频器

STM32的主频

主频是指微控制器(MCU)中央处理单元(CPU)时钟频率,它决定了CPU执行指令的速度。STM32微控制器的主频可以通过多种方式配置,以下是一些关键点:

1.主频范围

STM32系列微控制器的主频范围很广,从几MHz到几百MHz不等,具体取决于所使用的STM32型号
例如,STM32F0系列的主频最高可达48 MHz,而STM32H7系列的主频可以高达400 MHz。

2.时钟源

主频的来源可以是内部时钟源(如HSI、MSI)或外部时钟源(如HSE)。
主频也可以通过锁相环(PLL)来倍频,以获得更高的CPU操作速度。

锁相环(PLL)

锁相环(PLL)是一种反馈控制系统,它能够生成一个频率和相位与输入信号同步的输出信号。在STM32中,PLL用于提高时钟频率。

PLL的工作原理

1.输入

输入:PLL通常接收来自**内部或外部时钟源(如HSI、HSE)**的信号作为输入。

2.倍频

倍频:通过PLL的倍频器,可以将输入频率乘以一个整数称为PLL倍频因子),以获得更高的输出频率。

3.分频

分频:在倍频之后,输出频率可以被一个分频器分频,以获得所需的频率。

4.相位锁定

相位锁定:PLL内部有一个相位-频率检测器(PFD),它比较输入信号和输出信号的相位和频率,通过反馈环路调整VCO(压控振荡器)的频率,使得输出信号的相位和频率与输入信号同步。

PLL配置

STM32的PLL配置通常通过时钟配置寄存器来完成,可以设置以下参数:

1.预分频器

预分频器(PREDIV):对输入时钟进行预分频,以降低VCO的工作频率。

2.倍频因子

倍频因子(M):设置PLL的倍频倍数

3.系统时钟分频器

系统时钟分频器(N):对PLL的输出进行分频,以得到系统时钟(SYSCLK)。

分频器

分频器用于降低时钟频率,它在STM32的时钟系统中扮演着重要角色。

分频器类型

1.AHB分频器

AHB分频器:用于生成AHB总线时钟(HCLK),这个时钟用于大部分外设和内存。

2.APB分频器

APB分频器:进一步分频AHB时钟,生成APB1和APB2时钟,这些时钟用于低速外设

3.其他分频器

其他分频器:例如,为特定的外设(如USB、SDIO)提供特定频率的时钟。

分频器设置

分频器的配置通常通过时钟控制寄存器来完成。
分频因子通常是2的幂,例如,1、2、4、8等,具体取决于微控制器的型号。

示例配置

以下是一个STM32时钟配置的简化示例:

  1. HSE(外部晶振)作为时钟源,频率为8 MHz
  2. PLL配置:
    预分频器(PREDIV)设置为1,因此VCO的输入频率为8 MHz。
    倍频因子(M)设置为9,因此VCO的输出频率为72 MHz。
    系统时钟分频器(N)设置为1,因此PLL的输出频率(即系统时钟(SYSCLK))为72 MHz。
    AHB分频器设置为1,因此HCLK也为72 MHz。
    APB1分频器设置为2,因此PCLK1(APB1时钟)为36 MHz。
    APB2分频器设置为1,因此PCLK2(APB2时钟)为72 MHz。
    这样的配置可以
    确保CPU和各个外设以适当的频率运行
    ,以满足应用需求。需要注意的是,具体的
    寄存器配置和可用的分频因子
    会根据不同的
    STM32系列和型号
    有所不同。

总结

以上就是今天要讲的内容,本文仅仅简单介绍了STM32的HAL库、内外部时钟、微控制器主频、锁相环PPL、分频器相关知识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/12145.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【前端】ES6模块化

文章目录 1. 模块化概述1.1 什么是模块化?1.2 为什么需要模块化? 2. 有哪些模块化规范3. CommonJs3.1 导出数据3.2 导入数据3.3 扩展理解3.4 在浏览器端运行 4.ES6模块化4.1 浏览器运行4.2 在node服务端运行4.3 导出4.3.1 分别导出4.3.2 统一导出4.3.3 默认导出4.3.4 混用 4.…

强化学习笔记(5)——PPO

PPO视频课程来源 首先理解采样期望的转换 变量x在p(x)分布下,函数f(x)的期望 等于f(x)乘以对应出现概率p(x)的累加 经过转换后变成 x在q(x)分布下,f(x)*p(x)/q(x) 的期望。 起因是:求最大化回报的期望,所以对ceta求梯度 具体举例…

20-30 五子棋游戏

20-分析五子棋的实现思路_哔哩哔哩_bilibili20-分析五子棋的实现思路是一次性学会 Canvas 动画绘图(核心精讲50个案例)2023最新教程的第21集视频,该合集共计53集,视频收藏或关注UP主,及时了解更多相关视频内容。https:…

【HTML入门】Sublime Text 4与 Phpstorm

文章目录 前言一、环境基础1.Sublime Text 42.Phpstorm(1)安装(2)启动Phpstorm(3)“启动”码 二、HTML1.HTML简介(1)什么是HTML(2)HTML版本及历史(3)HTML基本结构 2.HTML简单语法(1)HTML标签语法(2)HTML常用标签(3)表格(4)特殊字符 总结 前言 在当今的软件开发领域&#xff0c…

Kubernetes学习之包管理工具(Helm)

一、基础知识 1.如果我们需要开发微服务架构的应用,组成应用的服务可能很多,使用原始的组织和管理方式就会非常臃肿和繁琐以及较难管理,此时我们需要一个更高层次的工具将这些配置组织起来。 2.helm架构: chart:一个应用的信息集合…

Kamailio 不通过 dmq 实现注册复制功能

春节期间找到一篇文章,需要 fg 才能看到: https://medium.com/tumalevich/kamailio-registration-replication-without-dmq-65e225f9a8a7 kamailio1 192.168.56.115 kamailio2 192.168.56.116 kamailio3 192.168.56.117 route[HANDLE_REPLICATION] {i…

grpc 和 http 的区别---二进制vsJSON编码

gRPC 和 HTTP 是两种广泛使用的通信协议,各自适用于不同的场景。以下是它们的详细对比与优势分析: 一、核心特性对比 特性gRPCHTTP协议基础基于 HTTP/2基于 HTTP/1.1 或 HTTP/2数据格式默认使用 Protobuf(二进制)通常使用 JSON/…

Intel 与 Yocto 项目的深度融合:全面解析与平台对比

在嵌入式 Linux 领域,Yocto 项目已成为构建定制化 Linux 发行版的事实标准,广泛应用于不同架构的 SoC 平台。Intel 作为 x86 架构的领导者,在 Yocto 生态中投入了大量资源,为其嵌入式处理器、FPGA 和 AI 加速硬件提供了完整的支持…

kubernetes(二)

文章目录 NamespacePodLabelDeploymentService Namespace 在Kubernetes系统中,Namespace是一种至关重要的资源类型,其主要功能在于实现多套环境的资源隔离或者多租户的资源隔离,默认情况下所有的Pod都能够相互访问,但如果不想让两…

巧妙利用数据结构优化部门查询

目录 一、出现的问题 部门树接口超时 二、问题分析 源代码分析 三、解决方案 具体实现思路 四、优化的效果 一、出现的问题 部门树接口超时 无论是在A项目还是在B项目中,都存在类似的页面,其实就是一个部门列表或者叫组织列表。 从页面的展示形式…

【数据分析】案例04:豆瓣电影Top250的数据分析与Web网页可视化(numpy+pandas+matplotlib+flask)

豆瓣电影Top250的数据分析与Web网页可视化(numpy+pandas+matplotlib+flask) 豆瓣电影Top250官网:https://movie.douban.com/top250写在前面 实验目的:实现豆瓣电影Top250详情的数据分析与Web网页可视化。电脑系统:Windows使用软件:PyCharm、NavicatPython版本:Python 3.…

【线程】基于环形队列的生产者消费者模型

1 环形队列 环形队列采用数组来模拟,用取模运算来模拟环状特性。 1.如何判断环形队列为空或者为满? 当环形队列为空时,头和尾都指向同一个位置。当环形队列为满时,头和尾也都指向同一个位置。 因此, 可以通过加计数器或者标记…

Vue指令v-html

目录 一、Vue中的v-html指令是什么?二、v-html指令与v-text指令的区别? 一、Vue中的v-html指令是什么? v-html指令的作用是:设置元素的innerHTML,内容中有html结构会被解析为标签。 二、v-html指令与v-text指令的区别…

OPENGLPG第九版学习 - 着色器基础

文章目录 2.1 着色器与OpenGL2.2 0penGL的可编程管线2.3 OpenGL着色语言GLSL概述2.3.1 使用GLSL构建着色器变量的声明变量的作用域变量的初始化构造函数 、 类型转换聚合类型访问向量和矩阵中的元素结构体数组多维数组 2.3.2 存储限制符const 存储限制符in 存储限制符out 存储限…

路径规划之启发式算法之二十九:鸽群算法(Pigeon-inspired Optimization, PIO)

鸽群算法(Pigeon-inspired Optimization, PIO)是一种基于自然界中鸽子群体行为的智能优化算法,由Duan等人于2014年提出。该算法模拟了鸽子在飞行过程中利用地标、太阳和磁场等导航机制的行为,具有简单、高效和易于实现的特点,适用于解决连续优化问题。 更多的仿生群体算法…

Docker Compose的使用

文章首发于我的博客:https://blog.liuzijian.com/post/docker-compose.html 目录 Docker Compose是什么Docker Compose安装Docker Compose文件Docker Compose常用命令案例:部署WordPress博客系统 Docker Compose是什么 Docker Compose是Docker官方的开源…

AP单类平均准确率

P_true N_true P_pred TP Fp N_pred FN TNP NTP(真正样本,与真实框IoU大于阈值的框) FP(假正样本,与真实框IoU小于阈值的框) TN(真负样本,背景)…

Leetcode—1427. 字符串的左右移【简单】Plus

2025每日刷题&#xff08;206&#xff09; Leetcode—1427. 字符串的左右移 实现代码 class Solution { public:string stringShift(string s, vector<vector<int>>& shift) {// shift[i] [dir, amount]// dir 0(左) or 1(右)// 左表示正, 右表示负int len…

机器学习10

自定义数据集 使用scikit-learn中svm的包实现svm分类 代码 import numpy as np import matplotlib.pyplot as pltclass1_points np.array([[1.9, 1.2],[1.5, 2.1],[1.9, 0.5],[1.5, 0.9],[0.9, 1.2],[1.1, 1.7],[1.4, 1.1]])class2_points np.array([[3.2, 3.2],[3.7, 2.9],…

股票入门知识

股票入门&#xff08;更适合中国宝宝体制&#xff09; 股市基础知识 本文介绍了股票的基础知识&#xff0c;股票的分类&#xff0c;各板块发行上市条件&#xff0c;股票代码&#xff0c;交易时间&#xff0c;交易规则&#xff0c;炒股术语&#xff0c;影响股价的因素&#xf…