嵌入式Linux裸機開發筆記8(IMX6ULL)主頻和時鐘配置實驗(1)

引言

????????在前幾章實驗中我們都沒有涉及到 I.MX6U 的時鐘和主頻配置操作,全部使用的默認配置,
默認配置下 I.MX6U 工作頻率為 396MHz。但是 I.MX6U 系列標準的工作頻率為 528MHz,有些
型號甚至可以工作到 696MHz。本章學習 I.MX6U 的時鐘系統,學習如何配置 I.MX6U
系統時鐘和其他的外設時鐘,使其工作頻率為 528MHz,其他的外設時鐘源都工作在 NXP 推薦
的頻率。

8.1 I.MX6U 時鐘系統詳解

????????I.MX6U 的系統主頻為 528MHz,有些型號可以跑到 696MHz,但是默認情況下內部 boot
rom 會將 I.MX6U 的主頻設置為 396MHz。我們在使用 I.MX6U 的時候肯定是要發揮它的最大性能,那么主頻肯定要設置到 528MHz(其它型號可以設置更高, 比如 696MHz),其它的外設時鐘也要設置到 NXP 推薦的值。

8.1.1 系統時鐘來源

????????打開 I.MX6U-ALPHA 開發板原理圖,開發板時鐘原理圖如圖 8.1.1.1 所示:

圖 8.1.1.1 開發板時鐘原理圖
????????從圖8.1.1.1 可以看出 I.MX6U-ALPHA 開發板的系統時鐘來源于兩部分:32.768KHz 和24MHz 的晶振,其中 32.768KHz 晶振是 I.MX6U RTC 時鐘源,24MHz 晶振是 I.MX6U 內核和其它外設的時鐘源,也是我們重點要分析的。

8.1.2 7PLL時鐘源

????????I.MX6U 的外設有很多,不同的外設時鐘源不同,NXP 將這些外設的時鐘源進行了分組,
一共有 7 組,這 7 組時鐘源都是從 24MHz 晶振 PLL 而來的,因此也叫做 7 PLL,這 7 PLL
結構如圖 8.1.1.2 所示:

圖 8.1.2.1 初級 PLLs 時鐘源生成圖
????????圖8.1.2.1 展示了 7 PLL 的關系,我們依次來看一下這 7 PLL 都是什么做什么的:
????????①、 ARM_PLLPLL1),此路 PLL 是供 ARM 內核使用的,ARM 內核時鐘就是由此 PLL
生成的,此 PLL 通過編程的方式最高可倍頻到 1.3GHz
????????②、528_PLL(PLL2),此路 PLL 也叫做 System_PLL,此路 PLL 是固定的 22 倍頻,不可編
程修改。因此,此路 PLL 時鐘=24MHz * 22 = 528MHz,這也是為什么此 PLL 叫做 528_PLL
原因。此 PLL 分出了 4 PFD,分別為:PLL2_PFD0~PLL2_PFD3,這 4 PFD 528_PLL
共同作為其它很多外設的根時鐘源。通常 528_PLL 和這 4 PFD I.MX6U 內部系統總線的
時鐘源,比如內處理邏輯單元、DDR 接口、NAND/NOR 接口等等。
????????③、USB1_PLL(PLL3),此路 PLL 主要用于 USBPHY,此 PLL 也有四路 PFD,為:
PLL3_PFD0~PLL3_PFD3USB1_PLL 是固定的 20 倍頻,因此 USB1_PLL=24MHz *20=480MHz
USB1_PLL雖然主要用于USB1PHY,但是其和四路PFD同樣也可以作為其他外設的根時鐘源。
????????④、USB2_PLL(PLL7,沒有寫錯!就是 PLL7,雖然序號標為 4,但是實際是 PLL7),看名
字就知道此路PLL是給USB2PHY 使用的。同樣的,此路PLL固定為20倍頻,因此也是480MHz
????????⑤、ENET_PLL(PLL6),此路 PLL 固定為 20+5/6 倍頻,因此 ENET_PLL=24MHz * (20+5/6)
= 500MHz。此路 PLL 用于生成網絡所需的時鐘,可以在此 PLL 的基礎上生成 25/50/100/125MHz
的網絡時鐘。
????????⑥、VIDEO_PLL(PLL5),此路 PLL 用于顯示相關的外設,比如 LCD,此路 PLL 的倍頻可以
調整,PLL 的輸出范圍在 650MHz~1300MHz。此路 PLL 在最終輸出的時候還可以進行分頻,
可選 1/2/4/8/16 分頻。
????????⑦、AUDIO_PLL(PLL4),此路 PLL 用于音頻相關的外設,此路 PLL 的倍頻可以調整,PLL
的輸出范圍同樣也是 650MHz~1300MHz,此路 PLL 在最終輸出的時候也可以進行分頻,可選
1/2/4 分頻。

