STM32入门学习之系统时钟配置
1. 时钟就是单片机的心脏。单片机根据时钟频率来控制每个部件的工作,时钟是单片机的脉搏,决定了每条命令运行的速率,没有时钟单片机将停止工作。
如何理解“时钟决定了单片机每条命令运行的速率”?
首先需要去理解单片机中的时钟周期、机器周期和指令周期。
1.1 时钟周期:单片机的基本时间单位,是CPU执行基本操作的最小时间单位。每个时钟周期内,单片 机完成一个基本动作,时钟周期决定了单片机的运行速度。
时钟周期由晶振频率所决定,比如8MHz的MCU,其对应的时钟周期为(1/(8MHz))= 125ns。
1.2 机器周期(CPU周期):在单片机中,将一条指令的执行过程分为不同的阶段,每个阶段只完成一项基本操作,比如取指令、存储器读、存储器写等。
每一个基本操作都有若干CPU最基本动作所组成。完成一个基本操作所需要的时间即为机器周期,通常将从内存中读取一个指令字的最短时间定义为CPU周期。
1.3 指令周期:单片机执行一条指令所消耗的时间,即从取指(Fetch)、译码(Decode)、执行(Execute)所需要的全部时间。一个指令周期包含若干机器周期。
(图片参考于)
2. STM32的时钟系统:
提到STM32时钟系统,不得不拿出祖传的时间系统框图:
如上图,STM32的系统时钟可以来自3个方向HSI振荡器时钟、HSE振荡器时钟、PLL时钟。
本文主要介绍STM32的系统时钟,关于看门狗时钟、USB时钟、RTC时钟暂不介绍,感兴趣的可以对照此框图自行配置(当理解系统时钟后,其他时钟的配置也大同小异)。
STM32有3个时钟总线:AHB(Advanced High-performance Bus Clock)、APB1(Advanced Peripheral Bus 1 Clock)、APB2(Advanced Peripheral Bus 2 Clock)。单片机所有的片上外设都挂载在这3个时钟总线上。
AHB时钟总线:连接处理器核心(如Cortex-M3)、高速外设(核心存储器、DMA、SDIO、FSMC)等,通常由系统时钟经过AHB分频器得到。
APB1时钟总线:连接低俗外设(如TIM2~7,WWDG、SPI、USART2~5、I2C1~2、CAN1、DAC等),由AHB时钟经过APB1分频器得到。
APB2时钟总线:连接高速外设(如TIM1、TIM8、AFIO、GPIOA~G、ADC1~3、USART1、SPI1)等,通常由AHB时钟经过APB2分频器得到。
STM32系统时钟的配置过程即为:选择系统时钟源(HSI、HSE、PLL)、设置系统时钟(分频器)、设置AHB时钟、设置APB1时钟、设置APB2时钟。看门狗时钟、USB时钟、RTC时钟的配置过程类似系统时钟配置过程,具体的可根据时钟框图进行配置。
PLL锁相环可以理解为倍频器,比如8MHz,2倍频后便是16MHz。
分频器是降低频率,比如72MHz,2分频后便是36MHz。
3. STM32系统时钟具体配置过程:
通常是在启动文件中调用 SystemInit()配置系统时钟,一般这个函数已经写好了的,用户只需要配置不同的宏定义便可以改变系统时钟频率。
用户也可以自己去操作这些寄存器,更详细的配置所需时钟频率。如果是自行操作寄存器配置时钟,则必须在main初始化其他外设之前就配置好自己的时钟。
假设现在使用STM32外部晶振频率为8MHz,需要配置系统系统来源为PLL,频率为40MHz,则重新配置时钟的过程为:
① 开启内部时钟(因为现在需要配置的时钟为外部时钟,所有在此过程中先切换为内部时钟,避免单片机没有时钟而无法工作)
② 复位之前的时钟配置(避免之前的配置影响后面配置)
③ 禁止、清除中断(时钟配置过程中不允许有中断)
④ 开启外部时钟
⑤ 配置系统时钟、AHB时钟、APB1和APB2时钟
⑥ 配置PLL锁相环
⑦ 设置PLL为系统时钟源
4.主要代码如下:
#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
#include "pwm.h"/*ÅäÖÃϵͳʱÖÓ£º*/
void SystemClock_Init()
{// RCC_DeInit();RCC->CR |= (1 << 0); //¿ªÆôÄÚ²¿Ê±ÖÓ/*Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits*/RCC->CFGR &= (uint32_t)0xF8FF0000;RCC->CR &= (uint32_t)0xFEF6FFFF; //¹Ø±ÕÍⲿ¸ßËÙʱÖÓ¡¢¹Ø±ÕʱÖÓ¼ì²â¡¢¹Ø±ÕPLLËøÏà»·RCC->CR &= ~(1 << 18); //ÉèÖÃÍⲿ¾§Õñ²»ÅÔ·£¬¼´ÍⲿʱÖÓÐèÒª¾¹ýÕñµ´Æ÷/* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */RCC->CFGR &= (uint32_t)0xFF80FFFF; RCC->CIR &= 0x009F0000; //½ûÖ¹ºÍÇå³ýÖжÏRCC->CR |= (1 << 16); //¿ªÆôÍⲿʱÖÓwhile ((RCC->CR & (1 << 17)) == 0); //µÈ´ýʱÖÓ¾ÍÐ÷RCC->APB1ENR |= (1 << 28); //µçÔ´½Ó¿ÚʱÖÓʹÄÜ£¬Ï൱ÓÚ¿ªÆôAPB1ʱÖÓRCC->CFGR |= (0 << 17);RCC->CFGR |= ((0 << 4) | (5 << 8) | (4 << 11)); //ÅäÖÃϵͳʱÖÓ¡¢APB1¡¢APB2ʱÖÓRCC->CFGR |= (1 << 16); //ÅäÖÃÍⲿ¸ßËÙʱÖÓHSEΪPLLʱÖÓÔ´
// RCC->CFGR |= 0x07 << 18; //PLLµÄ±¶ÆµÊýΪ9RCC->CFGR |= 0x03 << 18; //PLLµÄ±¶ÆµÊýΪ2RCC->CR |= (1 << 24); //ʹÄÜPLLwhile ((RCC->CR & (1 << 25)) == 0); //µÈ´ýPLL¾ÍÐ÷RCC->CFGR &= ~(3 << 0); //ÇåÁãRCC->CFGR |= (2 << 0); //ÉèÖÃPLLΪϵͳʱÖÓwhile((RCC->CFGR & (3 << 2)) != (2 << 2)); //µÈ´ýPLL×÷ΪϵͳʱÖÓ¾ÍÐ÷
}void SystemClock_Init2()
{RCC_DeInit();RCC_HSEConfig(RCC_HSE_ON);if(RCC_WaitForHSEStartUp() == SUCCESS){RCC->APB1ENR |= RCC_APB1ENR_PWREN;RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_3);RCC_PLLCmd(ENABLE);while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);while(RCC_GetSYSCLKSource() != 0x08);RCC_HCLKConfig(RCC_SYSCLK_Div1);RCC_PCLK2Config(RCC_HCLK_Div2);RCC_PCLK1Config(RCC_HCLK_Div4);}
}RCC_ClocksTypeDef RCC_Clock_Struct;
int main(void)
{int i;SystemClock_Init();
// SystemClock_Init2();LED_Init();GPIO_ResetBits(GPIOC, GPIO_Pin_0);RCC_GetClocksFreq(&RCC_Clock_Struct);while (1){GPIO_SetBits(GPIOC, GPIO_Pin_0);for (i = 0; i < 9000000; i++);GPIO_ResetBits(GPIOC, GPIO_Pin_0);for (i = 0; i < 9000000; i++);}
}
图片中有注释,复制的代码注释每次都乱码:
为什么这样去配置寄存器,其实是根据寄存器每一位的功能来配置,这个需要去查看STM32F103中文参考手册、数据手册中寄存器说明(寄存器配置其实就是给相应的位置写上不同的功能参数,最终都是通过操作寄存器而去操作外设)。
5.运行结果:
同样的代码,在不同的频率下执行的速率不同。比如在本文的LED点亮循环中,所有配置不变,将系统时钟频率从16MHz,修改至72MHz的过程中,LED的闪灭速度逐步增加。即频率越高,指令执行速度越快。
6.总结:
单片机的时钟是系统心脏,控制着每条指令执行的速度,没有时钟单片机将无法有序工作,产生意想不到的错误。所以在配置系统时钟的过程中,一定要根据单片机所允许的频率和数据手册去进行合理配置。
相关文章:

