当前位置: 首页 > news >正文

ARM时钟初始化与GPT定时器深度解析完整教程:从入门到实战部署

在实际工作中经常遇到这个场景,今天系统性地总结一下最佳实践和注意事项。

一、系统时钟初始化流程(clock.c)

阶段 1:为什么系统一开始必须初始化时钟?

目的 / 作用

  1. 决定 CPU 主频
  2. 决定 AHB / IPG 总线频率
  3. GPT、GPIO、UART、GIC 等外设提供时钟源
  4. 保证延时、定时、中断时序是“准确的”

❗如果不初始化:

  • GPT 计数不准
  • delay_us 完全不可信
  • 外设可能根本不工作

阶段 2:ARM 核心时钟配置(PLL1)

代码

  1. CCM->CCSR &= ~(1 << 8);  
  2. CCM->CCSR |= (1 << 2);  

做了什么?

含义

CCSR[2]

临时切换到 step clock

CCSR[8]

PLL1 bypass

目的

切换 ARM 内核时钟源到安全时钟
避免在改 PLL 时 CPU 跑飞


阶段 3:ARM 时钟分频(CACRR)

  1. CCM->CACRR &= ~(7 << 0);  
  2. CCM->CACRR |= (1 << 0);  

作用

  • 设置 ARM 核心时钟预分频
  • 1 表示 不分频 / 2 分频(依芯片定义)

注意点

  • ARM 核心最终频率 = PLL1 / CACRR
  • 分频过小 → CPU 太快 → 功耗高
  • 分频过大 → 系统整体变慢

阶段 4:配置 ARM PLL(PLL1)

  1. unsigned int t = CCM_ANALOG->PLL_ARM;  
  2. t &= ~(3 << 14);  
  3. t |= (1 << 13);  
  4. t &= ~(0x7F << 0);  
  5. t |= (88 << 0);  
  6. CCM_ANALOG->PLL_ARM = t;  

做了什么?

位段

含义

bit[13]

使能 PLL

bit[6:0]

倍频系数

这里配置的是:

PLL1 = 24MHz × 88 = 1056MHz


阶段 5:切回 PLL1 作为 CPU 时钟

CCM->CCSR &= ~(1 << 2);

作用

ARM 核心正式使用 PLL1 输出的高速时钟


阶段 6:配置 528PLL / 480PLL(外设时钟源)

CCM_ANALOG->PFD_528 = ...

CCM_ANALOG->PFD_480 = ...

目的

  • AHB、IPG、GPT、EPIT、UART 等外设提供稳定时钟
  • 不同 PFD → 不同频率

注意点

  • GPT 使用的是 IPG_CLK
  • IPG_CLK 又来自 AHB

阶段 7:配置 AHB / IPG / PERCLK

  1. CCM->CBCMR  
  2. CCM->CBCDR  
  3. CCM->CSCMR1  

时钟关系链(非常重要)

PLL → AHB → IPG → GPT / GPIO / IOMUX

你这里设置的是 经典推荐配置


阶段 8:使能所有外设时钟门控

clock_cg_init();

优化建议:

如果你的项目访问量较大,建议增加缓存机制。我们团队在优化后,接口响应时间从800ms降到了50ms, 效果非常明显。具体的缓存策略可以根据业务场景调整。

CCM->CCGRx = 0xFFFFFFFF;

作用

打开所有模块的时钟

注意点

  • 方便调试
  • 实际产品中不推荐(功耗大)

二、GPT 定时器工作流程(gpt.c)
GPT = 一个“不断递增的硬件计数器”


阶段 1:为什么要用 GPT?

目的 / 作用

  1. 实现 精确 us / ms 延时
  2. 不依赖 CPU 空转频率
  3. 和系统主频解耦

对比:

  • while(t--) ❌ 不准
  • GPT 计数 ✅ 准确

阶段 2:GPT1 复位

  1. GPT1->CR |= (1 << 15);  
  2. while((GPT1->CR & (1 << 15)) != 0);  

作用

  • 让 GPT 回到硬件初始状态
  • 清除所有历史配置

注意点

  • 必须等待硬件复位完成

阶段 3:配置 GPT 控制寄存器 CR

  1. t = GPT1->CR;  
  2. t &= ~(7 << 26);   // 时钟源
  3. t &= ~(3 << 18);   // 工作模式
  4. t |= (1 << 9);     // Free-run
  5. t &= ~(7 << 6);  
  6. t |= (1 << 6);     // 外设时钟
  7. t &= ~(1 << 1);    // 关闭中断
  8. GPT1->CR = t;  

关键配置解释

作用

bit9

自由运行模式

bit6

使用 IPG_CLK

bit1

不启用中断

GPT 现在是 纯计数器模式