8.1.3 時鐘樹簡介

????????在上一小節講解了 7 PLLI.MX6U 的所有外設時鐘源都是從這 7 PLL 和有些 PLL
PFD 而來的,這些外設究竟是如何選擇 PLL 或者 PFD 的?這個就要借助《IMX6ULL 參考手
冊》里面的時鐘樹了,如圖 8.1.3.1 所示:
圖 8.1.3.1 I.MX6U 時鐘樹
????????在圖 8.1.3.1 中一共有三部分:CLOCK_SWITCHERCLOCK ROOT GENERATOR
SYSTEM CLOCKS。其中左邊的 CLOCK_SWITCHER 就是我們上一小節講解的那 7 PLL
8 PFD,右邊的 SYSTEM CLOCKS 就是芯片外設,中間的 CLOCK ROOT GENERATOR 是最
復雜的!這一部分就像“月老”一樣,給左邊的CLOCK_SWITCHER和右邊的SYSTEM CLOCKS
進行牽線搭橋。外設時鐘源是有多路可以選擇的,CLOCK ROOT GENERATOR 就負責從 7
PLL 8 PFD 中選擇合適的時鐘源給外設使用。具體操作肯定是設置相應的寄存器,我們以
ESAI 這個外設為例,ESAI 的時鐘圖如圖 8.1.3.2 所示:
圖 8.1.3.2 ESAI 時鐘????????
????????在圖 8.1.3.2 中我們分為了 3 部分,這三部分如下:
????????①、此部分是時鐘源選擇器,ESAI 4 個可選的時鐘源:PLL4PLL5PLL3_PFD2
pll3_sw_clk 。具體選擇哪一路作為ESAI的時鐘源是由寄存器CCM->CSCMR2的ESAI_CLK_SEL 位來決定的,用戶可以自由配置,配置如圖 8.1.3.3 所示:
圖 8.1.3.3 寄存器 CSCMR2 ESAI_CLK_SEL
????????②、此部分是 ESAI 時鐘的前級分頻,分頻值由寄存器 CCM_CS1CDR ESAI_CLK_PRED
來確定的,可設置 1~8 分頻,假如現在 PLL4=650MHz,我們選擇 PLL4 作為 ESAI 時鐘,前級
分頻選擇 2 分頻,那么此時的時鐘就是 650/2=325MHz
????????③、此部分又是一個分頻器,對②中輸出的時鐘進一步分頻,分頻值由寄存器CCM_CS1CDR 的 ESAI_CLK_PODF 來決定,可設置 1~8 分頻。假如我們設置為 8 分頻的話,
經過此分頻器以后的時鐘就是 325/8=40.625MHz。因此最終進入到 ESAI 外設的時鐘就是
40.625MHz
????????上面我們以外設 ESAI 為例講解了如何根據圖 8.1.3.1 來設置外設的時鐘頻率,其他的外
設基本類似的。

8.1.4 內核時鐘設置

