news 2026/9/12 18:10:42

STM32学习(五)—— 时钟体系

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32学习(五)—— 时钟体系

一、什么是晶振

晶振的全称叫做晶体振荡器,是晶体(石英)和电子元件组成,晶振有一个非常重要的特性:机电效应(压电效应),一般晶振会提供高度稳定的频率(振荡频率是固定的),一般晶振的频率有8MHZ、12MHZ、25MHZ、11.0592MHZ..... 晶振的单位是HZ频率(单位时间内振荡的次数)。

二、什么是时钟

时钟相当于处理器的”心脏“,外部晶振经过振荡会产生高速稳定的信号,由芯片的引脚输入芯片内部,再经过芯片内部的频率放大器进行放大或者缩小,最终变成各种总线的时钟频率,处理器的外设都是由时钟控制的,举个例子:交响乐团 指挥

思考:时钟信号是由什么产生的?时钟信号是由时钟源产生的,比如外部晶振产生的时钟信号就是时钟源的一种,但是有点外设不需要太高的时钟频率,所以STM32提供了多种时钟源给用户使用。 参考STM32中文参考手册第6章 一共有5种时钟源。

HSE:High Speed External 高速外部时钟,特点是精度高,一般可以作为系统时钟

HSI :High Speed Internal 高度内部时钟,频率为16MHZ的RC振荡器,优点是成本低,缺点是精 度低,容易收温度的影响,适合小家电使用

LSE:Low Speed External 低速外部时钟,频率未32.768KHZ的晶振,可以驱动RTC实时时钟,优点是功耗低,精度高

LSI :Low Speed Internal 低速内部时钟,频率未32KHZ的RC振荡器,可以驱动独立看门狗和低功耗唤醒功能

PLL:倍频锁相环,由HSE或HSI振荡器提供时钟信号,一般可以作为系统时钟使用

三、STM32时钟树

四、PLL参数的修改

大家可以看到标准库中使用的外部晶振是25MHZ,而开发平台实际使用的是8MHZ,所以如果不去修改工程的PLL参数,会导致芯片的运行频率是错误的,所以需要修改PLL参数,可以去system_stm32f4xx.c和stm32f4xx.h两个文件中修改。

—— 修改stm32f4xx.h的123行,把25改为8 修改外部晶振的频率(根据开发板)

—— 修改system_stm32f4xx.c的316行的PLL参数,修改PLL_M的值 把25改为8

需要注意的是,不是所有产品都需要PLL,因为使用PLL会增大功耗,减少产品的续航能力(智能手表、手机锁屏)

项目经验:根据实际的情况来修改PLL的参数,这样就可以降低功耗或者提高性能,一般修改PLL_N的值(192~432),针对高性能模式、平衡模式、低功耗模式(以手机为例)

高性能模式 :如果修改PLL_N的值为432,则主频会达到216MHZ,最高位多少MHZ?

平衡模式 :如果修改PLL_N的值位336,则主频会达到168MHZ

低功耗模式 :如果修改PLL_N的值位192,则主频会降到84MHZ,最低能降到多少MHZ?

注意:如果芯片主频超过168MHZ,就是超频工作,增加芯片功耗以及会导致芯片发烫,谨慎使用。

四、STM32的启动过程

一般大家都知道程序的入口是main函数,但是在主程序运行之前,是需要先运行一个启动文件xxx.s,对于STM32F407ZET6来说,汇编文件为startup_stm32f40_41xxx.s,当然不同的芯片型号所使用的汇编文件是不一样的。

启动文件的功能如下:

1. 配置系统的栈空间

栈是一种特殊的线性表,特殊在用户只能在栈的一端进行操作(栈顶),另一端操作不了,如果没有数据进入栈空间,称为空栈,如果写入数据称为入栈,如果读取数据称为出栈,栈空间的分配是动态分配,是自上向下。

