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 */
  /* 省略掉其它代码 */
 }

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

目录
相关文章
|
5月前
|
Ubuntu Linux Anolis
Linux系统禁用swap
本文介绍了在新版本Linux系统(如Ubuntu 20.04+、CentOS Stream、openEuler等)中禁用swap的两种方法。传统通过注释/etc/fstab中swap行的方式已失效,现需使用systemd管理swap.target服务或在/etc/fstab中添加noauto参数实现禁用。方法1通过屏蔽swap.target适用于新版系统,方法2通过修改fstab挂载选项更通用,兼容所有系统。
500 3
Linux系统禁用swap
|
5月前
|
Linux
Linux系统修改网卡名为eth0、eth1
在Linux系统中,可通过修改GRUB配置和创建Udev规则或使用systemd链接文件,将网卡名改为`eth0`、`eth1`等传统命名方式,适用于多种发行版并支持多网卡配置。
1007 3
|
6月前
|
Ubuntu Linux
计算机基础知识:linux系统怎么安装?
在虚拟机软件中创建一个新的虚拟机,并选择相应操作系统类型和硬盘空间大小等参数。将下载的 ISO 镜像文件加载到虚拟机中。启动虚拟机,进入安装界面,并按照步骤进行安装。安装完成后,可以在虚拟机中使用 Linux 系统。
|
6月前
|
存储 Ubuntu Linux
「正点原子Linux连载」第二章Ubuntu系统入门
在图2.8.2.4中,我们使用命令umount卸载了U盘,卸载以后当我们再去访问文件夹/mnt/tmp的时候发现里面没有任何文件了,说明我们卸载成功了。
|
6月前
|
Ubuntu 物联网 Linux
从零安装一个Linux操作系统几种方法,以Ubuntu18.04为例
一切就绪后,我们就可以安装操作系统了。当系统通过优盘引导起来之后,我们就可以看到跟虚拟机中一样的安装向导了。之后,大家按照虚拟机中的顺序安装即可。 好了,今天主要介绍了Ubuntu Server版操作系统的安装过程,关于如何使用该操作系统,及操作系统更深层的原理,还请关注本号及相关圈子。
|
Ubuntu Linux 网络安全
Linux系统初始化脚本
一款支持Rocky、CentOS、Ubuntu、Debian、openEuler等主流Linux发行版的系统初始化Shell脚本,涵盖网络配置、主机名设置、镜像源更换、安全加固等多项功能,适配单/双网卡环境,支持UEFI引导,提供多版本下载与持续更新。
596 3
Linux系统初始化脚本
|
6月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
432 18
|
5月前
|
安全 Linux Shell
Linux系统提权方式全面总结:从基础到高级攻防技术
本文全面总结Linux系统提权技术,涵盖权限体系、配置错误、漏洞利用、密码攻击等方法,帮助安全研究人员掌握攻防技术,提升系统防护能力。
557 1
|
5月前
|
监控 安全 Linux
Linux系统提权之计划任务(Cron Jobs)提权
在Linux系统中,计划任务(Cron Jobs)常用于定时执行脚本或命令。若配置不当,攻击者可利用其提权至root权限。常见漏洞包括可写的Cron脚本、目录、通配符注入及PATH变量劫持。攻击者通过修改脚本、创建恶意任务或注入命令实现提权。系统管理员应遵循最小权限原则、使用绝对路径、避免通配符、设置安全PATH并定期审计,以防范此类攻击。
1179 1
|
6月前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
1962 10