Linux系统中操作芯片时钟的基本方法

简介: Linux系统中操作芯片时钟的基本方法

860488d0e9184ebeb50ea00858a7b7e4.png

第一:时钟系统分析

     每款芯片都有自己的主频,有的时候需要把主频设置到合适的值,才能发挥它的最大性能.

3d3019e7bdba63d371b603f98ef633b6.png

可以看出,开发板的系统时钟来源于两个部分:32.768KHz和24MHz的晶振,其中32.768KHz晶振是RTC的时钟源,24MHz晶振是内核和其他外设的时钟源。

第二:7路PLL时钟源分析

 芯片的外设有很多,不同的外设时钟源不同, 先对这些外设的时钟源进行分组,一共有7组,这7组时钟源都是从24MHz晶振PLL而来的。每款芯片都有自己的时钟树,详细的时钟图如下:

78c0fb2154dafc9de97461c39da6f28a.png

  一共有三部分:CLOCK_SWITCHER、CLOCK ROOT GENERATOR 和 SYSTEM CLOCKS。左边的CLOCK_SWITCHER就是7路PLL和8路PFD,右边的是SYSTEM CLOCKS 就是芯片外设,中间的CLOCK ROOT GENERATOR 是最 复杂的!这一部分就像“月老”一样。芯片的时钟系统还是很复杂的,大家学习的时候要结合芯片的参考手册的结构图来学习,这里主要进行主频、PLL和一些总线时钟的设置。

第三:实验程序编写

      配置系统的时钟,可以自己设定相应的系统时钟,修改内容如下:

#include "bsp_clk.h"
//使能所有的外设时钟
void clk_enable(void)
 {
   CCM->CCGR0 = 0XFFFFFFFF;
   CCM->CCGR1 = 0XFFFFFFFF;
   CCM->CCGR2 = 0XFFFFFFFF;
   CCM->CCGR3 = 0XFFFFFFFF;
   CCM->CCGR4 = 0XFFFFFFFF;
   CCM->CCGR5 = 0XFFFFFFFF;
   CCM->CCGR6 = 0XFFFFFFFF;
}
//初始化系统时钟,按照手册推荐
void imx6u_clkinit(void)
{
     unsigned int reg = 0;
     if((((CCM->CCSR) >> 2) & 0x1 ) == 0) /* pll1_main_clk */
 { 
 CCM->CCSR &= ~(1 << 8); /* 配置 step_clk 时钟源为 24MHz OSC */ 
 CCM->CCSR |= (1 << 2); /* 配置 pll1_sw_clk 时钟源为 step_clk */
}
   CCM_ANALOG->PLL_ARM = (1 << 13) | ((88 << 0) & 0X7F);
   CCM->CCSR &= ~(1 << 2);/* 将 pll_sw_clk 时钟切换回 pll1_main_clk */
   CCM->CACRR = 1; /* ARM 内核时钟为 pll1_sw_clk/2=1056/2=528Mhz */
/* 2、设置 PLL2(SYS PLL)各个 PFD */
   reg = CCM_ANALOG->PFD_528;
   reg &= ~(0X3F3F3F3F); /* 清除原来的设置 */
   reg |= 32<<24; /* PLL2_PFD3=528*18/32=297Mhz */
   reg |= 24<<16; /* PLL2_PFD2=528*18/24=396Mhz */
   reg |= 16<<8; /* PLL2_PFD1=528*18/16=594Mhz */
   reg |= 27<<0; /* PLL2_PFD0=528*18/27=352Mhz */
   CCM_ANALOG->PFD_528=reg; /* 设置 PLL2_PFD0~3 */
}

   最终在main函数里面调用imx6u_clkinit来初始化时钟。

int main(void)
 {
  int i = 0;
  int keyvalue = 0;
  unsigned char led_state = OFF;
  unsigned char beep_state = OFF;
   imx6u_clkinit(); /* 初始化系统时钟 */
   clk_enable(); /* 使能所有的时钟 */
   led_init(); /* 初始化 led */
   beep_init(); /* 初始化 beep */
   key_init(); /* 初始化 key */
  /* 省略掉其它代码 */
 }