STM32入门学习之系统时钟配置
1. 时钟就是单片机的心脏。单片机根据时钟频率来控制每个部件的工作,时钟是单片机的脉搏,决定了每条命令运行的速率,没有时钟单片机将停止工作。 如何理解“时钟决定了单片机每条命令运行的速率”? 首先需要去理解单片机中的时…...

【ArcGIS Pro微课1000例】0072:如何自动保存编辑内容及保存工程?
文章目录 一、自动保存编辑内容二、自动保存工程在使用ArcGIS或者ArcGIS Pro时,经常会遇到以下报错,无论点击【发送报告】,还是【不发送】,软件都会强制退出,这时如果对所操作没有保存,就会前功尽弃。 此时,自动保存工作就显得尤为重要,接下来讲解两种常见的自动保存方…...

AU音频软件|Audition 2025网盘下载与安装教程指南
说起AU,有些小伙伴可能第一印象是化学元素金(Aurum)。实际上,本文要介绍的AU,全称是Adobe Audition,是一款专业音频编辑和混音软件,广泛应用于音乐制作、广播、电影及视频声音设计等领域。 目…...

网络编程(TCP编程)
思维导图 1.基础流程 流程图中是TCP连接的基础步骤,其他操作都是在此基础上进行添加修改。 2.函数接口 2.1 创建套接字(socket) int socket(int domain, int type, int protocol); 头文件:#include <sys/types.h> …...
[论文阅读] 人工智能+软件工程 | 结对编程中的知识转移新图景
当AI成为编程搭档:结对编程中的知识转移新图景 论文信息 论文标题:From Developer Pairs to AI Copilots: A Comparative Study on Knowledge Transfer(从开发者结对到AI副驾驶:知识转移的对比研究) 作者及机构&#…...

