news 2026/3/17 19:33:53

8.2 时钟树编程-嵌入式铁头山羊STM32笔记

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
8.2 时钟树编程-嵌入式铁头山羊STM32笔记

目录

本节主要学习了解时钟树的配置和部分模块的时钟开启操作。

1.时钟树的初始状态

https://www.bilibili.com/video/BV11X4y1j7si?t=34.2&p=39

时钟树的初始状态:即时钟树在单片机上电或者复位后的状态。

SYSCLK:系统时钟,有三种来源。初始状态来源为 HSI(单片机内部高速时钟,8MHZ)

具体初始状态:

HSI=SYSCLK=HCLK=PCLK1=PCLK2=8MHZ,分频器都为 1.

验证初始状态:

Cortex-M3:内核,时钟来源为 HCLK,这个决定了代码的执行速度。

所以可以写一个延时闪灯函数 for 循环,观察时间的变化来判断时钟的速度快慢。

for 公式: 0.5 秒/((1/8MHZ)* 10(假设周期)),得到延时 500ms(0.5s) 需要执行的 for 循环次数= 40W 次

上图为 LED 初始化代码

LED:PC13,开漏输出(open drain)

编译下载后发现,闪灯速度很快。按理说是 500ms 翻转一下,1HZ 的频率,为什么看起来更快很多?

带着疑问往后学习:

2.标准库的启动代码

https://www.bilibili.com/video/BV11X4y1j7si?t=468.4&p=39

上图为启动代码.s 位置

这里面:

__Vectors:中断向量表

Reset_Handler:单片机从此处开始执行的

这个Reset_Handler,

先执行 SystemInit(时钟频率初始化),自动将时钟树配置成 72MHZ

后执行 main(用户在 main 中编写自己的代码)

上图为SystemInit时钟树配置成 72MHZ 的操作。

HSE 直接锁相环 9 倍频,时钟统一配置为 72MHZ,所以闪灯明显加快。

注释掉SystemInit,不让时钟配置为最高的 72MHZ。

然后编译下载,发现灯闪烁变慢了点,但是也没有达到想要的 500ms 一次,为什么?

每个For循环消耗10个时钟周期,这个 for 循环消耗的周期数是个不确定的值,只是这里取了 10

在当前的时钟树(上图)配置下,每一个 for 消耗大约 6 个周期,所以 40w 的 i 循环改为 66w,就可以实现严格的 500ms 延迟了。编译下载后,基本 1s 闪灯一次

3.时钟树的编程接口

https://www.bilibili.com/video/BV11X4y1j7si?t=762.5&p=39

10 个编程接口啊,莫慌。

上图左右基本配对,而且基本用不到哈哈

RCC_ 开头:Reset And Clock Controller ,控制复位,和时钟树。

上图右边颜色解释:

带颜色:表示可开关。

底色为灰色:默认关闭

底色为绿色:默认开启

API 函数解析:

RCC_HSE_Config:高速外部时钟开关(HSE 默认关闭)

RCC_PLL_Config:phase lock loop,锁相环配置,俩参数,输入源和分频。

其他的大同小异,看图理解即可。

RCC_GetFlagStatus:获取 RCC 状态。时钟配置需要消耗一定时间,和串口发送完成标志等类似。

4.配置时钟树

https://www.bilibili.com/video/BV11X4y1j7si?t=1217.1&p=39

屏蔽掉 SystemInit,直接 main 执行,SYSCLK=PCLK2=PCLK1=HCLK=8MHZ

如何写代码,从上图左边的树变成右边的树?

四步(上图左):

1.配置 HSE

2.配置锁相环

3.配置三个分频器

4.配置 SYSCLK 来源

自定义封装函数:App_SystemClock_init

步骤 1:开启 HSE

步骤 2:配置锁相环

选择 HSE,9 倍频。上图中下面部分为具体配置代码

步骤 3:配置三个分频系数(AHB、APB1、APB2)

步骤四:切换系统时钟来源。

把默认的 HSI,更换成我们走 HSE 和锁相环的路径。

来源切换需要消耗一定时间,所以要用到 RCC_GetSYSCLKSource,判断是否切换完成。

上图为整个系统时钟配置代码具体实现

5.配置Flash指令预取