????????I.MX6U 的時鐘系統前面幾節已經分析的差不多了,現在就可以開始設置相應的時鐘頻率
了。先從主頻開始,我們將 I.MX6U 的主頻設置為 528MHz,根據圖 8.1.3.2 的時鐘樹可以看到
ARM 內核時鐘如圖 8.1.4.1 所示:
圖 8.1.4.1 ARM 內核時鐘樹????????
????????在圖 8.1.4.1 中各部分如下:
????????①、內核時鐘源來自于 PLL1,假如此時 PLL1 996MHz
????????②、通過寄存器 CCM_CACRR ARM_PODF 位對 PLL1 進行分頻,可選擇 1/2/4/8 分頻,
假如我們選擇 2 分頻,那么經過分頻以后的時鐘頻率是 996/2=498MHz
????????③、大家不要被此處的 2 分頻給騙了,此處沒有進行 2 分頻(我就被這個2分頻騙了好久,
主頻一直配置不正確!)
????????④、經過第②步 2 分頻以后的 498MHz 就是 ARM 的內核時鐘,也就是 I.MX6U 的主頻。
經過上面幾步的分析可知,假如我們要設置內核主頻為 528MHz,那么 PLL1 可以設置為
1056MHz,寄存器 CCM_CACRR ARM_PODF 位設置為 2 分頻即可。同理,如果要將主頻設
置為 696MHz,那么 PLL1 就可以設置為 696MHzCCM_CACRR ARM_PODF 設置為 1
頻即可。現在問題很清晰了,寄存器 CCM_CACRR ARM_PODF 位很好設置,PLL1 的頻率
可以通過寄存器 CCM_ANALOG_PLL_ARMn 來設置。接下來詳細的看一下 CCM_CACRR
CCM_ANALOG_PLL_ARMn 這兩個寄存器,CCM_CACRR 寄存器結構如圖 8.1.4.2 所示:

圖 8.1.4.2 寄存器 CCM_CACRR
????????寄存器 CCM_CACRR 只有 ARM_PODF 位,可以設置為 0~7,分別對應 1~8 分頻。如果要
設置為2分頻的話CCM_CACRR就要設置為1。再來看一下寄存器CCM_ANALOG_PLL_ARMn
此寄存器結構如圖 8.1.4.3 所示:

圖 8.1.4.3 寄存器 CCM_ANALOG_PLL_ARMn
????????在寄存器 CCM_ANALOG_PLL_ARMn 中重要的位如下:
????????ENABLE: 時鐘輸出使能位,此位設置為 1 使能 PLL1 輸出,如果設置為 0 的話就關閉 PLL1
輸出。
????????DIV_SELECT: 此位設置 PLL1 的輸出頻率,可設置范圍為:54~108PLL1 CLK = Fin *
div_seclec/2.0Fin=24MHz。如果 PLL1 要輸出 1056MHz 的話,div_select 就要設置為 88
在修改 PLL1 時鐘頻率的時候我們需要先將內核時鐘源改為其他的時鐘源,PLL1 可選擇的
時鐘源如圖 8.1.4.4 所示:

圖 8.1.4.4 PLL1 時鐘開關
????????①、pll1_sw_clk 也就是 PLL1 的最終輸出頻率。
????????②、此處是一個選擇器,選擇 pll1_sw_clk 的時鐘源,由寄存器 CCM_CCSR
PLL1_SW_CLK_SEL 位決定 pll1_sw_clk 是選擇 pll1_main_clk 還是 step_clk。正常情況下應該
選擇 pll1_main_clk,但是如果要對 pll1_main_clk(PLL1)的頻率進行調整的話,比如我們要設置
PLL1=1056MHz,此時就要先將 pll1_sw_clk 切換到 step_clk 上。等 pll1_main_clk 調整完成以后
再切換回來。
????????③、此處也是一個選擇器,選擇 step_clk 的時鐘源,由寄存器 CCM_CCSR STEP_SEL 位來決定 step_clk 是選擇 osc_clk 還是 secondary_clk。一般選擇 osc_clk,也就是 24MHz 的晶振。這里我們就用到了一個寄存器 CCM_CCSR,此寄存器結構如圖 8.1.4.5 所示:

圖 8.1.4.5 寄存器 CCM_CCSR 結構圖
????????寄存器 CCM_CCSR 我們只用到了 STEP_SELPLL1_SW_CLK_SEL 這兩個位,一個是用
來選擇 step_clk 時鐘源的,一個是用來選擇 pll1_sw_clk 時鐘源的。
????????到這里,修改 I.MX6U 主頻的步驟就很清晰了,修改步驟如下:
????????①、 設置寄存器 CCSR STEP_SEL 位,設置 step_clk 的時鐘源為 24M 的晶振。
????????②、設置寄存器 CCSR PLL1_SW_CLK_SEL 位,設置 pll1_sw_clk 的時鐘源為
step_clk=24MHz,通過這一步我們就將 I.MX6U 的主頻先設置為 24MHz,直接來自于外部的
24M 晶振。
????????③、設置寄存器 CCM_ANALOG_PLL_ARMn,將 pll1_main_clk(PLL1)設置為 1056MHz
????????④、設置寄存器 CCSR PLL1_SW_CLK_SEL 位,重新將 pll1_sw_clk 的時鐘源切換回
pll1_main_clk,切換回來以后的 pll1_sw_clk 就等于 1056MHz
????????⑤、最后設置寄存器 CCM_CACRR ARM_PODF 2 分頻,I.MX6U 的內核主頻就為
1056/2=528MHz。????????

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90927.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90927.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90927.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

設計模式(四)創建型:生成器模式詳解

設計模式(四)創建型:生成器模式詳解生成器模式(Builder Pattern)是 GoF 23 種設計模式中的核心創建型模式之一,其核心價值在于將一個復雜對象的構建過程與其表示分離,使得同樣的構建過程可以創建…

《Angular+Spring Boot:ERP前端采購銷售庫存協同架構解析》

基于Angular與Spring Boot構建的全棧ERP前端,絕非技術的簡單疊加,而是通過深度融合兩者特性,打造出兼具穩定性與靈活性的業務載體。Angular的組件化架構將復雜界面拆解為可復用的獨立單元,依賴注入機制則讓服務調用與數據流轉條理…

Java 排序

文章目錄排序插入排序分析希爾排序分析選擇排序分析堆排序分析冒泡排序分析快速排序霍爾法分析挖坑法找基準前后指針法題目快排的優化三數取中法非遞歸實現快排歸并排序分析非遞歸實現歸并排序海量數據的排序非比較的排序計數排序分析基數排序桶排序排序 穩定的排序&#xff1…

日本IT就職面試|儀容禮儀篇分享建議

日系企業で好印象を與える「身だしなみ」と「面接マナー」ガイドこんにちは。 日系企業への就職?転職活動をされている方にとって、「第一印象」は合否を左右する大切なポイントですよね。実は、面接の評価は入室の瞬間から始まっていると言っても過言ではありません。 今回は…

英語聽力口語詞匯-8.美食類

1.crispy,crisp adj.酥脆的,易碎的 2.sweet adj.甜的 比如說chocolate is so sweet and delicious 3.chewy adj.難嚼的,難咽的 4.oatmeal n.燕麥粉 5.pickle n.泡菜 7.stir-fry v.炒菜 8.bacon n.咸肉,熏肉 9.yummy adj.美味可口的 1…

力扣7:整數反轉

力扣7:整數反轉題目思路代碼題目 給你一個 32 位的有符號整數 x ,返回將 x 中的數字部分反轉后的結果。 如果反轉后整數超過 32 位的有符號整數的范圍 [?2^31, 2^31 ? 1] ,就返回 0。 思路 這道題我們可以分成兩部分來做,一是完成反轉二…

PWM信號控制電機

1:環境 STM32F103C8T6 KEIL5.38 2個電機 2個輪子 1個L298N STLINKV2 CH340 1個4位獨立按鍵 杜邦線若干 2:代碼 key.h #ifndef __KEY_H #define __KEY_H#include "stm32f10x.h"extern volatile uint8_t key_t ; extern volatile uint8_t …

開源賦能產業,生態共筑未來 | 開源科學計算與系統建模(openSCS)分論壇圓滿舉行

2025開放原子開源生態大會于7月23日-24日在北京國家會議中心召開。本屆大會以“開源賦能產業,生態共筑未來”為主題,匯聚政、產、學、研、用、金、創、投等各領域開源力量,聚焦開源政策導向、生態發展趨勢、開源產業實踐,共探中國…

Android廣播機制體系初識

Android廣播機制體系大白話把Android的廣播機制想象成小區里的“大喇叭”誰在喊話?任何App或系統都能當“大喇叭”,比如喊一嗓子“電量不足啦!”(這就是發送廣播)誰在聽?其他App只要“豎起耳朵”&#xff0…