热成像实例分割电力设备数据集(3类,838张)
在现代电力系统的运维管理中,红外热成像已经成为检测设备隐患、预防故障的重要手段。相比传统可见光图像,红外图像可揭示设备温度分布,从而更直观地反映过热、老化等问题。而在AI赋能下,通过实例分割技术对热成像中的电力设备进行…...

用电脑通过USB总线连接控制keysight示波器
通过USB总线控制示波器的优势 在上篇文章我介绍了如何通过网线远程连接keysight示波器,如果连接的距离不是很远,也可以通过USB线将示波器与电脑连接起来,实现对示波器的控制和截图。 在KEYSIGHT示波器DSOX1204A的后端,除了有网口…...

uni-app学习笔记二十四--showLoading和showModal的用法
showLoading(OBJECT) 显示 loading 提示框, 需主动调用 uni.hideLoading 才能关闭提示框。 OBJECT参数说明 参数类型必填说明平台差异说明titleString是提示的文字内容,显示在loading的下方maskBoolean否是否显示透明蒙层,防止触摸穿透,默…...
基于 React Native for HarmonyOS5 的跨平台组件库开发指南,以及组件示例
基于 React Native for HarmonyOS5 的跨平台组件库开发,需融合分层架构设计、鸿蒙原生能力桥接及性能优化技术,核心指南如下: 一、分层架构设计 采用 模块化分层结构,隔离平台差异逻辑: ├── common_har …...

