初学STM32系统时钟设置

news2025/7/18 23:16:15

  资料来自正点原子

         在学习江科大教程示例的时候默认系统时钟是72MHZ,但是这个系统时钟是怎么过来的呢,通过时钟树以及相关的资料的学习可知,系统时钟它可以是内部RC时钟HSI 8MHZ通过锁相环倍频而来,也可以是外部晶振4-16MHZ通过锁相环倍频而来。但是我们在写程序的过程中好像并没有配置过程。

    通过deepseek得知:

  • STM32 芯片上电后,首先执行启动文件(如startup_stm32f10x.s),该文件会调用 SystemInit() 函数。
  • SystemInit() 是标准库(如 STM32F10x Standard Peripheral Library)提供的函数,其默认配置会将外部 8MHz 晶振通过 PLL 倍频到 72MHz。

但如果我们不想用外部时钟做为系统时钟的来源,而是内部时钟作为系统时钟该怎么设置呢?比如用内部时钟8MHZ设置输出36MHZ的系统时钟

配置函数

#include "stm32f10x.h"
#include "stm32f10x_rcc.h"

void SetSysClockToHSI_36MHz(void) {
   
    
    // 1. 将 RCC 配置复位到默认状态
    RCC_DeInit();
    
    // 2. 使能 HSI(内部 8MHz 时钟)
    RCC_HSICmd(ENABLE);
    
    // 3. 等待 HSI 稳定
    while (RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
    
    // 4. 配置 PLL:HSI/2 = 4MHz -> PLL倍频9倍 -> 36MHz
    RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_9);
    
    // 5. 使能 PLL
    RCC_PLLCmd(ENABLE);
    
    // 6. 等待 PLL 就绪
    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
    
    // 7. 配置总线分频系数(可选)
    RCC_HCLKConfig(RCC_SYSCLK_Div1);    // AHB 时钟 = 36MHz
    RCC_PCLK1Config(RCC_HCLK_Div2);    // APB1时钟 = 18MHz(最大36MHz)
    RCC_PCLK2Config(RCC_HCLK_Div1);     // APB2时钟 = 36MHz
    
    // 8. 切换系统时钟到 PLL
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    
    // 9. 等待系统时钟切换成功
    while (RCC_GetSYSCLKSource() != 0x08); // 0x08表示PLL作为系统时钟
}

//int main(void) {
//    // 调用自定义时钟配置函数
//    SetSysClockToHSI_36MHz();
//    
//    // 后续初始化代码(开启外设时钟、GPIO初始化等)
//    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//    // ... 其他初始化代码
//    
//    while(1) {
//        // 主循环代码
//    }
//}

该配置能设置为内部时钟倍频后得到的36MHZ的系统时钟。

内部时钟设置

  •   HSI(内部高速时钟信号) 的 PLL (锁相环)输入限制

STM32F10x 系列中,当选择 HSI 作为 PLL 时钟源 时,必须对 HSI 进行 2 分频(即 HSI/2 = 4MHz)。可以通过库函数发现没有其它选项
PLL 的倍频系数范围为 2~16 倍,因此最高输出频率:无法通过 HSI 达到 72MHz。最大是64MHZ,因此如果想达到72MHZ必须要使用外部时钟源。

  • APB1最大能达到的速度是36MHZ,因此当系统时钟的速度大于36MHZ的时候,APB1的时钟都需要分频设置一下。
  • 为什么都设置为72MHZ作为内部系统时钟呢,全速USB的系统时钟需要48MHZ,72MHZ通过1.5倍分频后刚好是48MHZ。
  • 为什么不常用内部时钟做系统时钟呢?因为内部时钟温漂大,它的震动频率会随着温度变化幅度大。


以外部晶振作为系统时钟如果不想设置为72MHZ,那么该怎么配置这个函数呢?

#include "stm32f10x.h"
#include "stm32f10x_rcc.h"

void SetSysClockToHSE_72MHz(void) {
    // 复位RCC配置
    RCC_DeInit();
    
    // 使能HSE
    RCC_HSEConfig(RCC_HSE_ON);
    while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);

    // 配置PLL:HSE=8MHz → 倍频9 → 72MHz
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
    RCC_PLLCmd(ENABLE);
    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

    // 配置总线分频
    RCC_HCLKConfig(RCC_SYSCLK_Div1);    // AHB = 72MHz
    RCC_PCLK1Config(RCC_HCLK_Div2);     // APB1 = 36MHz(最大36MHz)
    RCC_PCLK2Config(RCC_HCLK_Div1);     // APB2 = 72MHz

    // 切换系统时钟到PLL
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    while (RCC_GetSYSCLKSource() != 0x08);
}

