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

Linux学习笔记7:关于i.MX6ULL主频与时钟配置原理详解

以下是关于正点原子B站课程中 i.MX6ULL主频和时钟配置实验的博客内容框架与详细解析,结合实验原理、配置流程及关键代码实现,适合嵌入式开发者参考学习:

一、 实验背景

i.MX6ULL默认启动时由内部BootROM将主频设置为396MHz,但其标准工作频率为528MHz,部分型号可超频至696MHz。通过配置系统时钟与外围时钟,可最大化芯片性能并满足不同外设需求。本实验目标是通过编程调整主频至528MHz。

二、 硬件原理

1. 时钟源与PLL结构

i.MX6ULL的时钟系统由两路外部晶振驱动:
24MHz晶振:内核及外设主时钟源。
32.768kHz晶振:RTC专用。

芯片内部通过7路PLL(锁相环)生成高频时钟:
1. ARM_PLL (PLL1):专供ARM内核,可编程倍频至最高1.3GHz。
2. 528_PLL (PLL2):固定22倍频(24MHz×22=528MHz),生成系统总线时钟。
3. USB1_PLL (PLL3):固定20倍频(480MHz),提供USB及外设时钟。
4. 其他PLL:如ENET_PLL(500MHz)、VIDEO_PLL(650-1300MHz)等。

部分时钟树展示

2. 主频配置流程

根据博主个人的理解,在配置主频的编程中,本质上就是根据图中相应的多路选择器配置相应的寄存器,进而控制多路选择器进行选择。

1. 要设置ARM内核主频为528MHz,设置CACRR寄存器的ARM_PODF位为2分频,
然后设置PLL1=1056MHz即可。CACRR的bit3~0为ARM_PODF位,可设置0~7,分别对
应1~8分频。如果要设置为2分频的话,CCM_CACRR就要设置为1。再来看一下寄存器CCM_ANALOG_PLL_ARMn, 此寄存器结构如图 16.1.4.3 所示:

在寄存器 CCM_ANALOG_PLL_ARMn 中重要的位如下:

ENABLE: 时钟输出使能位,此位设置为 1 使能 PLL1 输出,如果设置为 0 的话就关闭 PLL1 输出。

DIV_SELECT: 此位设置 PLL1 的输出频率,可设置范围为:54~108,PLL1_CLK = Fin * div_seclec/2.0,Fin=24MHz。如果 PLL1 要输出 1056MHz 的话,div_select 就要设置为 88。

分频设置:如下图

2. 设置 PLL1=1056MHz。PLL1=pll1_sw_clk。pll1_sw_clk有两路可以选择,分别为
pll1_main_clk,和step_clk,通过CCSR寄存器的pll1_sw_clk_sel位(bit2)来选择。为0的时候
选择pll1_main_clk,为1的时候选择step_clk。

3. 切换临时时钟源
修改主频需先切换至临时时钟step_clk,步骤如下:
1. 设置step_clk时钟源为24MHz晶振。如图,(通过CCSR寄存器的step_sel进行选择)。
2. 切换pll1_sw_clk到step_clk,确保修改PLL1时系统仍有时钟运行。

为什么要切换到临时时钟呢?打个比方,我们在为病人做心脏手术时取出病人原有的心脏(pll1_main_clk)进行修复,就需要使用一个人造的心脏(即临时时钟step_clk)临时使用,维持病人生命体征,否则病人就无了,这里也是同样的道理。

所以保险起见,在开始之前我们进行判断,判断是否需要切换时钟。

if (((CCM->CCSR >> 2) & 0x1) == 0) { // 判断当前是否使用PLL1
    CCM->CCSR &= ~(1 << 8);          // step_clk选择24MHz晶振
    CCM->CCSR |= (1 << 2);           // pll1_sw_clk切换至step_clk
}

4. 配置PLL1频率
通过CCM_ANALOG_PLL_ARM寄存器设置PLL1倍频参数:
公式:PLL1输出频率 = 24MHz × DIV_SELECT / 2


我们配置的目标为528MHz:需设置DIV_SELECT=88(1056MHz),再通过2分频得到528MHz。

	CCM->ANALOG->PLL_ARM = (1 << 13) | ((88 << 0) & 0X7F)
	CCM->CACRR = 1; //设置分频系数为2

5. 切换回PLL1时钟源

CCM->CCSR &= ~(1 << 2); // pll1_sw_clk切换回PLL1_main_clk

所以,最终整个初始化的函数如下

