Linux-ubuntu之主频和时钟配置

Linux-ubuntu之主频和时钟配置

一,主频

24MHz 晶振为内核和其它外设提供时钟源,经电路后到PLL1变为996MHZ,再经过CACRR(ARM_PODF)2分频,变为498MHZ。内部电路:
进行频率更改时,更改的过程要找个频率先顶着,即step_clk。先判断为CCSR的pll1_sw_clk_sel比特位为0(Pll1_main_clk),切换频率,先用step_clk,选择CCSR的step_sel,设置频率即寄存器 CCM_ANALOG_PLL_ARMn,使能并且设置低位,设置完后,切换到Pll1_main_clk。

c 复制代码
	/*配置主频*/
	if(((CCM->CCSR >> 2)&0x01)==0)//pll1_main_clock
	{
		CCM->CCSR &= ~(1<<8);//CCSRde step_sel设置0
		CCM->CCSR |= (1<<2);//设置为step_clock模式
	}

	CCM_ANALOG->PLL_ARM = (1<<13) |((66<<0) & 0x7f);//设置频率1000MHZ,使能
	CCM->CCSR &= ~(1<<2);//打开pll1_main_clk
	CCM->CACRR =0;//设置1分频
	/*配置PLL和PFD,主要是PLL2和PLL3*/

二,其它时钟配置

1.PLL2和PLL3的PFD0-3设置

PLL2的PDF由CCM_ANALOG_PFD_528n控制,读取值后,根据公式 528*18/PFD0_FRAC计算。

c 复制代码
	unsigned int reg=0;
	reg = CCM_ANALOG->PFD_528;
	reg = reg & (~(0x3f3f3f3f));//将PFD0-3的频率清零
	reg = reg | (32<<24);//PLL2---PFD3=297MHZ  528*18/297=32
	reg = reg | (24<<16);//PLL2---PFD2=396MHZ
	reg = reg | (16<<8);//PLL2---PFD1=594MHZ
	reg = reg | (27<<0);//PLL2---PFD0=352MHZ
	CCM_ANALOG->PFD_528 = reg;

	reg = CCM_ANALOG->PFD_480;
	reg = reg & (~(0x3f3f3f3f));//将PFD0-3的频率清零
	reg = reg | (19<<24);//PLL3---PFD3=297MHZ
	reg = reg | (17<<16);//PLL3---PFD2=396MHZ
	reg = reg | (16<<8);//PLL3---PFD1=594MHZ
	reg = reg | (12<<0);//PLL3---PFD0=352MHZ
	CCM_ANALOG->PFD_480 = reg;

2.AHB_CLK_ROOT

AHB_CLK_ROOT的时钟源是PLL2_PFD2,因此①选择1,②选择0,③选择分频,由于PLL2_PFD2是396MHZ,AHB_CLK_ROOT想要132MHZ,选择三分频。

c 复制代码
/*AHB_CLOCK_ROOT 132MHZ*/
	CCM->CBCMR =CCM->CBCMR & (~(3<<18));//清除为0
	CCM->CBCMR =CCM->CBCMR | (1<<18);//选用PPL2_PFD2时钟源
	CCM->CBCDR =CCM->CBCDR & (~(1<<25));//选择信号
	while(CCM->CDHIPR & (1 << 5));//只有开关允许,才将其写入

3.IPG 和 PERCLK时钟

IPG_CLK_ROOT和PERCLK_CLK_ROOT要的是66MHZ,AHB_CLK_ROOT是132MHZ。对于IPG_CLK_ROOT,先读取将CBCDR的IPG_PODF,再将CBCDR的IPG_PODF比特位设置为二分即可。对于PERCLK_CLK_ROOT,设置来着OSC,再将CSCMR1设置为1分频。

c 复制代码
	/*IPG_CLK_ROOT 66MHZ*/
	CCM->CBCDR =CCM->CBCDR & (~(3<<8));//读取BIT:IPG_PODF
	CCM->CBCDR =CCM->CBCDR | (1<<8);//设置2分频
	/*PER_CLK_ROOT  66MHZ*/
	CCM->CSCMR1 &= ~(1 << 6);	//设置来自OSC
	CCM->CSCMR1 &= ~(7 << 0);    //设置1分频

三,总结

时钟利用树这种结构,将24MHZ的晶振,利用寄存器进行相关数值和使能配置,实现倍频,然后在利用各种分频实现不同频率的时钟,就像先由晶振产生PLL时钟源,再利用类似门控的选择信号以及分频,到AHB,再对AHB频率进行选择分频,实现IPG 和 PERCLK时钟 ,从而应用。就像由一个源头,再依次往下,形成使用各种外设和设备的时钟信号。

相关推荐
.YM.Z9 分钟前
C语言——文件操作
c语言·文件操作
代码总长两年半13 分钟前
STM32物联网项目---ESP8266微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制---代码篇(四)
stm32·单片机·物联网
对你无可奈何28 分钟前
关于Ubuntu的 update造成的内核升级
运维·服务器·ubuntu
玉~你还好吗1 小时前
【嵌入式电机控制#进阶10】参数辨识(一):电阻辨识
单片机·嵌入式硬件
GanGuaGua1 小时前
Linux系统:线程的互斥和安全
linux·运维·服务器·c语言·c++·安全
猫头虎1 小时前
2025最新超详细FreeRTOS入门教程:第八章 FreeRTOS任务通知
stm32·单片机·嵌入式硬件·物联网·硬件架构·51单片机·硬件工程
学生董格1 小时前
[嵌入式embed]Keil5烧录后STM32不自动运行,复位才能运行
stm32·单片机·嵌入式硬件
lsnm1 小时前
【LINUX网络】IP——网络层
linux·服务器·网络·c++·网络协议·tcp/ip
不掰手腕1 小时前
在UnionTech OS Server 20 (统信UOS服务器版) 上离线安装PostgreSQL (pgsql) 数据库
linux·数据库·postgresql
Lynnxiaowen2 小时前
今天继续昨天的正则表达式进行学习
linux·运维·学习·正则表达式·云计算·bash