int main(void) {
    SetSysClockToHSE_72MHz();
    // 后续初始化代码...
}

该函数要放在主函数最前面。可以通过修改参数调整系统时钟比如:

 // 配置PLL:HSE=8/2MHz → 倍频9 → 36MHz
    RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_9);

如此就修改了默认系统时钟为36MHZ


      在学习TIM2的时候发现它是APB1总线上的设备,但是APB1的总线频率是36MHZ,为什么在设置TIM2的时钟频率的时候还是72MHZ呢,这是因为APB1上的定时器时钟又被硬件自动倍频了。使得APB1上的定时器时钟能够允许在较快时钟频率下工作。但是APB1上的其它外设还是在36MHZ的频率下工作。

看图:

关键区别总结

特性APB1 Peripheral Clock (PCLK1)APB1 Time Clock(定时器时钟)
作用对象APB1总线上所有外设的寄存器访问仅APB1总线上的定时器模块
频率决定因素直接由HCLK和APB1预分频系数决定由PCLK1决定,可能自动倍频(×2)
典型场景低速外设通信(如I2C、UART)定时器高精度操作(如PWM、输入捕获)
配置影响修改APB1分频系数直接影响PCLK1频率修改APB1分频系数可能触发定时器时钟倍频

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在 Windows 10 上安装 PyGame

PyGame 是 Python 编程语言中的一组跨平台模块,这意味着您可以在任何操作系统上安装它,这篇文章告诉您如何在 Windows 10 上安装 PyGame。 如何在 Windows 10 上安装 PyGame? PyGame 依赖于 Python,这意味着您必须在安装 PyGame …

STM32 × CLion 新建项目

STM32 CLion 新建项目 新建和配置一个 STM32 项目 1 创建项目 假如是 ST 官方开发板,比如 NUCLEO 板,选择从 ST 板创建 假如是单芯片或淘宝买的那种 F103 开发板,选择从 MCU 创建 2 STM CubeMX 配置 2.1 Pinout & Configuration 外…

WebSocket 详解:构建一个复杂的实时聊天应用

文章目录 一、前言二、WebSocket 基础2.1 WebSocket 与 HTTP 的区别2.2 WebSocket 的优点 三、搭建 WebSocket 服务端3.1 安装 ws 和 redis 库3.2 创建 WebSocket 服务端3.3 创建用户身份验证 四、前端实现 WebSocket 客户端4.1 创建 Vue 3 项目4.2 实现 WebSocket 连接和用户注…

python爬虫:小程序逆向实战教程

根据我之前发表的文章,我们进行延伸实战https://blog.csdn.net/weixin_64809364/article/details/146981598?spm1001.2014.3001.5501 1. 想要爬取什么小程序,我们进行搜索 2. 找到我们vx小程序的文件地址,我们就可以进行破解 破解步骤强看…

day 8 TIM定时器

一、STM32 定时器概述 1. 定时器的概述定时器的基本功能,但是 STM32 的定时器除了具有定时功能之外,也具有定时器中断功能,还具有输入捕获(检测外部信号)以及输出比较功能(输出不同的脉冲)&…

全星 研发项目管理APQP 软件:驱动汽车及制造业研发升级的数字化引擎

全星 APQP 软件:驱动汽车及制造业研发升级的数字化引擎 在汽车及制造业竞争白热化的当下,如何高效推进研发项目,同时确保严格合规,成为企业亟待解决的难题。 全星研发项目管理 APQP 软件系统,凭借卓越的功能与显著优势…

【VUE】RuoYi-Vue3项目结构的分析