阶段 4:设置 GPT 预分频器

  1. GPT1->PR &= ~(0xFFF << 0);  
  2. GPT1->PR |= (65 << 0);  

作用

  • 将 IPG_CLK 分频
  • 假设 IPG = 66MHz

66MHz / (65+1) ≈ 1MHz

CNT 每加 1 = 1μs


阶段 5:启动 GPT

GPT1->CNT = 0;

GPT1->CR |= (1 << 0);

作用

  • 清零计数器
  • 开始计数

阶段 6:delay_us 的完整工作流程

  1. old_count = GPT1->CNT;  
  2. while(1)  
  3. {  
  4.     new_count = GPT1->CNT;  
  5. if (new_count != old_count)  
  6.     {  
  7. if (new_count > old_count)  
  8.             count += new_count - old_count;  
  9. else
  10.             count += 0xFFFFFFFF - old_count + new_count;  
  11.     }  
  12. if (count >= us)  
  13. return;  
  14.     old_count = new_count;  
  15. }  

这是在干什么?

用硬件计数差值计算经过的时间

为什么要处理回绕?

  • GPT 是 32 位计数器
  • 会从 0xFFFFFFFF → 0
  • 必须处理溢出

阶段 7:delay_ms 的工作方式

  1. delay_ms(ms)  
  2. {  
  3. while(ms--)  
  4.         delay_us(1000);  
  5. }  

本质还是 GPT


三、main.c 中的整体配合流程

  1. system_interrupt_init();  
  2. clock_init();  
  3. led_init();  
  4. beep_init();  
  5. key_init();  
  6. gpt1_init();  

顺序为什么这样?

1️⃣ 中断系统先准备好
2️⃣ 时钟先跑稳
3️⃣ GPIO / 外设再初始化
4️⃣ 定时器最后启动


while(1) 中发生了什么?

delay_us(1000 * 1000);

led_nor();

GPT 在后台跑
CPU 通过 CNT 判断时间
精确 1 秒翻转 LED

http://www.jsqmd.com/news/390920/

相关文章:

  • 如何优化炉石传说体验:HsMod插件全面使用指南
  • 破解飞书文档迁移困境:feishu-doc-export的智能批量导出方案
  • 5分钟掌控DLSS指示器:让游戏性能优化可视化
  • 轻松解决华硕笔记本显示模式异常:G-Helper显示模式修复完全指南
  • 突破奥创性能瓶颈:GHelper重新定义ROG笔记本硬件控制体验
  • 如何在红包雨大战中保持领先?微信红包插件的技术实现与场景适配
  • 解锁音乐自由:本地化音频解密工具QMCDecode全攻略
  • 3步完成DLSS升级:无损画质与性能跃升的实战指南
  • GHelper:华硕笔记本性能管理新标杆,轻量高效的开源解决方案
  • 5分钟上手B站视频转文字:Bili2text高效使用指南
  • CefFlashBrowser:数字遗产的守护者——让Flash内容在现代系统中重获新生
  • XUnity Auto Translator:解决Unity游戏语言障碍的智能翻译工具
  • 如何轻松提取Unity游戏资源?5个步骤掌握UABEA使用技巧
  • 2026年石家庄GEO直销公司权威测评:谁在领跑本地化精准营销? - 2026年企业推荐榜
  • 探索电话号码背后的地理密码:开源工具如何实现精准定位
  • HsMod插件效率提升指南:从部署到定制的全流程优化
  • NVIDIA Profile Inspector性能优化完全指南:从入门到精通的高级调校实战手册
  • Blender3MFFormat完全指南:3D打印工作流无缝集成实战手册
  • 打破语言壁垒:XUnity.AutoTranslator实现游戏本地化的创新方案
  • 如何用League Akari解决英雄联盟效率难题:智能辅助实战指南
  • 蚌埠固镇县小户型装修实力企业精选:6家专业整装公司深度解析 - 2026年企业推荐榜
  • 智能批量导出新突破:飞书文档迁移效率提升方案
  • 突破音乐格式枷锁:QMCDump解锁QQ音乐加密文件的无损自由
  • 三大突破点:数字音频取证技术揭秘——QM加密格式跨平台解密方案
  • 3大核心能力打造微信抢红包神器:从原理到实战全指南
  • 2026年编制考试培训如何选?五家安徽本土机构深度解析 - 2026年企业推荐榜
  • 5分钟定位手机号:location-to-phone-number开源工具的技术实现与商业价值
  • 解锁3大核心能力:Zotero智能文献管理全攻略
  • 如何突破《原神》帧率限制:从技术原理到实战优化全指南
  • QtScrcpy实战全解析:跨平台Android设备控制的技术原理与场景落地