09. 主频和时钟配置

news2024/11/20 20:23:08

09. 主频和时钟配置

  • 硬件原理图分析
  • 7路PLL时钟源
  • 时钟树简介
  • 内核时钟系统主频设置
    • CCM_CACRR
    • CCSR
    • CCM_ANALOG_PLL_ARMn
    • 代码实例
  • PFD时钟设置
    • PLL2的4路设置
    • PLL3的4路设置
    • 代码实例
  • AHB、IPG和PERCLK根时钟设置
    • AHB_CLK_ROOT 和 IPG_CLK_ROOT
    • PERCLK_CLK_ROOT
    • CCM_CBCDR
    • CCM_CBCMR
    • CCM_CSCMR1
    • 代码实例

硬件原理图分析

在这里插入图片描述

  1. 32.768kHz的晶振,供给RTC实时时钟工作。该晶振不会参与到系统时钟去
  2. 在6U的T16和T17这两个IO上,接一个24MHz的晶振,提供整个系统的时钟,是内核和其他外设的时钟源

7路PLL时钟源

I.MX6U 的外设很多,不同外设的时钟源不同,NXP将这些外设的是中原进行分组,一共7组
在这里插入图片描述

  1. ARM_PLL(PLL1),是供ARM内核使用的,可以通过编程的方式最高可倍频到1.3GHz
  2. 528_PLL(PLL2),也叫做System_PLL,是固定的22倍频,不可编程修改。此路PLL时钟=24MHz*22=528MHz。此路分出4路,PLL2_PFD0~PLL2_PFD3,这四路和528PLL共同作为其他很多外设的根时钟源,通常也是I.MX6U内部系统总线的时钟源
  3. USB1_PLL(PLL3),主要用于USBPHY,也有四路,PLL3_PFD0~PLL_PFD3。是固定的20倍频,也就是480MHz。虽然主要用于USB1PHY,但是和其他四路也可以作为其他外设的根时钟源
  4. USB2_PLL(PLL7),给USB2PHY使用,也是固定的22倍频
  5. ENET_PLL(PLL6),固定为20+5/6倍频,也就是500MHz。用于生成网络所需的时钟,可以在此基础上生成25/50/100/125MHz
  6. VIDEO_PLL(PLL5),用于显示相关的外设,比如LCD,倍频可以调整,范围是650MHz~1300MHz,最终输出的时候还可以进行分频,可选1/2/4/8/16
  7. AUDIO_PLL(PLL4),用于音频相关的外设,倍频可以调整,范围是650MHz~1300MHz,最终输出的时候还可以进行分频,可选1/2/4

时钟树简介

在这里插入图片描述
左边的 CLOCK_SWITCHER 就是我们上一小节讲解的那 7 路 PLL 和8 路 PFD,右边的 SYSTEM CLOCKS 就是芯片外设,中间的 CLOCK ROOT GENERATOR 给左边和右边进行牵线搭桥。就负责从7路PLL和8路PFD中选择合适的时钟源给外设用,具体操作就是配置相关寄存器

以ESAI为例,ESAI的时钟图

在这里插入图片描述

  1. 第一部分是时钟源选择器,ESAI有4个可选时钟源:PLL4、PLL5、PLL_PFD2和PLL3_SW_CLK。具体哪一路是由寄存器CCM->CSCMR2和ESAI_CLK_SEL位来决定的
    在这里插入图片描述
  2. 第二部分是ESAI的前级分频,分频值由寄存器CCM_CS1CDR的ESAI_CLK_PRED来确定的,可以设置1~8分频。假如选择PLL4=650MHz,前级选择2分频,那么此时就是650/2=325MHz
  3. 第三部分又是一个分频器。分频值由寄存器CCM_CS1CDR 的 ESAI_CLK_PODF 来决定,可设置 1~8 分频。假如我们设置为 8 分频的话,经过此分频器以后的时钟就是 325/8=40.625MHz。因此最终进入到 ESAI 外设的时钟就是40.625MHz。

