最近一直在想怎么測單片機的總線時鐘,于是想出了一個方法,也不知是否正確,權(quán)且估算一下吧。
先說明一下時鐘周期,機器周期,總線周期的區(qū)別吧:
時鐘周期:?時鐘周期也稱為振蕩周期,定義為時鐘脈沖的倒數(shù)(可以這樣來理解,時鐘周期就是單片機外接晶振的倒數(shù),例如12M的晶振,它的時間周期就是1/12 us),是計算機中最基本的、最小的時間單位。
機器周期:??? 在計算機中,為了便于管理,常把一條指令的執(zhí)行過程劃分為若干個階段,每一階段完成一項工作。例如,取指令、存儲器讀、存儲器寫等,這每一項工作稱為一個基本操作。完成一個基本操作所需要的時間稱為機器周期。一般情況下,一個機器周期由若干個S周期(狀態(tài)周期)組成。??? 8051系列單片機的一個機器周期同6個 S周期(狀態(tài)周期)組成。前面已說過一個時鐘周期定義為一個節(jié)拍(用P表示),二個節(jié)拍定義為一個狀態(tài)周期(用S表示),8051單片機的機器周期由6個 狀態(tài)周期組成,也就是說一個機器周期=6個狀態(tài)周期=12個時鐘周期。(例如外接24M晶振的單片機,他的一個機器周期=12/24M 秒)
指令周期:??? 執(zhí)行一條指令所需要的時間,一般由若干個機器周期組成。指令不同,所需的機器周期也不同。? ???? 對于一些簡單的的單字節(jié)指令,在取指令周期中,指令取出到指令寄存器后,立即譯碼執(zhí)行,不再需要其它的機器周期。對于一些比較復(fù)雜的指令,例如轉(zhuǎn)移指令、乘法指令,則需要兩個或者兩個以上的機器周期。??? 通常含一個機器周期的指令稱為單周期指令,包含兩個機器周期的指令稱為雙周期指令。
總線周期:?由于存貯器和I/O端口是掛接在總線上的,CPU對存貯器和I/O接口的訪問,是通過總線實現(xiàn)的。通常把CPU通過總線對微處理器外部(存貯器或 I/O接口)進行一次訪問所需時間稱為一個總線周期。
總結(jié):時鐘周期是最小單位,機器周期需要1個或多個時鐘周期,指令周期需要1個或多個機器周期;機器周期指的是完成一個基本操作的時間,這個基本操作有時可能包含總線讀寫,因而包含總線周期,但是有時可能與總線讀寫無關(guān),所以,并無明確的相互包含的關(guān)系。指令周期:是CPU的關(guān)鍵指標(biāo),指取出并執(zhí)行一條指令的時間。一般以機器周期為單位,分單指令執(zhí)行周期、雙指令執(zhí)行周期等?,F(xiàn)在的處理器的大部分指令(ARM、DSP)均采用單指令執(zhí)行周期。機器周期:完成一個基本操作的時間單元,如取指周期、取數(shù)周期。時鐘周期:CPU的晶振的工作頻率的倒數(shù)。
一個nop所占的時間為一個機器指令的時間,8051中為1us。
單片機型號為飛思卡爾MC9s12xep100,在main函數(shù)里放置時鐘初始化函數(shù),同時初始化一個引腳,并設(shè)置為輸出,然后主函數(shù)放置該引腳電平的翻轉(zhuǎn)函數(shù)。大致如下;
void main() { MCUInit(); DDRP_DDRP4=1;//PTP4設(shè)置為輸出 while(1) { PTP_PTP4=~PTP_PTP4; } }然后用示波器測量該引腳翻轉(zhuǎn)電平所用的時間,以下是部分?jǐn)?shù)據(jù):(示波器精度有限)
總線頻率—>耗時 ? ?≈ (1/總線頻率)*10
16MHZ ?—>620ns?≈ 625ns
20MHZ ?—>500ns?≈ 500ns
32MHZ ?—>312ns?≈ 312ns
40MHZ ?—>252ns?≈ 250ns
48MHZ ?—>208ns?≈ 208ns
60MHZ ?—>168ns?≈ 166ns
通過上面的數(shù)據(jù),發(fā)現(xiàn)耗時與?(1/總線頻率)*10基本相等,至于為何乘10,不知何因。權(quán)且當(dāng)做粗略估算吧。
----------------------------------------------------------------單片機9s08dz60------------------------------------------------------------------------------
順便記錄下對dz60的測試
總線頻率—>翻轉(zhuǎn)電平耗時 ? ?≈ (1/總線頻率)*10 ? asm("nop")耗時
16MHZ ?—>680ns ? ? ? ? ? ? ??≈ 625ns ? ? ? ? ? ? ? ? 370ns
8MHZ ?—>1.36us ? ? ? ? ? ? ??≈ 1.25us ? ? ? ? ? ? ? ? 740ns
4MHZ ?—>2.76us ? ? ? ? ? ? ??≈ 2.50us ? ? ? ? ? ? ? ? 1.5us
其中asm("nop")耗時的計算方法如下:
void main() { MCUInit(); DDRP_DDRP4=1;//PTP4設(shè)置為輸出 while(1) { PTP_PTP4=1; asm("nop"); PTP_PTP4=0; } }下面附dz60時鐘初始化函數(shù)(晶振8MHZ,總線8MHZ) void MCUInit(void) { SOPT1 = 0x20; //取消看門狗,使能停止模式 SOPT2 = 0X00; //寫入一次SOPT2 /* 初始化時鐘,使用PEE模式,晶振為8Mhz,總線頻率為8mhz(datasheet P151) */ /*----------------------------FEI -> FBE----------------------------------*/ MCGC2 = 0x36; //總線分頻為1.P133. while (!MCGSC_OSCINIT); //EREFS位選擇的晶體是否完成初始化.P134. MCGC1 = 0xB8; //選擇使用外部晶振.P131. while (MCGSC_IREFST); //等待外部參考成為參考時鐘的當(dāng)前源 while(MCGSC_CLKST != 2); //等待外部參考 時鐘成為 MCGOUT /*----------------------------FBE -> BLPE---------------------------------*/ MCGC2 = 0x3E; //設(shè)置LP位為1(此時已經(jīng)進入BLPE模式) MCGC1 = 0x98;//0x98->RDIV=8;0x90->RDIV=4; //更改RDIV MCGC3 = 0x44;//0x44->VDIV=16;0x48->VDIV=32 //選擇PLL,VDIV為4 while(!MCGSC_PLLST); //PLLS時鐘的當(dāng)前源是否PLL /*----------------------------BLPE -> PBE---------------------------------*/ MCGC2 = 0x36; //設(shè)置LP位為0(此時已經(jīng)進入BLPE模式) while (!MCGSC_LOCK); //等待PLL獲得鎖定 /*----------------------------PBE -> PEE----------------------------------*/ MCGC1 = 0x18; //選擇PLL為系統(tǒng)時鐘 while(MCGSC_CLKST != 3); //等待時鐘穩(wěn)定 }MCGOUT=(8MHZ/8)*16/1=16MHZ,總線時鐘為8MHZ
電子發(fā)燒友App


















評論