【Linux】centos软件安装
目录 Linux下安装软件的办法什么是yum使用yum试着安装软件查看yum源配置额外的第三方库 Linux下安装软件的办法 做为一个操作系统,与win和mac一样,安装软件无可厚非。那Linux下安装软件有哪些办法呢?第一种是直接下载源代码本地编译安装&…...

基于Vue3.0的在线工具网站
文章目录 1、初始化项目1.1 创建项目1.2 安装vue路由1.3 安装UI库2、首页搭建2.0 页面布局2.1 页头2.2 侧边栏2.3 内容显示区域3、字符串加密解密功能实现3.1 页面构建3.2 实现加密/解密4、Json工具4.1 Json格式化4.1.1 搭建页面4.1.2 实现Json格式化4.2 Json转XML4.1.1 搭建页…...

STM32H562----------串口通信(UART)
1、串口介绍 1.1、 数据通信概念 在单片机中我们常用的通信方式有 USART、IIC、SPI、CAN、USB 等; 1、数据通信方式 根据数据通信方式可分为串行通信和并行通信两种,如下图: 串行通信基本特征是数据逐位顺序依次传输,优点:传输线少成本低,抗干扰能力强可用于远距离传…...
C++基础进阶:函数、内联函数与Lambda函数详解
引言 在C编程的旅程中,函数是构建复杂程序的基本单元。它们像乐高积木一样,允许我们将代码分解成更小、更易于管理的部分。今天,我们将深入探讨C中的三种重要函数类型:普通函数、内联函数以及Lambda函数。掌握它们,将…...
大话软工笔记—需求调研的准备
需求调研前需做好充分的准备: 1. 背景资料来源 可以通过企业官网、宣传资料、人员沟通获取客户企业信息。 2. 背景资料汇总 根据获得的信息做出一份背景分析报告,主要包含以下内容: 2.1 企业基本信息 企业发展愿景&#…...
如何计算1920*1080分辨率的YUV或RGB图像数据占用大小?
好多开发者在对接大牛直播SDK的时候,经常问到的问题是,1920*1080分辨率的YUV或RGB图像数据,到底多少字节?在音视频图像开发中,19201080(即 Full HD)是一种极其常见的分辨率。但很多开发者在处理…...