内核时钟系统主频设置

ARM内核时钟树

  1. 通过CCM_CACRR的ARM_PODF位(bit3 ~ 0) 对PLL1进行分频,后面没有2分频。
  2. PLL1=pll1_sw_clk_sel,通过CCSR的pll1_sw_clk_sel(bit 2)选择,如果为1,就是main_clk,如果是0,就是step_clk。
  3. step_clk 通过CCSR的 step_sel 位(bit 8)有两路可以选择,如果是0,频率就是osc_clk,也就是晶振。
  4. 时钟切换为临时时钟,也就是step_clk 后 就可以通过寄存器CCM_ANALOG_PLL_ARM的DIV_SELECT位(bit 6~0)修改PLL1的频率。公式为:PLL=24*div_select/2,单位是MHz。例如如果要设置PLL为1056,那么div_select就设置为88。还要设置enable 位(bit 13)为1,也就是使能输出
  5. 在切换回PLL1之前,设置CACRR为main_clk

CCM_CACRR

在这里插入图片描述
ARM_PODF可以设置0 ~ 7,分别对应1 ~ 8分频。如果要设置内核主频为528MHz,设置2分频,PLL1=1056MHz;如果要设置内核主频为696MHz,就设置1分频,PLL1=696MHz,因为PLL1有最低值和最高值。如果要设置700MHz,只能寻找最接近的值设置

CCSR

在这里插入图片描述
通过CCSR寄存器的 pll1_sw_clk_sel 进行数据选择。在修改PLL1的时候,也就是设置系统时钟的时候需要给6ULL一个临时的时钟,也就是step_clk ,在修改PLL1的时候需要将 pll1_sw_clk_sel 修改为 step_clk。

CCM_ANALOG_PLL_ARMn

在这里插入图片描述

  • ENABLE:时钟输出使能位,设置为1,使能PLL1输出,设置为0就关闭PLL1输出
  • DIV_SELECT:设置PLL1的输出频率,范围54~108。CLK=Fin*div_select/2,Fin=24MHz
    修改PLL1时钟频率时要先将内核时钟源改为其他的时钟源,可选时钟源如下:
    在这里插入图片描述

代码实例

// 使能外设时钟
void clk_enable()
{
	CCM->CCGR0=0xffffffff;
	CCM->CCGR1=0xffffffff;
	CCM->CCGR2=0xffffffff;
	CCM->CCGR3=0xffffffff;
	CCM->CCGR4=0xffffffff;
	CCM->CCGR5=0xffffffff;
	CCM->CCGR6=0xffffffff;
}
// 初始化时钟
void imx6u_clkinit()
{
	if((((CCM_CCSR)>>2)&0x1)==0) // 如果此位为0,就是main_clk,需要切换为1
	{
		CCM->CCSR &= ~(1<<8); // 设置step_clk=osc_clk
		CCM->CCSR |= (1<<2);  // 切换为step_clk,就可以修改PLL1
	}
	
	// 设置PLL1为1056MHz
	CCM_ANALOG->PLL_ARM = (1<<13)|((88<<0)&0x7f); // &0x7f就是取低7位
	CCM->CACRR = 1; // 设置为2分频
	CCM->CCSR &= ~(1<<2); // 切换回时钟
}

PFD时钟设置

在这里插入图片描述

PLL2的4路设置

用到的寄存器是CCM_ANALOG_PFD_528n
在这里插入图片描述

  • PFD0_FRAC:设置分频数,PLL2_PFD0 计算公式为528*18/PFD0_FRAC,可设置范围12~35
  • PFD0_STABLE:此位为只读位,判断PLL2_PFD0是否稳定
  • PFD0_CLKGATE:输出使能位,为1的时候关闭PLL2_PFD0的输出,为0的时候使能输出

PLL3的4路设置