【VUE】RuoYi-Vue3项目结构的分析 1. 项目地址2. RuoYi-Vue3项目结构2.1 整体结构2.2 package.json2.2.1 🧾 基本信息2.2.2 🔧 脚本命令(scripts)2.2.3 🌍 仓库信息2.2.4 📦 项目依赖(dependenc…

智能体和RPA都需要程序思维,如何使用影刀的变量?

欢迎来到涛涛聊AI, 不管AI还是RPA,都需要用到编程思想才能完成批量工作。今天研究了下影刀的变量。 变量类型 根据变量值选择相应的类型,可选择任意一种影刀所支持的数据类型 变量值 指定变量中保存的值,会根据不同的类型设置…

论文笔记(七十五)Auto-Encoding Variational Bayes

Auto-Encoding Variational Bayes 文章概括摘要1 引言2 方法2.1 问题场景2.2 变分下界2.3 SGVB估计器与AEVB算法2.4 重参数化技巧 3 示例:变分自编码器(Variational Auto-Encoder)4 相关工作5 实验6 结论7 未来工作 文章概括 引用&#xff1…

Sentinel[超详细讲解]-7 -之 -熔断降级[异常比例阈值]

📖 主要讲解熔断降级之 --- 异常比例阈值 🚀 1️⃣ 背景 Sentinel 以流量作为切入点,提供了很多的丰富的功能,例如🤗: 流量控制,熔断降级等,它能够有效的适用各个复杂的业务场景&am…

C++11观察者模式示例

该示例代码采用C11标准&#xff0c;解决以下问题&#xff1a; 消除了类继承的强耦合方式&#xff1b;通知接口使用可变参数模板&#xff0c;支持任意参数&#xff1b; 示例代码 .h文件如下&#xff1a; #include <functional> #include <string> #include <…

win10 笔记本电脑安装 pytorch+cuda+gpu 大模型开发环境过程记录

win10 笔记本电脑安装 pytorchcudagpu 大模型开发环境过程记录 文章部分内容参考 deepseek。 以下使用命令行工具 mingw64。 安装 Anaconda 安装位置&#xff1a; /c/DEVPACK/Anaconda3 然后安装 Python 3.10.16 &#xff08;略&#xff09; $ conda create -n pytorch_…

Layout Inspector平替跨平台布局分析器のAppium Inspector

引言 因为我有一个api为26的设备&#xff0c;因为 Layout Inspector 无法在 API 26 以下设备上使用&#xff0c;并且现在AS的 Hierarchy Viewer 和Android Device Monitor 均已经在SDK中剔除&#xff0c;故想再搜一个pc版的布局查看器&#xff0c;发现Appium Inspector学习成本…

常见NLP指标PPL,F1,Rouge-L,Accuracy (CLS),Accuracy (EM)总结

常见NLP指标PPL&#xff0c;F1&#xff0c;Rouge-L总结 1.PPL 2.F1 3.Rouge-L 4.Accuracy (CLS) 5.Accuracy (EM)

Redis数据结构之ZSet

目录 1.概述2.常见操作2.1 ZADD2.2 ZRANGE2.3 ZREVRANGE2.4 ZRANGEBYSCORE2.5 ZSCORE2.6 ZCARD2.6 ZREM2.7 ZINCRBY2.8 ZCOUNT2.9 ZMPOP2.10 ZRANK2.11 ZREVRANK 3.总结 1.概述 ZSet和Set一样也是String类型元素的集合&#xff0c;且不允许重复的成员&#xff0c;不同的是ZSet…

磁盘分析工具合集:告别C盘焦虑!

今天李师傅带大家盘点五款硬盘空间分析利器&#xff0c;帮你精准定位那些"吃空间"的元凶&#xff0c;让C盘告别臃肿烦恼&#xff01; 一、WizTree 这款NTFS磁盘的"透视眼"堪称效率典范。它通过直接读取硬盘主文件表(MFT)实现秒级扫描&#xff0c;1TB机械…

20250405在荣品的PRO-RK3566开发板使用Rockchip原厂的buildroot系统来适配gmac1

【暂时还没有解决让PRO-RK3566的eth0/gmac1开机就启动】 PRO-RK3566作为iperf服务器&#xff1a; rootrk3566-buildroot:/# ifconfig rootrk3566-buildroot:/# ifconfig -a rootrk3566-buildroot:/# ifconfig eth0 up rootrk3566-buildroot:/# ifconfig rootrk3566-buildroot:/…

每日一题(小白)模拟娱乐篇14

直接理解题意&#xff0c;一分钟扩散一次&#xff0c;那么2020分钟也就是需要循环2020次&#xff0c;然后加入扩散后的条件&#xff0c;每一个次扩散使方格子的总量1&#xff08;只要有一个点扩散就无需看其他的点&#xff09;&#xff0c;若干次循环过后总数之和即所有黑色格子…

使用 Python 爬取并打印双色球近期 5 场开奖数据

使用 Python 爬取并打印双色球近期 5 场开奖数据 前期准备安装所需库 完整代码代码解析 1. 导入必要的库2. 定义函数 get_recent_five_ssq 3. 设置请求的 URL 和 Headers 4. 发送请求并处理响应5. 解析 HTML 内容6. 提取并打印数据7. 错误处理 首先看下运行的效果图&#xff1a…

再见VS Code!Google IDE 正颠覆传统开发体验

云端开发的革命&#xff1a;Google Project IDX 如何颠覆传统开发体验 在软件开发领域&#xff0c;Google 最新推出的 Project IDX 绝非仅仅是另一个“基于浏览器的 VS Code”——它是一次真正的范式转变。与 VS Code、Cursor 等传统工具不同&#xff0c;IDX 是一个完全云原生的…