本节主要涉及imx6ull的时钟配置,包括arm内核时钟配置,外设时钟配置,以及imx6ull的时钟树设置。主要参考的是imx6ull的Reference(《IMX6ULL 参考手册》)。

目录

  • 一、时钟树
    • 1.配置主时钟
    • 2.配置其他PLL和PFD
    • 3. AHB、 IPG 和 PERCLK 根时钟设置
  • 二、编写程序

一、时钟树

      imxull的时钟来源于俩部分,一部分是实时时钟,32.768MHZ,用于提供RTC的时钟。另一部分是24MHZ的晶振,用于提供内核以及其他外设的时钟。我们的时钟树就是从24M时钟经过倍频,分频得来的,共有7路PLL。
      具体的时钟树就不放上来了,截图实在是看不清楚。其实就是通过设置一些寄存器,设置多路选择器和分频器,输出指定的频率。

1.配置主时钟

      我们将 I.MX6ULL 的主频设置为 528MHz。我们如果要设置2分屏的话,PLL1必须设置为1056M的输出。 ARM_PLL 是由CCM_ANALOG_PLL_ARM[DIV_SELECT]设置的,计算公式是PLL output frequency = Fref * DIV_SEL/2。所以 经过计算,CCM_ANALOG_PLL_ARM[DIV_SELECT]=88。2分屏的设置为CCM_CACRR[ARM_PODF]=0x2

      我们在设置主频的时侯需要先将主频设置为备用模式(必须得有一个主频,单片机才可以工作,即使是设置寄存器)。

从上图中可以看到先要设置CCSR[step_sel]=0,然后设置CCSR[pll1_sw_clk_sel]=1
所以综上所述;
1.CCSR[step_sel]=0; //备用时钟设置
2.CCSR[pll1_sw_clk_sel]=1; //切换备用时钟
3.CCM_ANALOG_PLL_ARM[DIV_SELECT]=88; //设置主频
4.CCM_CACRR[ARM_PODF]=0x1; //设置2分频
5.CCSR[pll1_sw_clk_sel]=0; //切换回主时钟

2.配置其他PLL和PFD

以下是我们要设置的PLL和PFD:

PLL2_PFD0的计算公式为528*18/PFD0_FRAC
CCM_ANALOG_PFD_528[PFD0_FRAC] = 0x1B; //PFD0=352M
CCM_ANALOG_PFD_528[PFD1_FRAC] = 0x10; //PFD1=594M
CCM_ANALOG_PFD_528[PFD2_FRAC] = 0x18; //PFD2=396M
CCM_ANALOG_PFD_528[PFD3_FRAC] = 0x20; //PFD3=297M

PLL2_PFD0的计算公式为480*18/PFD3_FRAC
CCM_ANALOG_PFD_480[PFD0_FRAC] = 0xC; //PFD0=720M
CCM_ANALOG_PFD_480[PFD1_FRAC] = 0x10; //PFD1=540M
CCM_ANALOG_PFD_480[PFD2_FRAC] = 0x11; //PFD2=508.2M
CCM_ANALOG_PFD_480[PFD3_FRAC] = 0x13; //PFD3=454.7M

3. AHB、 IPG 和 PERCLK 根时钟设置

设置完主频和其他PLL PFD之后我们还需要设置AHB_CLK_ROOT,IPG_CLK_ROOT,PERCLK_CLK_ROOT。AHB_CLK_ROOT 最高可以设置 132MHz,IPG_CLK_ROOT和PERCLK_CLK_ROOT最高可以设置66MHz。

#AHB_CLK_ROOT设置
CBCMR[PRE_PERIPH_CLK_SEL] = 01 //选择396M
CBCDR[PERIPH_CLK_SEL] =0 //需要握手信号
CBCDR[AHB_PODF]=010 //3分频,需要握手信号

#IPG_CLK_ROOT设置
CBCDR[IPG_PODF]=01 //设置2分频

#PERCLK_CLK_ROOT设置
CSCMR1[PERCLK_CLK_SEL] = 0 //多路选择
CSCMR1[PERCLK_PODF] = 000000 //1分频