用到的寄存器是CCM_ANALOG_PFD_480n
在这里插入图片描述
结构类似,只是计算公式不同。PLL3_PFDX=480*18/PFDX_FRAC

代码实例

	reg = CCM_ANALOG->PFD_528;
	reg &= ~(0x3f3f3f3f); // 将所有位全部清0
	reg |=32<<24); // PLL2_PFD3=297
	reg |=24<<16); // PLL2_PFD2=396
	reg |=16<<8);  // PLL2_PFD1=594
	reg |=27<<0);  // PLL2_PFD0=352
	CCM_ANALOG->PFD_528=reg;

	reg = CCM_ANALOG->PFD_490;
	reg &= ~(0x3f3f3f3f); // 将所有位全部清0
	reg |=19<<24); // PLL3_PFD3=720
	reg |=17<<16); // PLL3_PFD2=508.2
	reg |=16<<8);  // PLL3_PFD1=540
	reg |=12<<0);  // PLL3_PFD0=720
	CCM_ANALOG->PFD_480=reg;

AHB、IPG和PERCLK根时钟设置

因为PERCLK_CLK_ROOT 和 IPG_CLK_ROOT 要用到AHB_CLK_ROOT.
I.MX6U外设根时钟可设置范围如下,一般直接设置为最大,让性能最大
在这里插入图片描述

AHB_CLK_ROOT 和 IPG_CLK_ROOT

在这里插入图片描述
①此选择器用来选择 pre_periph_clk 的时钟源,可以选择 PLL2、 PLL2_PFD2、 PLL2_PFD0和 PLL2_PFD2/2。寄存器 CCM_CBCMR 的 PRE_PERIPH_CLK_SEL 位决定选择哪一个,默认选择 PLL2_PFD2,因此 pre_periph_clk=PLL2_PFD2=396MHz。
②此选择器用来选择 periph_clk 的时钟源,由寄存器 CCM_CBCDR 的 PERIPH_CLK_SEL位与 PLL_bypass_en2 组成的或来选择。当 CCM_CBCDR 的 PERIPH_CLK_SEL 位为 0 的时候,periph_clk=pr_periph_clk=396MHz。
③通过 CBCDR 的 AHB_PODF 位来设置 AHB_CLK_ROOT 的分频值,可以设置 1~8 分频,如果想要 AHB_CLK_ROOT=132MHz 的话就应该设置为 3 分频: 396/3=132MHz。图中虽然写的是默认 4 分频,但是 I.MX6U 的内部 boot rom 将其改为了 3 分频!
④通过 CBCDR 的 IPG_PODF 位来设置 IPG_CLK_ROOT 的分频值,可以设置 1~4 分频,IPG_CLK_ROOT 时钟源是 AHB_CLK_ROOT,要想 IPG_CLK_ROOT=66MHz 的话就应该设置2 分频: 132/2=66MHz。

PERCLK_CLK_ROOT

在这里插入图片描述

CCM_CBCDR

