日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

TQ210——时钟系统

發布時間:2023/12/20 windows 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TQ210——时钟系统 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

TQ210——時鐘系統

?

1、時鐘域

? ? ? 一般來講, MCU 的主時鐘來源主要是外部晶振或外部時鐘,比較常見的是 外 部晶振。一般情況,系統內所使用的時鐘都是高頻率的時鐘,外部晶振一般達不到那么高的頻率,所以一般使用鎖相環電路(PLL)進行倍頻,而TQ210 正是通過外接24MHz 的外部晶振,通過一定的倍頻達到更高的頻率。

S5PV210內部包含三個時鐘域:

MSYS(mainsystem):主時鐘域【Cortex-A8處理器、DRAM控制器(DMC0& DMC1)、3D、IROM& IRAM、INTC、SEPRI等。最高工作頻率200MHz】

DSYS(displaysystem):顯示時鐘域【顯示相關的模塊,如FIMC、FIMD、JPEG、多媒體Ips。最高工作頻率166MHz】

PSYS(peripheralsystem):外設時鐘域【安全模塊、IO外設和低功耗音頻播放模塊等。最高工作頻率133MHz】

??


2、時鐘域與PLL

S5PV210內部包含4個PLL。

Cortex-A8內核(ARMCLK)和MSYS時鐘域(HCLK_MSYS、PCLK_MSYS)使用APLL;

DSYS和PSYS時鐘域(HCLK_DSYS、HCLK_PSYS、PCLK_DSYS、PCLK_PSYS)、外設時鐘(SPI、UART、Timer等)使用MPLL和EPLL;

VideoClock使用VPLL

? 上面是各時鐘關系圖和三星公司給出了一些經典的頻率參數。

?

上圖是S5PV210時鐘發生器,三星公司給出了一些經典參數。

分析一:

目標時鐘的值取決于三個因素:MUX、時鐘源頻率、Divider(分頻器)

MUX為多路時鐘分選器,使用MUX可以為一個時鐘選擇不同的時鐘源

時鐘源一般來自于上級時鐘系統或PLL輸出或直接來自于外部晶振時鐘

源時鐘可以經過MUX直接連接到目標時鐘系統,也可以途經Divider分做分頻后再輸出到下一級時鐘系統

分析二:

一般在bootloader的前部會有時鐘初始化代碼,該階段會對系統主要時鐘進行設置,包括ARMCLK、HCLK_PSYS、PCLK_PSYS等。

外設時鐘配置的常規思路:

1、分析目標外設模塊要使用的時鐘

2、分析該時鐘如何由源時鐘經MUX、Divider而得到。

3、根據需要設置寄存器位完成時鐘配置。

【時鐘分頻配置】:

ARMCLK = 1000MHz= MOUT_MSYS / (APLL_RATIO + 1),經過在第四和第五步的設置后,MOUT_MSYS會被設置為1000MHz,所以APLL_RATIO=0即可

SCLKA2M=200MHz=SCLKAPLL/ (A2M_RATIO + 1),由于SCLKAPLL=1000MHz,所以A2M_RATIO=4。

HCLK_MSYS=200MHz=ARMCLK/ (HCLK_MSYS_RATIO + 1),所以HCLK_MSYS_RATIO=4

PCLK_MSYS=100MHz=HCLK_MSYS/ (PCLK_MSYS_RATIO + 1),所以PCLK_MSYS_RATIO=1

HCLK_DSYS=166MHz=MOUT_DSYS/ (HCLK_DSYS_RATIO + 1), 經過在第四和第五步的設置后,MOUT_DSYS=667MHz,所以HCLK_DSYS_RATIO=3

PCLK_DSYS=83MHz=HCLK_DSYS/ (PCLK_DSYS_RATIO + 1),所以PCLK_DSYS_RATIO=1

HCLK_PSYS=133Mhz=MOUT_PSYS/ (HCLK_PSYS_RATIO + 1),經過在第四和第五步的設置后,MOUT_PSYS=667MHz所以HCLK_PSYS_RATIO=4

PCLK_PSYS=66Mhz=HCLK_PSYS/ (PCLK_PSYS_RATIO + 1),所以HCLK_PSYS_RATIO=1

?

3、時鐘配置

(1)設置系統鎖相環(PLL)的鎖定值? // 參考 PLL_LOCK 寄存器

(2)設置PLL的PMS值,并使能PLL ? ? ?//參考 PLL_CON寄存器

(3)等待PLL鎖定(即等待 PLL 輸出穩定的頻率) // 讀取 PLL_CON 寄存器的 LOCKED 位來判斷【設置PLL后,時鐘從Fin提升到目標頻率時,需要一定的時間,即鎖定時間】

(4)設置系統時鐘源:選擇PLL,而不是外部晶振 ? // 參考 CLK_SRC0 寄存器

(5)設置其他模塊的時鐘源 ? ?// 參考 CLK_SRC1~CLK_SRC6寄存器

