IMX6LL|时钟控制

这篇具有很好参考价值的文章主要介绍了IMX6LL|时钟控制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.时钟控制模块

4个层次配置芯片时钟

  • 晶振时钟
  • PLL与PFD时钟
  • PLL选择时钟
  • 根时钟/外设时钟

1.1晶振时钟

系统时钟来源

  • RTC时钟源:32.768KHz,连接RTC模块,进行时间计算。
  • 系统时钟:24MHz,芯片主晶振

IMX6LL|时钟控制,fpga开发,单片机,嵌入式硬件

1.2PLL和PFD倍频时钟

7路锁相环电路

  • ARM_PLL:驱动 ARM 内核
  • 528_PLL:倍频参数固定为22,系统总线时钟
  • USB1_PLL:驱动第一个 USB 物理层
  • AUDIO_PLL:驱动音频接口
  • VIDEO_PLL:驱动视频接口
  • ENET_PLL:驱动外部以太网接口
  • USB2_PLL:驱动第二个 USB 物理层

10.3.1 Centralized components of clock management system
IMX6LL|时钟控制,fpga开发,单片机,嵌入式硬件

18.6 CCM Memory Map/Register Definition

  • CCM_ANALOG_PLL_XXX

    • 设置PPL时钟主频(pll1_main_clk)
    • 使能PLL时钟输出
  • CCM_ANALOG_PFD_XXX

    • 设置PPL下PFD的分频系数

1.3PLL选择时钟

对 PLL1 和 PLL3 的输出进行选择、对 PLL4 和 PLL5 进行分频

  • cpu内核时钟来于PLL1时钟。

  • 刚上电时,PLL1时钟未初始化,arm内核先使用24M晶振频率,等PLL1时钟稳定输出后,再切换回PLL1时钟。

CCM_CCSR:选择pll1_sw_clk、step_clk时钟源

  • step_clk时钟源设置为24M晶振
  • pll1_main_clk时钟源设置为 step_clk或pll1_main_clk

18.5.1.5.1 Clock Switcher

1.4外设时钟

给外设设置时钟源,外设时钟源是可以有多个选择的:

  • 梯形图标表示上一级时钟源配置
  • 正方形图标表示分频系数

图标旁边标明了相关寄存器

18.3 CCM Clock Tree

IMX6LL|时钟控制,fpga开发,单片机,嵌入式硬件

二.时钟模块编程流程

2.1设置晶振时钟

设置晶振时钟,实质上是让CPU运行PLL1时钟,将CPU运行到ARM PLL时钟上。因为CPU默认使用24MHz的芯片主晶振。

 /******************* 第一层时钟设置--晶振时钟***********************/

    /*CCM中包括很多关于时钟的寄存器 */

    if ((CCM->CCSR & (0x01 << 2)) == 0) //CPU 使用的是 ARM PLL

    {

        /*将CPU时钟切换到XTAL (OSC) 时钟*/                   

        CCM->CCSR &= ~(0x01 << 8); //控制CCSR: step_sel ,选择 osc_clk 作为时钟源

        CCM->CCSR |= (0x01 << 2);  //设置GLITCHLESS MUX 选择 step_clk 作为时钟源

    }

2.2设置PLL时钟