在这里插入图片描述

  • PERIPH_CLK2_PODF: periph2 时钟分频,可设置 0 ~ 7,分别对应 1~8 分频。
  • PERIPH2_CLK_SEL:选择 peripheral2 的主时钟,如果为 0 的话选择 PLL2,如果为 1 的话选择 periph2_clk2_clk。修改此位会引起一次与 MMDC 的握手,所以修改完成以后要等待握手完成,握手完成信号由寄存器 CCM_CDHIPR 中指定位表示。
  • PERIPH_CLK_SEL: peripheral 主时钟选择,如果为 0 的话选择 PLL2,如果为 1 的话选择 periph_clk2_clock。修改此位会引起一次与 MMDC 的握手,所以修改完成以后要等待握手完成,握手完成信号由寄存器 CCM_CDHIPR 中指定位表示。
  • AXI_PODF: axi 时钟分频,可设置 0 ~ 7,分别对应 1~8 分频。
  • AHB_PODF: ahb 时钟分频,可设置 0 ~ 7,分别对应 1~8 分频。修改此位会引起一次与MMDC 的握手,所以修改完成以后要等待握手完成,握手完成信号由寄存器 CCM_CDHIPR 中指定位表示。
  • IPG_PODF: ipg 时钟分频,可设置 0 ~ 3,分别对应 1~4 分频。
  • AXI_ALT_CLK_SEL: axi_alt 时钟选择,为 0 的话选择 PLL2_PFD2,如果为 1 的话选择PLL3_PFD1。
  • AXI_CLK_SEL: axi 时钟源选择,为 0 的话选择 periph_clk,为 1 的话选择 axi_alt 时钟。
  • FABRIC_MMDC_PODF: fabric/mmdc 时钟分频设置,可设置 0 ~ 7,分别对应 1~8 分频。
  • PERIPH2_CLK2_PODF: periph2_clk2 的时钟分频,可设置 0 ~ 7,分别对应 1~8 分频。

CCM_CBCMR

在这里插入图片描述

  • LCDIF1_PODF: lcdif1 的时钟分频,可设置 0 ~ 7,分别对应 1~8 分频。
  • PRE_PERIPH2_CLK_SEL: pre_periph2 时钟源选择, 00 选择 PLL2, 01 选择 PLL2_PFD2,10 选择 PLL2_PFD0, 11 选择 PLL4。
  • PERIPH2_CLK2_SEL: periph2_clk2 时钟源选择为 0 的时候选择 pll3_sw_clk,为 1 的时候选择 OSC。
  • PRE_PERIPH_CLK_SEL: pre_periph 时钟源选择, 00 选择 PLL2, 01 选择 PLL2_PFD2, 10 选择 PLL2_PFD0, 11 选择PLL2_PFD2/2。
  • PERIPH_CLK2_SEL: peripheral_clk2 时钟源选择, 00 选择 pll3_sw_clk, 01 选择 osc_clk,10 选择 pll2_bypass_clk。

CCM_CSCMR1

在这里插入图片描述

  • PERCLK_CK_SEL: perclk 时钟源选择,为 0 的话选择 ipg clk,为 1 的话选择 osc clk。
  • PERCLK_PODF: perclk 的时钟分频,可设置 0 ~ 7,分别对应 1~8 分频。
    在修改如下时钟选择器或者分频器的时候会引起与 MMDC 的握手发生:mmdc_podf、periph_clk_sel、periph2_clk_sel、arm_podf、ahb_podf。
    发生握手信号以后需要等待握手完成,寄存器 CCM_CDHIPR 中保存着握手信号是否完成,如果相应的位为 1 的话就表示握手没有完成,如果为 0 的话就表示握手完成,另外在修改 arm_podf 和 ahb_podf 的时候需要先关闭其时钟输出,等修改完成以后再打开,否则的话可能会出现在修改完成以后没有时钟输出的问题。

代码实例

  1. AHB_CLK_ROOT 初始化
  • 设置CMCBR寄存器的 PRE_PERIPH_CLK_SEL 位为0
  • 设置CMCDR寄存器的 AHB_PODF 位(bit 12~10)为2,也就是3分频
	// 设置AHB=132MHz
	CCM->CBCMR &= ~(3<<18);
	CCM->CBCMR |= (1<<18); // 设置pre_periph_clk=PLL2_CLK =396MHz
	CCM->CBCDR &= ~(1<<25);// periph_clk = pre_periph_clk=396MHz
	while(CCM->CDHIPR & (1<<5)); 
	
	// 设置3分频的时候如果没有关闭AHB_CLK_ROOT的输出,会出错,但是内部boot rom设置了3分频
	/*
	CCM->CBCDR &= ~(7<<10); // 将10~12位清零
	CCM->CBCDR |= (2<<10); // 设置3分频
	while(CCM->CDHIPR & (1<<1))); // 等待握手信号完成
	*/
  1. IPG_CLK_ROOT 初始化
  • 设置CBCDR寄存器IPG_PODF = 1,也就是2分频
	CCM->CBCDR &= ~(3<<8);
	CCM->CBCDR |= (1<<8);
  1. PERCLK_CLK_ROOT 初始化
    • 设置CSCMR1 寄存器的PERCLK_CLK_SEL 位为0,表示PERCLK的时钟源为IPG
	CCM->CSCMR1 &= ~(1<<6);
	CCM->CSCMR1 &= ~(0x3f<<0); // 1分频就是置0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1137674.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis | 数据结构(02)SDS