webpack其余配置
webpack搭建本地服务器 首先是要安装一个webpack-dev-server npm install webpack-dev-server -D 安装后在package.json中添加: {"name": "babel_core_demo","version": "1.0.0","main": "index.js"…...
ArkUI-X与Android桥接通信之消息通信
平台桥接用于客户端(ArkUI)和平台(Android或iOS)之间传递消息,即用于ArkUI与平台双向数据传递、ArkUI侧调用平台的方法、平台调用ArkUI侧的方法。本文主要介绍Android平台与ArkUI交互,ArkUI侧具体用法请参考…...

【CUDA 】第5章 共享内存和常量内存——5.3减少全局内存访问(2)
CUDA C编程笔记 第五章 共享内存和常量内存5.3 减少全局内存访问5.3.2 使用展开的并行规约思路reduceSmemUnroll4(共享内存)具体代码:运行结果意外发现书上全局加载事务和全局存储事务和ncu中这两个值相同 5.3.3 动态共享内存的并行规约reduc…...

Python 训练营打卡 Day 46
通道注意力 一、什么是注意力 注意力机制是一种让模型学会「选择性关注重要信息」的特征提取器,就像人类视觉会自动忽略背景,聚焦于图片中的主体(如猫、汽车)。 transformer中的叫做自注意力机制,他是一种自己学习自…...
MySQL(56)什么是复合索引?
复合索引(Composite Index),也称为多列索引,是在数据库表的多列上创建的索引。它可以提高涉及多个列的查询性能,通过组合多个列的值来索引数据。复合索引特别适用于需要同时过滤多列的查询。 复合索引的优点 提高多列…...

Rust学习(1)
声明:学习来源于 《Rust 圣经》 变量的绑定和解构 变量绑定 let a "hello world":这个过程称之为变量绑定。绑定就是把这个对象绑定给一个变量,让这个变量成为它的主人。 变量可变性 Rust 变量默认情况下不可变,可以通过 mut …...

鸿蒙仓颉语言开发实战教程:商城应用个人中心页面
又到了高考的日子,幽蓝君在这里祝各位考生朋友冷静答题,超常发挥。 今天要分享的内容是仓颉语言商城应用的个人中心页面,先看效果图: 下面介绍下这个页面的实现过程。 我们可以先分析下整个页面的布局结构。可以看出它是纵向的布…...
vue3 eslint ts 关闭多单词命名检查
无效做法 import { globalIgnores } from eslint/config import {defineConfigWithVueTs,vueTsConfigs, } from vue/eslint-config-typescript import pluginVue from eslint-plugin-vue import skipFormatting from vue/eslint-config-prettier/skip-formatting// To allow m…...
横向对比npm和yarn
🔧 基本概况 维度npmYarn所属Node.js 官方工具(npm, Inc.)Meta(Facebook)主导开发初始发布时间2010 年2016 年(为了解决 npm 的一些痛点而诞生)默认安装Node.js 安装后自带需要手动安装最新版本…...

智能生成完整 Java 后端架构,告别手动编写 ControllerServiceDao
在 Java 后端开发的漫长征途上,开发者们常常深陷繁琐的基础代码编写泥潭。尤其是 Controller、Service、Dao 这三层代码的手动编写,堪称开发效率的 “拦路虎”。从搭建项目骨架到填充业务逻辑,每一个环节都需要开发者投入大量精力,…...

Python----目标检测(yolov5-7.0安装及训练细胞)
一、下载项目代码 yolov5代码源 GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite yolov5-7.0代码源 Release v7.0 - YOLOv5 SOTA Realtime Instance Segmentation ultralytics/yolov5 GitHub 二、创建虚拟环境 创建一个3.8…...
MySQL EXPLAIN 命令详解
文章目录 MySQL EXPLAIN 命令详解EXPLAIN 输出的基本结构id2. select_type3. table4. partitions5. type6. possible_keys7. key8. key_len9. ref10. rows11. filtered12. Extra 使用 EXPLAIN 的注意事项示例 MySQL EXPLAIN 命令详解 EXPLAIN 是 MySQL 中一个非常有用的命令&a…...

【Linux】文件赋权(指定文件所有者、所属组)、挂载光驱(图文教程)
文章目录 文件赋权创建文件 testChmod查看文件的当前权限使用 chmod 命令修改权限验证权限关键命令总结答案汇总 光驱挂载确认文件是否存在打包压缩压缩验证创建 work 目录将压缩文件复制到 work 目录新建挂载点 /MNT/CDROM 并挂载光驱答案汇总 更多相关内容可查看 此篇用以解决…...

第22讲、Odoo18 QWeb 模板引擎详解
Odoo QWeb 模板引擎详解与实战 Odoo 的 QWeb 是其自研的模板引擎,广泛应用于 HTML、XML、PDF 等内容的生成,支撑了前端页面渲染、报表输出、门户页面、邮件模板等多种场景。本文将系统介绍 QWeb 的核心用法、工作原理,并通过实战案例演示如何…...
OpenJudge | 大整数乘法
总时间限制: 1000ms 内存限制: 65536kB 描述 求两个不超过200位的非负整数的积。 输入 有两行,每行是一个不超过200位的非负整数,没有多余的前导0。 输出 一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是342&am…...