(6)設置系統時鐘分頻值 ? ? ??// 參考 CLK_DIV0寄存器

(7)設置其他模塊的時鐘分頻值 ?// 參考 CLK_DIV1~CLK_DIC7

?

4、寄存器

(1)主要的MUX

? ? 最終的時鐘源一般均來自于外部晶振直接輸出(低頻、低功耗),或PLL輸出(高頻、高性能)由相應的MUX開關來決定使用哪個。

PLL輸出頻率的計算公式如下:

對于APLL:

FOUT = MDIV X FIN / (PDIV?×? 2exp(SDIV-1))

對于MPLL、EPLL、VPLL:

?????? FOUT = MDIV X FIN / (PDIV X2exp(SDIV))

?

(2)APLL配置

? ? ? ALPP_CON0負責設置APLL,FINPLL=24MHz,經過APLL后,我們將輸出FOUT=1000Mhz的時鐘頻率,FOUT的計算公式如下:FOUT=MDIV*FIN/(PDIV*2^(SDIV-1)) = 1000 MHz 由于FIN=24MHz,FOUT=1000MHz,我們可以這樣取值:MDIV= 0x7d,PDIV=0x3,SDIV=1。這3個值并不是固定死的,只要能使FOUT=1000Mhz,任意搭配都是可以的。

?

(3)MPLL

MPLL_CON寄存器負責設置MPLL,經過MPLL后,我們將輸出FOUT=667Mhz的時鐘頻率,FOUT的計算公式如下:FOUT=MDIV*FIN/(PDIV*2^SDIV) = 667 MHz 由于FIN=24MHz,FOUT=667MHz,我們可以這樣取值:MDIV=0x29B,PDIV= 0xC,SDIV=1。這3個值并不是固定死的,只要能使FOUT=667Mhz,任意搭配都是可以的。

?

(4)分頻器

從低位開始分析:
MOUT_MSYS = FOUTapll = 1000MHz 而 ARMCLK 根據經典值為 1000,所以 APLL_RATIO = 0;
SLKA2M = HCLK_MSYS = 200MHz , 而 SCLKAPLL = 1000 ,所 以A2M_RATIO = 4;
HCLK_MSYS = 200MHz,而 ARMCLK = 1000,所以 HCLK_MSYS_RATIO= 4;
MOUT_DSY 來自 SCLKmpll 即 FOUTmpll = 667MHz,而 HCLK_DSYS按照經典設置應為 166MHz 所以, HCLK_DSY_RATIO 約為 3;
經 典 值 設 置 可 知 PCLK_DSYS =166MHz,HCLK_DSYS=83MHz,故 PCLK_DSYS_RATIO = 1;
MOUT_PSYS 與 MOUT_DSYS 的來源是一樣的,故也是FOUTmpll = 667MHz,而 HCLK_PSYS = 133,故 HCLK_PSYS_RATIO = 4;
由經 典 值 設 置 可 知 PCLK_PSYS =66MHz,HCLK_PSYS=133MHz,故 PCLK_PSYS_RATIO = 1;
?

(5)模塊時鐘門控

為了支持移動設備的低功耗需求,S5PV210的時鐘模塊提供了極精細的時鐘開關控制,即ClockGating Control。

有兩類ClockGating寄存器,CLK_GATE_IPx和CLK_GATE_BOLCK,這兩者之間是邏輯與的關系,即對于一個具體模塊,只有在兩類門控寄存器內其時鐘都被允許的情況下,該模塊的時鐘才能被最終開啟。兩類寄存器中只要有一處被禁止則最終的模塊時鐘是禁止的。

?

(6)設置各種時鐘開關

?

5、時鐘初始化

.global _start _start:bl main /* 跳轉到C函數去執行*/ halt:b halt

#ifndef CLOCK_H_ #define CLOCK_H_void clock_init();#endif