一、键值对数据库是怎么实现的&#xff1f; 在开始讲数据结构之前&#xff0c;先给介绍下 Redis 是怎样实现键值对&#xff08;key-value&#xff09;数据库的。 Redis 的键值对中的 key 就是字符串对象&#xff0c;而 value 可以是字符串对象&#xff0c;也可以是集合数据类型…

创建并启动华为HarmonyOS本地与远程模拟器及远程真机

1.打开设备管理器 2.选择要添加的手机设备,然后点击安装 3.正在下载华为手机模拟器 4.下载完成 5.创建新模拟器 下载系统镜像 点击下一步,创建模拟器 创建成功 启动模拟器 华为模拟器启动成功 6.登陆华为账号并使用远程模拟器 7.使用远程真机

论环境如何影响我们的一切

本心、输入输出、结果 文章目录 论环境如何影响我们的一切前言相关书籍极大影响我们的潜在客观环境环境带给我们的影响是如何进行具象化的大的框架体系是什么弘扬爱国精神论环境如何影响我们的一切 编辑:简简单单 Online zuozuo 地址:https://blog.csdn.net/qq_15071263 如果…

每日一练——返回链表的中间结点

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

数据库扫描工具scuba

目录: Scuba的简单介绍 Scuba的安装 :Windows安装 、Linux安装 Scuba的扫描及结果分析 一、什么是Scuba? Scuba是一款网络安全扫描工具,而非数据库扫描软件。Scuba支持对Web应用程序、操作系统、网络协议等进行扫描,以发现潜在的安全漏洞和风险,并提供详细的扫描结果报告…

VM及WindowsServer安装

目录 一.操作系统的简介及常用的操作系统 二.windows的安装 安装VMWare虚拟机 注意点一 ​编辑 注意点二 三.安装配置Windows Server 2012 R2 四、虚拟机的环境配置及连接 1. 主机连接虚拟机 2. 虚拟机环境配置及共享 3. 环境配置 一.操作系统的简介及常用的操作系…

心理咨询医院预约和挂号系统

源码下载地址 支持&#xff1a;远程部署/安装/调试、讲解、二次开发/修改/定制 系统分为&#xff1a;患者端、医生端、管理员端。 患者端 医生端 管理员端

基本的设备使用

一.微步的态势感知 经常使用的 威胁---实时监控 里面有重要信息 里面有威胁名称 还有攻击类型 威胁--告警主机 查看主机威胁 webshell 查看打到webshell 调查---攻击者分析 平台管理 ---审计日志 2.防火墙 华为 usg6000 策略---黑名单 风塔防火墙…

JVM相关面试题(每日一练)

1. 什么是垃圾回收机制&#xff1f; 垃圾收集 Garbage Collection 通常被称为“GC”&#xff0c;它诞生于1960年 MIT 的 Lisp 语言&#xff0c;经过半个多世纪&#xff0c;目前已经十分成熟了。 jvm 中&#xff0c;程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭&a…

深度解读MediaBox SDKs如何实现技术架构升级

本专栏将分享阿里云视频云MediaBox系列技术文章&#xff0c;深度剖析音视频开发利器的技术架构、技术性能、开发能效和最佳实践&#xff0c;一起开启音视频的开发之旅。本文为MediaBox技术架构篇&#xff0c;重点从音视频终端SDK的技术架构、优化设计、架构优势等方面&#xff…