/*初始化时钟*/
void imx6u_clkinit(void)
{
	/*初始化6U的主频为528Mhz*/
	if(((CCM->CCSR >> 2) & 0X1) == 0)//当前时钟使用pll1_main_clk,需要切换时钟
	{
		CCM->CCSR &= ~(1 << 8); //设置step_clk = osc_clk = 24M
		CCM->CCSR &= ~(1 << 2); //设置pll1_sw_clk = step_clk = 24M
	}

	/* 设置PLL1 = 1056M */
	CCM->ANALOG->PLL_ARM = (1 << 13) | ((88 << 0) & 0X7F)
	CCM->CACRR = 1; //设置分频系数为2
	CCM->CCSR &= ~(1 << 2); //设置pll1_sw_clk = pll1 = 1056M
}

三、实验注意事项

1. 时钟切换顺序:需先切换到临时时钟再修改PLL,避免系统崩溃。
2. 分频参数范围:PFD分频值需在12~35之间。

3. 注意频率范围:PLL1最高频率为1.3GHz,我们假设要设置的不是528M而是792MHz,采用二分频计算公式发现求得的结果明显超过最大频率1.3G的上限,这时就应采用1分频方式,设置792MHz。

参考资源:  
i.MX6ULL参考手册第10章、第18章](https://www.nxp.com)  
B站正点原子 


文章转载自:
http://assonate.zzyjnl.cn
http://antileukemic.zzyjnl.cn
http://basal.zzyjnl.cn
http://ampule.zzyjnl.cn
http://blanch.zzyjnl.cn
http://cardiotonic.zzyjnl.cn
http://allness.zzyjnl.cn
http://carillon.zzyjnl.cn
http://campestral.zzyjnl.cn
http://basipetally.zzyjnl.cn
http://auditorial.zzyjnl.cn
http://bourree.zzyjnl.cn
http://biface.zzyjnl.cn
http://angstrom.zzyjnl.cn
http://ccd.zzyjnl.cn
http://cholangiography.zzyjnl.cn
http://aeroneer.zzyjnl.cn
http://billfish.zzyjnl.cn
http://application.zzyjnl.cn
http://blackhearted.zzyjnl.cn
http://anticoagulant.zzyjnl.cn
http://catechetics.zzyjnl.cn
http://chlamydia.zzyjnl.cn
http://adman.zzyjnl.cn
http://bedel.zzyjnl.cn
http://brisk.zzyjnl.cn
http://ablush.zzyjnl.cn
http://anaemia.zzyjnl.cn
http://brominate.zzyjnl.cn
http://brewage.zzyjnl.cn
http://www.dtcms.com/a/111438.html

相关文章:

  • Cribl 导入文件来检查pipeline 的设定规则(eval 等)
  • NO.64十六届蓝桥杯备战|基础算法-简单贪心|货仓选址|最大子段和|纪念品分组|排座椅|矩阵消除(C++)
  • 【如何设置Element UI的Dialog弹窗允许点击背景内容】
  • Linux系统之wc命令的基本使用
  • 华为高斯(GaussDB) 集中式数据库 的开发技术手册,涵盖核心功能、开发流程、优化技巧及常见问题解决方案
  • 深度学习数据集划分比例多少合适
  • Linux make 检查依赖文件更新的原理
  • PyTorch张量
  • Opencv计算机视觉编程攻略-第九节 检测兴趣点
  • Linux systemd 服务全面详解
  • SQL语句(三)—— DQL
  • 详解AI采集框架Crawl4AI,打造智能网络爬虫
  • poetry安装
  • Transformer+BO-SVM时间序列预测(Matlab)
  • 第十五届蓝桥杯大赛软件赛省赛Python 大学 C 组:5.回文数组
  • 系统分析师-前6章总结
  • STM32单片机入门学习——第14节: [6-2] 定时器定时中断定时器外部时钟
  • PGSQL 对象创建函数生成工具
  • RSA和ECC在密钥长度相同的情况下哪个更安全?
  • 深度学习中的 Batch 机制:从理论到实践的全方位解析
  • AcWing 6118. 蛋糕游戏
  • Ubuntu安装Podman教程
  • Spring 核心技术解析【纯干货版】- XXI:Spring 第三方工具整合模块 Spring-Context-Suppor 模块精讲
  • 《古龙群侠传》游戏秘籍
  • 【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的监控:使用 Actuator 实现健康检查
  • 【spring cloud Netflix】Eureka注册中心
  • 关于uint8_t、uint16_t、uint32_t、uint64_t的区别与分析
  • Linux(2025.3.15)
  • 安装 TabbyAPI+Exllamav2 和 vLLM 的详细步骤
  • 前后端通信指南