#include"clock.h"#defineAPLL_LOCK *((volatile u32*)0xE0100000) #defineMPLL_LOCK *((volatile u32*)0xE0100008) #defineEPLL_LOCK *((volatile u32*)0xE0100010) #defineVPLL_LOCK *((volatile u32*)0xE0100020)#defineAPLL_CON0 *((volatile u32*)0xE0100100) #define MPLL_CON *((volatile u32 *)0xE0100108) #defineEPLL_CON0 *((volatile u32*)0xE0100110) #defineEPLL_CON1 *((volatile u32*)0xE0100114) #define VPLL_CON *((volatile u32 *)0xE0100120)#define CLK_SRC0 *((volatile u32*)0xE0100200) #define CLK_SRC1 *((volatile u32*)0xE0100204) #define CLK_SRC2 *((volatile u32*)0xE0100208) #define CLK_SRC3 *((volatile u32*)0xE010020C) #define CLK_SRC4 *((volatile u32*)0xE0100210) #define CLK_SRC5 *((volatile u32*)0xE0100214) #define CLK_SRC6 *((volatile u32*)0xE0100218)#define CLK_DIV0 *((volatile u32 *)0xE0100300) #define CLK_DIV1 *((volatile u32 *)0xE0100304) #define CLK_DIV2 *((volatile u32 *)0xE0100308) #define CLK_DIV3 *((volatile u32 *)0xE010030C) #define CLK_DIV4 *((volatile u32 *)0xE0100310) #define CLK_DIV5 *((volatile u32 *)0xE0100314) #define CLK_DIV6 *((volatile u32 *)0xE0100318) #define CLK_DIV7 *((volatile u32 *)0xE010031C)/* 時鐘初始化*/ void clock_init() {/* 1.設置PLL鎖定值*/APLL_LOCK = 0xFFFF;MPLL_LOCK = 0xFFFF;EPLL_LOCK = 0xFFFF;VPLL_LOCK = 0xFFFF;/* 2.設置PLL的PMS值(使用芯片手冊推薦的值),并使能PLL*//* P M S EN */APLL_CON0 = (3 << 8) | (125 << 16) | (1 << 0) | (1 << 31); /*FOUT_APLL = 1000MHz */MPLL_CON = (12 << 8) | (667 << 16) | (1 << 0) | (1 << 31); /* FOUT_MPLL = 667MHz */EPLL_CON0 = (3 << 8) | (48 << 16) | (2 << 0) | (1 << 31); /* FOUT_EPLL = 96MHz */VPLL_CON = (6 << 8) | (108 << 16) | (3 << 0) | (1 << 31); /*FOUT_VPLL = 54MHz *//* 3.等待PLL鎖定*/while (!(APLL_CON0 & (1 <<29)));while (!(MPLL_CON & (1 << 29)));while (!(EPLL_CON0 & (1 <<29)));while (!(VPLL_CON & (1 << 29)));/*** 4.設置系統時鐘源,選擇PLL為時鐘輸出*//* MOUT_MSYS = SCLKAPLL = FOUT_APLL =1000MHz** MOUT_DSYS = SCLKMPLL = FOUT_MPLL =667MHz** MOUT_PSYS = SCLKMPLL = FOUT_MPLL =667MHz** ONENAND = HCLK_PSYS*/CLK_SRC0 = (1 << 0) | (1 <<4) | (1 << 8) | (1 << 12);/* 4.設置其他模塊的時鐘源*//* 6.設置系統時鐘分頻值*/CLK_DIV0 = (0 << 0) | /* APLL_RATIO = 0, freq(ARMCLK) = MOUT_MSYS /(APLL_RATIO + 1) = 1000MHz */(4 << 4) | /*A2M_RATIO = 4, freq(A2M) = SCLKAPLL / (A2M_RATIO + 1) = 200MHz */(4 << 8) | /*HCLK_MSYS_RATIO = 4, freq(HCLK_MSYS) = ARMCLK / (HCLK_MSYS_RATIO + 1) = 200MHz*/(1 << 12) | /* PCLK_MSYS_RATIO = 1, freq(PCLK_MSYS) =HCLK_MSYS / (PCLK_MSYS_RATIO + 1) = 100MHz */(3 << 16) | /*HCLK_DSYS_RATIO = 3, freq(HCLK_DSYS) = MOUT_DSYS / (HCLK_DSYS_RATIO + 1) =166MHz */(1 << 20) | /*PCLK_DSYS_RATIO = 1, freq(PCLK_DSYS) = HCLK_DSYS / (PCLK_DSYS_RATIO + 1) =83MHz */(4 << 24) | /* HCLK_PSYS_RATIO = 4, freq(HCLK_PSYS) =MOUT_PSYS / (HCLK_PSYS_RATIO + 1) = 133MHz */(1 << 28); /* PCLK_PSYS_RATIO = 1, freq(PCLK_PSYS) =HCLK_PSYS / (PCLK_PSYS_RATIO + 1) = 66MHz *//* 7.設置其他模塊的時鐘分頻值*/ }

#include"clock.h"#define GPC0CON *((volatile unsigned int *)0xE0200060) #define GPC0DAT *((volatile unsigned int *)0xE0200064)void delay(volatile unsigned int t) {volatile unsigned int t2 = 0xFFFF;while (t--)for (; t2; t2--); }int main() {int toggle = 0;GPC0CON &= ~(0xFF << 12);GPC0CON |= 0x11 << 12; // 配置GPC0_3和GPC0_4為輸出clock_init(); // 時鐘初始化while (1){GPC0DAT &= ~(0x3 << 3); // 熄滅LED1和LED2if (toggle)GPC0DAT |= 1 << 3; // 點亮LED1elseGPC0DAT |= 1 << 4; // 點亮LED2toggle = !toggle;delay(0x50000);}return 0; }

總結

以上是生活随笔為你收集整理的TQ210——时钟系统的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。