惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

腾讯CDC
The Cloudflare Blog
IT之家
IT之家
V
V2EX
雷峰网
雷峰网
MyScale Blog
MyScale Blog
P
Proofpoint News Feed
Stack Overflow Blog
Stack Overflow Blog
博客园 - Franky
Engineering at Meta
Engineering at Meta
S
SegmentFault 最新的问题
GbyAI
GbyAI
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 司徒正美
云风的 BLOG
云风的 BLOG
小众软件
小众软件
博客园 - 叶小钗
Blog — PlanetScale
Blog — PlanetScale
C
Check Point Blog
A
About on SuperTechFans
B
Blog
月光博客
月光博客
宝玉的分享
宝玉的分享
Last Week in AI
Last Week in AI

博客园_首页

Linux实操--组管理、权限管理和定时任务 Java + EasyExcel 实现单个接口导出多个Excel Mem0 源码解析系列(二):提示词工程的深度剖析 Openclaw TaskFlow究竟是什么?和普通Skill技能有什么区别 博文阅读密码验证 - 博客园 嘉立创开源:应该是全网MicroPython教程最多的开发板 Hermes Agent 集成实践:从协议到生产 2026年AI编程工具横评:Cursor、Codex、Claude Code、Zed、Windsurf Java程序员必看的RAG入门教程 2026 AI效率神器:Superpowers + Claude Code 保姆级教程 本地大模型部署全攻略:从 0 到 1 玩转 Ollama 【从0到1构建一个ClaudeAgent】内存管理-上下文压缩 .NET 高级开发 | 设计、实现一个事件总线框架 电子小白入门之NE555 3. WorkBuddy:隐藏玩法,一键召唤专家,让 AI 以"专家身份"给你干活 和AI一起搞事情#3:Claude Teammate 游戏开发翻车实录 【OpenClaw】通过 Nanobot 源码学习架构---(7)Memory C# .NET 周刊|2026年3月3期 我在 Debian 11 上把 K8s 单机搭起来了,过程没你想的那么顺(/opt 目录版) 深度学习进阶(七)Data-efficient Image Transformer CLI+Skill搭建浏览器AI自动化框架,告别一切重复枯燥任务 告别Token账单无底洞:OpenClaw本地部署,重塑企业数据主权的唯一解 FastAPI+Vue:文件分片上传+秒传+断点续传,这坑我帮你踩平了! SBTI 爆火后,我做了个程序员版的 CBTI。。已开源 + 附开发过程 多模态检索开始进入工程期:用 Sentence Transformers 搭建可落地的 Multimodal RAG 100多行代码实现一个最简单的Agent(用ReAct) Claude Code 通关手册(八):推荐 5 个 Hooks,代码质量提升 3 倍 老板:“有人截图了!”。安全部门:“收到,马上查暗水印!” - why技术 技术之外,皆是人间 C#/.NET/.NET Core技术前沿周刊 | 第 69 期(2026年4.01-4.12)
基础(一)-STM32时钟树配置
f12138 · 2026-05-06 · via 博客园_首页

时钟树配置理解与计算

简介:CubeMX图形化非常便于理解stm32的基础外设配置,本文则从参照CubeMX图形化的角度,分别分析标准库、HAL库时钟树代码配置。

一、以STM32F405RGT6为例,标准库

image-20260428172653308

如图1,时钟树三级计算,分别为:

第一级,晶振(8Mhz),即外部时钟HSE的输入源

第二级,PLL,包括PLLM、PLLN、PLLP等(不同芯片则不同PLL配置,所以相比较手册,CubeMX图形化更便于参照理解)

第三级,AHB预分频

相邻两级之间有source源选择(对应图中梯形Mux)

第一级选择,PLL的输入源选择,有HSE外部高速时钟(一般是外部晶振)、HSI内部高速时钟(芯片自带)

第二级选择,HSE直接输入、HSI直接输入、PLL分频倍频后的输出时钟

// 标准库,芯片F4,对应图1
RCC_HSEConfig(RCC_HSE_ON);		//开启HSE
//......
//这里PLL参照手册PLLCFGR寄存器配置
RCC->PLLCFGR = (8 << 0)        // PLL_M=8(分频后1MHz)
             | (336 << 6)      // PLL_N=336(倍频后336MHz)
             | (0 << 16)       // PLL_P=2(分频后168MHz)
             | (RCC_PLLCFGR_PLLSRC_HSE)  // 选择HSE作为PLL的输入
             | (7 << 24);      // PLL_Q=7(USB时钟=336/7=48MHz)
//......
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);	//选择PLL作为SYSCLK的输入
//......

//最终结果:8MHz / 8(PLLM) * 366(PLLN)/ 2(PLLP)=168MHz(SYSCLK)

二、以STM32G474RET6为例,HAL库

同样的,下面是STM32G474RET6,HAL库,其实除了代码书写不同、芯片的PLL稍微不同,整体都是相似的。

image-20260430102359723

//CubeMX生成的时钟配置代码,芯片G4,对应图2
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;		//	外部晶振类型
RCC_OscInitStruct.HSEState = RCC_HSE_ON;						//开启HSE
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;					//PLL开启
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;			//PLL的source选择
RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV6;						//PLLM,6分频
RCC_OscInitStruct.PLL.PLLN = 85;								//PLLN,85倍频
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;						//其他外设用,比如USB等,非必要,依据情况来
RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;						//PLLR,2分频

//最终结果:晶振24MHz / 6(PLLM)* 85(PLLN)/ 2(PLLR)= 170MHz(SYSCLK)

结尾:如有理解或书写错误,欢迎各位看官指出,感谢!