主要是设置七路PPL时钟



   /******************* 第二层时钟设置--PLL时钟***********************/

   

    /*设置PLL1输出时钟为792MHz,它将作为CPU时钟*/

    CCM_ANALOG->PLL_ARM |= (0x42 << 0);



    /*将CPU 时钟重新切换到 ARM PLL*/

    CCM->CCSR &= ~(0x01 << 2);



    /*设置时钟分频系数为0,即不分频*/

    CCM->CACRR &= ~(0x07 << 0); //清零分频寄存器   不分频

   //CCM->CACRR |= (0x07 << 0);     // 8分频





    /*设置PLL2(System PLL) 输出时钟*/

    /* Configure SYS PLL to 528M */

    CCM_ANALOG->PLL_SYS_SS &= ~(0x8000);     //使能PLL2 PFD输出

    CCM_ANALOG->PLL_SYS_NUM &= ~(0x3FFFFFFF);//设置分频系数为0,即不分频。

    CCM_ANALOG->PLL_SYS |= (0x2000); //使能PLL2 输出

    CCM_ANALOG->PLL_SYS |= (1 << 0); //设置输出频率为528M

    while ((CCM_ANALOG->PLL_SYS & (0x80000000)) == 0) //等待设置生效

    {

    }



    /*设置PLL3(System PLL) 输出时钟*/

    /* Configure USB PLL to 480M */

    CCM_ANALOG->PLL_USB1 |= (0x2000);    //使能 PLL3时钟输出

    CCM_ANALOG->PLL_USB1 |= (0x1000);    //PLL3上电使能

    CCM_ANALOG->PLL_USB1 |= (0x40);      // 使能USBPHYn

    CCM_ANALOG->PLL_USB1 &= ~(0x01 << 0);//设置输出频率为480MHz

    while ((CCM_ANALOG->PLL_SYS & (0x80000000)) == 0)//等待设置生效

    {

    }



    /*关闭暂时不使用的 PLL4 、PLL5  、PLL6 、PLL7*/

    CCM_ANALOG->PLL_AUDIO = (0x1000);    //关闭PLL4

    CCM_ANALOG->PLL_VIDEO = (0x1000);    //关闭PLL5

    CCM_ANALOG->PLL_ENET =  (0x1000);    //关闭PLL6

    CCM_ANALOG->PLL_USB2 =  (0x00);           //关闭PLL7


2.3设置PFD时钟

细分每一路的PLL时钟

    /******************第三层时钟设置--PFD*******************/

    /*禁用PLL2 的所有PFD输出*/

    CCM_ANALOG->PFD_528 |=(0x80U) ;      //关闭PLL2 PFD0

    CCM_ANALOG->PFD_528 |=(0x8000U) ;    //关闭PLL2 PFD1

    // CCM_ANALOG->PFD_528 |=(0x800000U) ;  //关闭PLL2 PFD2 ,DDR使用的是该时钟源,关闭后程序不能运行。暂时不关闭

    CCM_ANALOG->PFD_528 |=(0x80000000U); //关闭PLL2 PFD3

    

    /*设置PLL2 的PFD输出频率*/

    CCM_ANALOG->PFD_528 &= ~(0x3FU); //清零PLL2 PFD0 时钟分频

    CCM_ANALOG->PFD_528 &= ~(0x3F00U); //清零PLL2 PFD1 时钟分频

    CCM_ANALOG->PFD_528 &= ~(0x3F00U); //清零PLL2 PFD2 时钟分频

    CCM_ANALOG->PFD_528 &= ~(0x3F00U); //清零PLL2 PFD3 时钟分频



    CCM_ANALOG->PFD_528 |= (0x1B << 0); //设置PLL2 PFD0 输出频率为 352M

    CCM_ANALOG->PFD_528 |= (0x10 << 8); //设置PLL2 PFD0 输出频率为 594M

    CCM_ANALOG->PFD_528 |= (0x18 << 16); //设置PLL2 PFD0 输出频率为 396M

    CCM_ANALOG->PFD_528 |= (0x30 << 24); //设置PLL2 PFD0 输出频率为 198M



    /*启用PLL2 的所有PFD输出*/

    CCM_ANALOG->PFD_528 &= ~(0x80U) ;      //开启PLL2 PFD0

    CCM_ANALOG->PFD_528 &= ~(0x8000U) ;    //开启PLL2 PFD1

    CCM_ANALOG->PFD_528 &= ~(0x800000U) ;  //开启PLL2 PFD2

    CCM_ANALOG->PFD_528 &= ~(0x80000000U); //开启PLL2 PFD3





    /*禁用PLL3 的所有PFD输出*/

    CCM_ANALOG->PFD_480 |=(0x80U) ;      //关闭PLL3 PFD0

    CCM_ANALOG->PFD_480 |=(0x8000U) ;    //关闭PLL3 PFD1

    CCM_ANALOG->PFD_480 |=(0x800000U) ;  //关闭PLL3 PFD2

    CCM_ANALOG->PFD_480 |=(0x80000000U); //关闭PLL3 PFD3



    /*设置PLL3 的PFD输出频率*/

    CCM_ANALOG->PFD_480 &= ~(0x3FU);   //清零PLL3 PFD0 时钟分频

    CCM_ANALOG->PFD_480 &= ~(0x3F00U); //清零PLL3 PFD1 时钟分频

    CCM_ANALOG->PFD_480 &= ~(0x3F00U); //清零PLL3 PFD2 时钟分频

    CCM_ANALOG->PFD_480 &= ~(0x3F00U); //清零PLL3 PFD3 时钟分频



    CCM_ANALOG->PFD_480 |= (0xC << 0); //设置PLL3 PFD0 输出频率为 720M

    CCM_ANALOG->PFD_480 |= (0x10 << 8); //设置PLL3 PFD0 输出频率为 540M

    CCM_ANALOG->PFD_480 |= (0x11 << 16); //设置PLL3 PFD0 输出频率为 508.2M

    CCM_ANALOG->PFD_480 |= (0x13 << 24); //设置PLL3 PFD0 输出频率为 454.7M



    /*启用PLL3 的所有PFD输出*/

    CCM_ANALOG->PFD_480 &= ~(0x80U) ;      //开启PLL3 PFD0

    CCM_ANALOG->PFD_480 &= ~(0x8000U) ;    //开启PLL3 PFD1

    CCM_ANALOG->PFD_480 &= ~(0x800000U) ;  //开启PLL3 PFD2

    CCM_ANALOG->PFD_480 &= ~(0x80000000U); //开启PLL3 PFD3

  