https://www.bilibili.com/video/BV11X4y1j7si?t=1893.1&p=39

配置完时钟树后并没有结束,我们还要配置 flash 的指令预取和访问延迟

上图为单片机内部一个结构框图。

Flash 相当于硬盘,当单片机运行的时候,Cortex-M3 内核会从 flash 中一条条读代码,然后在 CPU 中执行。

但是 flash 读取的速度远远赶不上内核程序执行的速度,所以实际运行 flash 会拖后腿。

为了解决这个问题,加入了缓冲区机制,这种机制叫指令预取。

在 Reset_Handler 的 SystemInit 中其实已经开启了指令预取,但是我们做实验嘛,把这个SystemInit 用“;”注释掉了。所以如何手动开启?

用到以下 API:FLASH_PrefetchBufferCmd

指令预取开启要求 SYSCLK 小于等于 8MHZ,所以放在上图代码地方。

配置访问延迟,flash 接口访问速度不能大于 24MHZ。72MHZ 时候,需要等待两个周期。

编译下载,发现闪灯加快,说明时钟配置成功(手动把 SYSCLK 从 8MHZ 配置成 72MHZ)

6.片上外设开关和复位

https://www.bilibili.com/video/BV11X4y1j7si?t=2139.8&p=39

通过时钟树,对片上外设开关和复位。

树上有很多树叶,可以通过函数开关这些树叶(片上外设)的时钟。

上图为开启外设示例(IO 口,串口)

按下和抬起复位信号, IIC1 模块就被复位了。

总结

屏蔽掉 SystemInit,学了下时钟树的配置方法(开 HSE,配锁相环,配三个分频系数,配 SYSCLK 源)和 flash 的配置方法(执行预取,访问延迟)

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

LangFlow AWS CloudWatch集成配置

LangFlow 与 AWS CloudWatch 集成:构建可观察的低代码 AI 工作流 在生成式 AI 应用快速落地的今天,一个常见的困境浮出水面:开发者能用 LangChain 写出强大的 LLM 流程,但一旦部署到生产环境,调试就成了“盲人摸象”—…

作者头像 李华
网站建设 2026/3/15 15:48:19

手把手教程:利用树莓派插针定义构建工业开关系统

用树莓派做工业开关?别被“消费级”标签骗了,这样设计才真可靠! 你有没有遇到过这样的场景:想做个自动化小项目,比如远程控制车间的照明、定时启停水泵,甚至搭建一个简易产线联动系统。一查方案&#xff0c…

作者头像 李华
网站建设 2026/3/15 15:48:35

5、存储技术升级:从 Windows Server 2012 到 2012 R2

存储技术升级:从 Windows Server 2012 到 2012 R2 在当今数字化时代,数据存储对于企业的运营和发展至关重要。随着数据量的不断增长,企业需要高效、灵活且经济实惠的存储解决方案。从 Windows Server 2012 到 2012 R2,存储技术经历了显著的升级,为企业提供了更强大的存储…

作者头像 李华
网站建设 2026/3/15 9:48:44

通俗解释有源蜂鸣器为何接通即响的原理

为什么一通电就“嘀”一声?揭秘有源蜂鸣器的自动发声之谜你有没有注意过,家里的微波炉“叮”的一声响,洗衣机完成洗衣后“嘀——”长鸣一下,或者电梯到达楼层时发出清脆的提示音?这些声音背后,很可能藏着一…

作者头像 李华
网站建设 2026/3/15 15:47:31

LangFlow Splunk企业级日志分析

LangFlow Splunk企业级日志分析 在现代企业的IT运维体系中,每天产生的日志数据量动辄以TB计——从应用错误堆栈、API调用记录到安全审计事件,这些信息本应是故障排查与系统优化的“金矿”,但现实中却常常沦为难以挖掘的“数据垃圾”。传统工具…

作者头像 李华
网站建设 2026/3/15 9:48:51

LangFlow Tenable Nessus定期安全扫描

LangFlow 与 Tenable Nessus:构建高效且安全的 AI 开发闭环 在当今企业加速拥抱人工智能的大趋势下,一个现实矛盾日益凸显:AI 创新的速度越来越快,但系统的复杂性和潜在的安全风险也随之攀升。尤其是在部署基于大语言模型&#xf…

作者头像 李华