栈空间是由编译器来自动分配和释放的,栈空间一般存储局部变量,存储函数调用过程中的传递的参数、保护现场,对于启动文件中的栈空间,默认是1KB,但是如果大家写的程序比较大,用到的局部变量比较多,就必须修改栈空间的大小。

如果栈空间的大小不修改,会导致栈溢出,让程序出现位置问题(相当于Linux开发中的段错误)。

注意:栈空间可以由用户手动调整,但是不能超过内部SRAM的大小(192KB)

2. 配置系统的堆空间

THUMB 指的是 THUMB 指令集,是 ARM 以前的指令集,THUMB 指令集是 16bit,ARM现在使用的是 THUMB-2 指令集是 32bit的,也就意味着 THUMB-2 指令集包含 THUMB 指令集。
对于堆空间一般是动态分配的,由用户来分配,如Linux系统学习的malloc函数,但是堆空间在 STM32 中使用较少。

3. 配置系统的向量表

向量表指的是中断源表,向量其实就是内核发生的异常的源头,启动文件中的向量表的地址都是从Flash空间的首地址开始,0x00000000存储的是栈顶指针,0x00000004存储的是复位程序地址

向量表可以参考STM32F4中午参考手册的第十章。

4. 复位程序分析

【weak】指的是弱声明,如果外部文件中重新定义了该函数,则优先使用外部文件中的,如果外部文件中没重新定义,则默认使用启动文件中,也就是说该函数不是唯一的。

思考:是否可以改变函数的入口?答案是可以的,可以修改为自己指定的函数接口中

5. 中断服务函数的分析

一旦发生了异常,内核就需要去响应何处理异常,需要跳转到对应的中断服务函数中执行功能,中断复位函数是由用户在外部文件中来重新定义。如果用户开启某个外设的中断,但是没有编写对应的中断服务函数或者中断服务函数名字写错了,就回导致程序一直运行汇编文件中定义的中断服务函数,但是预定义的中断服务函数内部是空的,所以就会跳转到无限循环,导致程序卡死。

注意:用户在使用外设中断(外部中断、定时器中断、串口中断、看门狗中断.......)的时候,中断服务函数的名字必须在汇编文件中查找,不能随意定义。

6. 用户堆栈初始化分析

如果启动MicroLIB库,这个库属于KEIL公司自带的库,会替换标准C库,这个微型库会对代码进行高度优化,所以生产的可执行文件的体积会减小,但是缺点是微型库的功能没有标准C库多。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 18:10:15

TensorRT 安装配置指南:从零跑通高性能 GPU 推理环境

TensorRT 安装配置指南:从零跑通高性能 GPU 推理环境 【免费下载链接】TensorRT NVIDIA TensorRT™ is an SDK for high-performance deep learning inference on NVIDIA GPUs. This repository contains the open source components of TensorRT. 项目地址: http…

作者头像 李华
网站建设 2026/9/12 18:06:44

极致零售:从门店体验到运营效率的系统性优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/12 18:06:15

LLM与Agent技术融合:从原理到多智能体协作实践

1. 项目概述:LLM与Agent技术全景解析 在人工智能领域,大语言模型(LLM)与智能体(Agent)技术的结合正掀起新一轮变革浪潮。这组技术组合不仅重塑了人机交互方式,更在自动化流程、知识管理等领域展…

作者头像 李华
网站建设 2026/9/12 18:05:41

Cataclysm-DDA 建造系统新手指南:从第一面木墙到末日庇护所

Cataclysm-DDA 建造系统新手指南:从第一面木墙到末日庇护所 【免费下载链接】Cataclysm-DDA Cataclysm - Dark Days Ahead. A turn-based survival game set in a post-apocalyptic world. 项目地址: https://gitcode.com/GitHub_Trending/ca/Cataclysm-DDA …

作者头像 李华
网站建设 2026/9/12 18:05:34

牡丹芍药春季养护:抹芽疏蕾技巧与时机把握

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华