寄存器 CCM_CDHIPR判断握手信号是否完成,1 握手没有完成,0握手完成。
在修改 arm_podf 和 ahb_podf 的时候需要先关闭其时钟输出,等修改完成以后再打开

二、编写程序

#include "bsp_clk.h"//使能时钟
int enable_clock(void){CCM->CCGR0 = 0xffffffff;CCM->CCGR1 = 0xffffffff;CCM->CCGR2 = 0xffffffff;CCM->CCGR3 = 0xffffffff;CCM->CCGR4 = 0xffffffff;CCM->CCGR5 = 0xffffffff;CCM->CCGR6 = 0xffffffff;return 0;
}void init_imx6u_clock(void){/*1.配置主时钟*/if(((CCM->CCSR>>2) & 0x1) == 0){//判断现在是否使用的是主时钟CCM->CCSR &= ~(1<<8);       //设置备用时钟CCM->CCSR |= 1<<2;          //切换到备用时钟}//设置主频CCM_ANALOG->PLL_ARM &= ~(0x7f);             //0-6位清零CCM_ANALOG->PLL_ARM |= (1<<13) | (88);       //0-6位设置为88,13位为使能位//设置2分频CCM->CACRR = 0x1;//切换回主时钟CCM->CCSR &= ~(1<<2);/*2.配置其他PLL和PFD*//*PPL2*/unsigned int reg = CCM_ANALOG->PFD_528;reg &= ~(0x3f3f3f3f);   //PFD每个Byte的0-5位清零reg |= 0x1b << 0;       //PFD0=352Mreg |= 0x10 << 8;       //PFD1=594Mreg |= 0x18 << 16;      //PFD2=396Mreg |= 0x20 << 24;      //PFD3=297MCCM_ANALOG->PFD_528 = reg;/*PPL3*/reg = CCM_ANALOG->PFD_480;reg &= ~(0x3f3f3f3f);   //PFD每个Byte的0-5位清零reg |= 0xC  << 0;       //PFD0=720Mreg |= 0x10 << 8;       //PFD1=540Mreg |= 0x11 << 16;      //PFD2=508.2Mreg |= 0x13 << 24;      //PFD3=454.7MCCM_ANALOG->PFD_480 = reg;/*3. AHB、 IPG 和 PERCLK 根时钟设置*/
#if 0/*AHB_CLK_ROOT设置为132M*/CCM->CBCMR &= (~(3 << 18)) | (1 << 18);     //选择396MCCM->CBCDR &= ~(1 << 25);while(CCM->CDHIPR & (1 << 5));              //等待握手完成CCM->CBCDR &= (~(7 << 10)) | (2 << 10);     //设置3分频while(CCM->CDHIPR & (1 << 1));              //等待握手完成
#endif/*IPG_CLK_ROOT设置为66M*/CCM->CBCDR &= (~(3 << 8)) | (1 << 8);       //设置2分频/*PERCLK_CLK_ROOT设置为66M*/CCM->CSCMR1 &= ~(1<<6);         //多路选择CCM->CSCMR1 &= ~(0x7);         //1分频 不是3F?
}

总结:I.MX6ULL的时钟系统还是很复杂的,本节我们也只是讲解了如何进行主频、PLL、 PFD 和一些总线时钟的设置。

(五)arm裸机开发---主频和时钟配置相关推荐

  1. ARM裸机开发:主频与时钟

    文章目录 ARM裸机开发:主频与时钟 一.时钟系统 1.1 外部时钟电路 1.2 7路PLL时钟源 1.3 时钟树概览 二.时钟配置 2.1 内核时钟设置 2.2 PFD时钟设置 2.3 AHB.IP ...

  2. ARM裸机开发——双机异步串行通信

    写在前面  本报告因为期末将至,后续还需要完成一次课程设计,故本次实验较为简单,完成的时间也非常匆忙,故文章内容较为单薄,也可能有着更多疏忽之处,还望大家海涵. 1. 项目任务  1) 利用S3C24 ...

  3. 正点原子ARM裸机开发篇

    裸机就是手动的操作硬件来实现驱动设备,后面会有驱动框架不需要这么麻烦 第八章 汇编 LED 灯实验 核心过程 通过汇编语言来控制硬件(驱动程序) 代码流程 1.使能 GPIO1 时钟 GPIO1 的时 ...

  4. IMX6ULL 主频和时钟配置

    NXP主频与时钟配置 寄存器简要说明 1.系统时钟来源 IMX6U系统时钟主要来源于两部分:32.768KHz 和 24MHz 的晶振. 32.768KHz 的晶振是 IMX6U 的 RTC 时钟源, ...

  5. Linux学习——总结ARM裸机开发步骤

    本文仅介绍一些基础概念. 我们常用的开发平台是在x86,这个是Intel推出的架构.在x86平台上的开发步骤,不管是什么软件,无外乎建立工程->写代码->保存->编译->运行, ...

  6. 基于Cortex-A7架构的嵌入式linux ARM裸机开发<2>——LED灯闪烁(C版本)

    文章目录 一.利用汇编初始化C环境 二.C语言部分实验程序编写 三.Makefile程序编写 四.链接脚本程序编写 五.编译及烧录 利用汇编编写LED灯点亮程序我们已经实现过了,所以这里不再着重讲解基 ...

  7. 6、I.MX6ULL学习笔记—主频和时钟配置

    一.硬件原理图分析 1.32.768KHz的晶振,供给RTC使用 2.在6U的T16和T17这两个IO上接24Mhz晶振. 二.I.MX6ULL系统时钟分析 1.7路PLL ARM_PLL(PLL1) ...

  8. ARM裸机开发篇2:ARM微处理器指令系统

    目录 ARM微处理器指令系统 ARM处理器寻址方式 数据处理指令寻址方式 内存访问指令寻址方式 ARM处理器指令集 数据操作指令 乘法指令 Load/Store指令 跳转指令 状态操作指令 协处理器指 ...

  9. 从51到ARM裸机开发实验(006)Exynos4412 GPIO实验

    本次实验基于Tiny4412开发板,开发板上有四个可编程控制的LED.四个按键.来实现这样一种场景:每个按键控制一盏LED,每按一次则对应的LED状态发生改变,按一次开灯,再按一次关灯.核心控制为三星 ...