卡巴斯基8(2009)杀毒软件

下载地址&#xff1a;https://user.qzone.qq.com/512526231/main https://user.qzone.qq.com/3503787372/main

简单8位CPU设计verilog微处理器,源码/视频

名称&#xff1a;8位CPU设计微处理器 软件&#xff1a;QuartusII 语言&#xff1a;Verilog 代码功能&#xff1a; 设计一个简单的处理器&#xff0c;可以实现加减法以及简单的逻辑运算。 设计包括程序计数器电路&#xff0c;指令存储器电路&#xff0c;指令译码器电路(控制器…

redis 配置主从复制,哨兵模式案例

哨兵(Sentinel)模式 1 . 什么是哨兵模式&#xff1f; 反客为主的自动版&#xff0c;能够自动监控master是否发生故障&#xff0c;如果故障了会根据投票数从slave中挑选一个 作为master&#xff0c;其他的slave会自动转向同步新的master&#xff0c;实现故障自动转义 2 . 原理…

(自适应手机端)生活家具产品网站模板下载-带三级子菜单栏目

(自适应手机端)生活家具产品网站模板下载 PbootCMS内核开发的网站模板&#xff0c;该模板适用于生活家具产品网站等企业&#xff0c;当然其他行业也可以做&#xff0c;只需要把文字图片换成其他行业的即可&#xff1b; 自适应手机端&#xff0c;同一个后台&#xff0c;数据即时…

JavaWeb——IDEA操作:Project最终新建module

在project中创建新的module&#xff1a; 创建一个新的module很容易&#xff0c;但是它可能连接不上Tomcat&#xff0c;因此需要修改一些配置&#xff1a; 将以下地址修改为新module的地址

ElasticSearch(ES)8.1及Kibana在docker环境下如何安装

ES基本信息介绍 Elasticsearch&#xff08;简称ES&#xff09;是一个开源的分布式搜索和分析引擎&#xff0c;最初由Elastic公司创建。它属于Elastic Stack&#xff08;ELK Stack&#xff09;的核心组件之一&#xff0c;用于实时地存储、检索和分析大量数据。 以下是Elastics…

八大排序算法(C语言版)之插入排序

八大排序详解 目录&#xff1a;一、排序的概念1.1 排序的概念1.2 排序的应用 二、直接插入排序三、希尔排序四、排序算法复杂度及稳定性分析 目录&#xff1a; 八大排序算法&#xff1a; #mermaid-svg-7qCaGEYz0Jyj9dYw {font-family:"trebuchet ms",verdana,arial,…

Win安装protobuf和IDEA使用protobuf插件

一、Win安装protobuf 1、下载编译器 protobuf下载地址&#xff1a;https://github.com/protocolbuffers/protobuf/releases 选择自己需要的版本下载&#xff0c;这里下载的是 protoc-3.19.1-win64.zip&#xff0c;下载之后进行解压即可。 2、配置环境变量 path 系统变量中添加…

用IntelliJ远程打断点调试

前提当然是本地和远程部署的代码一样。 记录下步骤&#xff1a; 1&#xff0c;用token登录kuboard&#xff0c;找到目标容器的IP&#xff1a; 2, 用上一步找到的IP等信息创建Remote JVM Debug: 3&#xff0c;打断点&#xff0c;wkb说要把断点此属性改为线程。我试了下似乎…

menuconfig 图形化配置原理说明二

一. 简介 之前一篇文章中&#xff0c;我们已经知道&#xff1a; scripts/kconfig/mconf 会调用 uboot 根目录下的 Kconfig 文件开始 构建图形化配置界面。 接下来简单学习一下 Kconfig 的语法。因为后面学习 Linux 驱动开发 时&#xff0c;可能会涉及到修改 Kconfig…