总结:将代码烧录板子之后,明显的可以看到代码的执行速度加快。时钟树的底层控制,在芯片控制方面是非常重要的,熟悉它很有必要。

目录
相关文章
|
2月前
|
Ubuntu Linux
计算机基础知识:linux系统怎么安装?
在虚拟机软件中创建一个新的虚拟机,并选择相应操作系统类型和硬盘空间大小等参数。将下载的 ISO 镜像文件加载到虚拟机中。启动虚拟机,进入安装界面,并按照步骤进行安装。安装完成后,可以在虚拟机中使用 Linux 系统。
|
2月前
|
存储 Ubuntu Linux
「正点原子Linux连载」第二章Ubuntu系统入门
在图2.8.2.4中,我们使用命令umount卸载了U盘,卸载以后当我们再去访问文件夹/mnt/tmp的时候发现里面没有任何文件了,说明我们卸载成功了。
|
2月前
|
Ubuntu 物联网 Linux
从零安装一个Linux操作系统几种方法,以Ubuntu18.04为例
一切就绪后,我们就可以安装操作系统了。当系统通过优盘引导起来之后,我们就可以看到跟虚拟机中一样的安装向导了。之后,大家按照虚拟机中的顺序安装即可。 好了,今天主要介绍了Ubuntu Server版操作系统的安装过程,关于如何使用该操作系统,及操作系统更深层的原理,还请关注本号及相关圈子。
|
2月前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
774 10
|
2月前
|
安全 Linux 数据安全/隐私保护
为Linux系统的普通账户授予sudo访问权限的过程
完成上述步骤后,你提升的用户就能够使用 `sudo`命令来执行管理员级别的操作,而无需切换到root用户。这是一种更加安全和便捷的权限管理方式,因为它能够留下完整的权限使用记录,并以最小权限的方式工作。需要注意的是,随意授予sudo权限可能会使系统暴露在风险之中,尤其是在用户不了解其所执行命令可能带来的后果的情况下。所以在配置sudo权限时,必须谨慎行事。
324 0
|
2月前
|
Ubuntu Linux 开发者
国产 Linux 发行版再添新成员,CutefishOS 系统简单体验
当然,系统生态构建过程并不简单,不过为了帮助国产操作系统优化生态圈,部分企业也开始用国产操作系统替代 Windows,我们相信肯定会有越来越多的精品软件登录 Linux 平台。
120 0
|
2月前
|
Ubuntu 安全 Linux
Linux系统入门指南:从零开始学习Linux
Shell脚本是一种强大的自动化工具,可以帮助您简化重复的任务或创建复杂的脚本程序。了解Shell脚本的基本语法和常用命令,以及编写和运行Shell脚本的步骤,将使您更高效地处理日常任务。
210 0
|
2月前
|
Ubuntu Linux 图形学
Linux学习之Linux桌面系统有哪些?
Cinnamon:与MATE类似,Cinnamon 拥有 GNOME 和 Unity 等其它桌面环境所没有的种种功能,是高度可定制的桌面环境,不需要任何外部插件、窗口组件和调整工具来定制桌面。
126 0
|
2月前
|
Ubuntu 安全 Linux
十款常用Linux系统介绍
本文不是什么大盘点。市面上有好几百款发行版,每款发行版在某个方面都与众不同。不可能在此全部罗列,本文只罗列了十款最常见的Linux发行版(世界上只有两种人,一种是懂二进制的,另一种是不懂二进制的)。请宣传Linux的魅力或威力。
|
2月前
|
Ubuntu 安全 Linux
linux系统|Ubuntu 18.10 如期正式发布,新面孔新技术都来了
微软公司也终于沉不住气要在linux开源系统开疆扩土了。mscode这样的工具的确好用,虽然差第一名那么一点儿,但是最老版的公司出版的软件的确很是让人动心!