2.4外设时钟设置

选择具体的时钟和最后的分频。文章来源地址https://www.toymoban.com/news/detail-804324.html



    /******************第四层时钟设置--外设****************/

    CCM->CSCDR1 &= ~(0x01 << 6); //设置UART选择 PLL3 / 6 = 80MHz

    CCM->CSCDR1 &= ~(0x3F);     //清零

    CCM->CSCDR1 |= ~(0x01 << 0); //设置串口根时钟分频值为1,UART根时钟频率为:80M / (dev + 1) = 40MHz

到了这里,关于IMX6LL|时钟控制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【IMX6ULL驱动开发学习】02.IMX6ULL烧写Linux系统

    由于我买的是正点原子的IMX6ULL阿尔法开发板,但是我是看韦东山老师视频学习的驱动 所以这里我烧录的方法是按照韦东山老师的课程来的 这里给出烧写Linux系统用到的工具 链接:https://pan.baidu.com/s/1bD-xxn3K8xQAVkJSaJmTzQ 提取码:af6w 下载解压后,可以看到烧写工具 烧写Linux系统

    2024年02月13日
    浏览(54)
  • 【IMX6ULL驱动开发学习】22.IMX6ULL开发板读取ADC(以MQ-135为例)

    IMX6ULL一共有两个ADC,每个ADC都有八个通道,但他们共用一个ADC控制器 在imx6ull.dtsi文件中已经帮我们定义好了adc1的节点部分信息 注意 num-channels = 2; ,这个表示指定使用ADC1的两个通道,即通道1和通道2 如果你要使用多个ADC通道,修改这个值即可 配置ADC引脚的 pinctrl ,在自己的

    2024年02月12日
    浏览(57)
  • 【IMX6ULL驱动开发学习】05.IMX6ULL驱动开发_编写第一个hello驱动【熬夜肝】

    经过以下四个步骤,终于可以开始驱动开发了 01.安装交叉编译环境【附下载地址】 02.IMX6ULL烧写Linux系统 03.设置IMX6ULL开发板与虚拟机在同一网段 04.IMX6ULL开发板与虚拟机互传文件 一、获取内核、编译内核 二、创建vscode工作区,添加内核目录和个人目录 三、了解驱动程序编写

    2024年02月06日
    浏览(48)
  • 【IMX6ULL驱动开发学习】03.设置IMX6ULL开发板与虚拟机在同一网段(设置开发板静态IP)

    为什么要设置IMX6ULL与虚拟机通信? 因为要把在虚拟机下编译的文件传到IMX6ULL开发板上运行 设置好同一网段,可以互ping后,可以参考这篇博客,实现开发板与虚拟机的文件互传 IMX6ULL开发板与虚拟机互传文件 一、设置windows有线网卡 二、配置虚拟机双网卡(原本有一个NAT网卡

    2024年02月07日
    浏览(52)
  • 【IMX6ULL驱动开发学习】15.IMX6ULL驱动开发问题记录(sleep被kill_fasync打断)

    发现问题的契机: 学习异步通知的时候,自己实现一个功能:按键控制蜂鸣器,同时LED灯在闪烁 结果:LED好像也同时被按键控制了 最后调试结果发现: 应用层的 sleep 被驱动层的 kill_fasync 打断,所以sleep没有执行完就重新进入下一次循环了 修改代码后解决该问题 解决逻辑就

    2024年02月13日
    浏览(49)
  • 【IMX6ULL驱动开发学习】08.IMX6ULL通过GPIO子系统函数点亮LED

    通过GPIO子系统函数点亮LED 1、GPIO子系统函数 1.1 确定 led 的GPIO标号,查看内核中的gpiochip 查看 gpiochip ,以正点原子的IMX6ULL阿尔法开发板为例 查看原理图,发现led接的引脚是 GPIO1_IO3,对应 /sys/kernel/debug/gpio 中的 gpiochip0 组,gpiochip0 组从0开始算起, 所以 GPIO1_IO3 对应的标号就

    2024年02月10日
    浏览(75)
  • [imx6ull]开发板多种连网方式精讲

    在使用IGKBoard开发板时,因为没有网络,所以交叉编译遇到了困难,于是我研究了两种IGKBoard的连网方式,因为我们的IGKBoard有两个以太网接口,并且有一个板载RealTek WiFi模块,分别可以通过网线让IGKBoard开发板连上网,也可以通过WiFi让开发板连接上网,下面就让我来对这两种

    2024年02月16日
    浏览(39)
  • 【IMX6ULL驱动开发学习】19.mmap内存映射

    mmap将一个文件或者其它对象映射进内存 ,使得应用层可以直接读取到驱动层的数据,无需通过copy_to_user函数 可以用于像LCD这样的外设, 需要读写大量数据的 一、应用层 mmap用法: 用open系统调用打开文件, 并返回描述符fd. 用mmap建立内存映射, 并返回映射首地址指针start. 对映

    2024年02月16日
    浏览(48)
  • 【imx6ul开发板通过-USBOTG虚拟网口连接电脑上网】

    本博主使用的是imx6ull迅为的开发板。我们需要准备一个imx6ull开发板,不同的开发板硬件属性(引脚可能不同)但是,只要看了本章,是可以照葫芦画瓢,配置成功的。 首先,我们先从网络上获取一些知识,什么是RNDIS,我们需要知道RNDIS可以使得电脑或者PC机通过rndis共享网

    2024年04月29日
    浏览(55)
  • 【IMX6ULL驱动开发学习】12.Linux驱动之设备树

    承接上一篇博客 【IMX6ULL驱动开发学习】11.驱动设计之面向对象_分层思想(学习设备树过渡部分) 代码获取: https://gitee.com/chenshao777/imx6-ull_-drivers 我后面将三个层合并了(实际上只有前两层),合并成一个dev_drv.c了,暂时没有加GPIO操作,只是个框架 合并前的代码在 11.butt

    2024年02月13日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包