微信小程序點擊輸入框時,頂部導航欄被遮擋問題如何解決?

前言 不知道大家開發微信小程序的時候有沒有遇到這么一個問題,就是在表單頁面中,點擊輸入框后,輸入框頂起會把頂部欄給遮擋住,如下圖所示:遇到這種情況有沒有解決的辦法呢?能不能既將頁面頂起,同…

通過具有一致性嵌入的大語言模型(LMMs)實現端到端乳腺癌放射治療計劃制定|文獻速遞-醫學影像算法文獻分享

Title題目End-to-end breast cancer radiotherapy planning via LMMs with consistencyembedding通過具有一致性嵌入的大語言模型(LMMs)實現端到端乳腺癌放射治療計劃制定01文獻速遞介紹近年來,受大型語言模型(LLM)啟發…

vscode npm run build打包報ELIFECYCLE

npm run build打包報ELIFECYCLE 是內存溢出解決方案:修改build腳本 :"build": "node --max_old_space_size4096 node_modules/vue/cli-service/bin/vue-cli-service.js build",

【lucene】BlockMaxConjunctionScore

BlockMaxConjunctionScorer 是 Lucene 8.5 引入的一個高性能交集打分器(conjunction scorer),專門用于處理 多條件“與”查詢(AND 查詢) 的場景。它基于 Block-Max WAND(BMW)算法,可…

Androidstudio 上傳當前module 或本地jar包到maven服務器。

1.設置gradle版本到8.0 gradle-wrapper.properties文件中設置: distributionUrlhttps\://mirrors.aliyun.com/macports/distfiles/gradle/gradle-8.0-bin.zip 2.設置項目根目錄build.gradle 設置agp版本和maven插件版本(和gralde版本有對應關系&#xff…

Python動態規劃:從基礎到高階優化的全面指南

動態規劃(Dynamic Programming)是解決復雜優化問題的核心技術,也是算法領域的明珠。本文將深入探討Python實現動態規劃的全方位技術,涵蓋基礎概念、經典問題、優化技巧和實際工程應用,帶您掌握這一強大工具的精髓。一、…

視覺大模型部署實踐篇(Docker+dify+ollama安裝)

一、概述 目的:實現一個本地化部署的大模型,通過工作流對圖像進行一些處理。基于此,我選擇了Docker+Dify+Ollama的部署。 具體實現邏輯:Docker來運行dify,dify用來繪制大模型的工作流或者rag等,Ollama用來部署本地大模型,dify調用Ollama部署的大模型進行推理。 二、Dock…

服務器啟動日志等級

目錄 標準日志等級 服務器啟動階段常見日志 日志配置建議 常見服務器/工具的日志等級配置方式 ET框架 Apache/Nginx 等 Web 服務器 Docker 容器 服務器啟動過程中的日志等級是幫助開發者和運維人員理解系統狀態的重要工具。常見的日志等級及其含義如下: 標準…

linux_centos7安裝jdk8_采用jdk安裝包安裝

你問我為什么不用yum? 我yum安裝不了,我也解決不了qwq. 文章目錄一.下載安裝包1.找到安裝包下載位置2.上傳安裝包到linux3.解壓jdk安裝包4.配置環境一.下載安裝包 1.找到安裝包下載位置 去官網找到你要下載jdk版本: Oracle官網 下面演示安裝jdk8的&am…

Linux驅動23 --- RkMedia 使用

目錄 一、上電自動掛載 二、RkMedia 2.1 認識 RkMedia rtsp rtmp RTSP 和 RTMP 的選擇 2.2 安裝 VLC 2.2 RkMedia 例程使用 一、上電自動掛載 cd /etc/init.d/ vi Smyprofile.sh 添加這個內容 #!/bin/sh ifconfig eth0 192.168.66.88 mount -t nfs 192.168.66.66…

Linux:線程同步與線程互斥

線程互斥競態條件當多個線程(或進程)并發訪問和操作同一個共享資源(如變量、文件、數據庫記錄等)時,最終的結果依賴于這些線程執行的相對時序(即誰在什么時候執行了哪條指令)。 由于操作系統調度…