最新文章

  1. CSS盒子模型(border、padding、margin、圆角边框、盒子阴影、文字阴影、新闻列表综合案例、新浪导航栏案例)
  2. 在子线程中弹土司的一段代码
  3. 爬虫实战:批量爬取京东内衣图片(自动爬取多页,非一页)
  4. Redis中的Lua 脚本
  5. 探索Julia(part10)--自定义函数
  6. 使用 VS 附加到进程 调试发布的网站
  7. pat乙级相当于什么水平_雅思6.5是什么水平?相当于托福多少分?
  8. Only a type can be imported解决方法
  9. 使用Navicat为数据库表建立触发器
  10. MySQL抛出 Lock wait timeout exceeded; try restarting transaction
  11. python中碰撞的代码_Python…Tkinter碰撞
  12. 欢迎关注微信公众号Android系统攻城狮,会持续分享技术输出!!!
  13. 国内外大数据经典案例研究
  14. java 事务回滚报rollback-only异常
  15. swiper 切换时间_改变Swiper切换和animate.js动画的时间曲线
  16. 曾经决心永不做游戏 但为何阿里巴巴的游戏之心一直死不了?
  17. android 多媒体列表,android – 使用Exoplayer的流媒体视频列表
  18. 关于android的广告词,关于android:随心译无广告的专属实时翻译神器
  19. IME输入法编程:第一章 Windows9x系统下汉字输入法的基本原理
  20. 关于WIN10系统无法打开CHM文件

热门文章

  1. C# dotnet 在内存中的 double 的 NAN 和正负无穷二进制是如何存
  2. 字节跳动 CEO 张一鸣炮轰 HR , “按这要求我自己都进不来!”
  3. win7 加载 usb3.0驱动
  4. mysql create definer_Mysql CREATE DEFINER
  5. 【PHP】Maximum execution time of seconds exceeded
  6. Docker面试题库
  7. Linux apr的安装
  8. ATM异地跨行取钱收费大比拼
  9. 新型4-(3H)-喹唑啉酮类作为VEGFR-2抑制剂对肝癌细胞具有潜在活性
  10. 强大的文本编辑器EmEditor最新版分享