您好,歡迎進入深圳市穎特新科技有限公司官方網(wǎng)站!
系統(tǒng)時鐘源
N76E003共有3種系統(tǒng)時鐘源,包括: 內(nèi)部高速/低速振蕩器、外部輸入時鐘。它們每一個都可以作為N76E003的系統(tǒng)時鐘源。開啟不同的時鐘源可能會影響到多功能引腳P3.0/XIN 。
內(nèi)部振蕩器
N76E003內(nèi)部有兩個RC振蕩器,一個高速16MHz(HIRC)和一個低速10 kHz(LIRC)。它們都可被選擇用作系統(tǒng)時鐘。通過設(shè)置HIRCEN (CKEN.5)位使能HIRC,設(shè)備上電時LIRC被使能。用戶可設(shè)置OSC[1:0] (CKSWT[2:1])為[0,0]選擇HIRC作為系統(tǒng)時鐘,設(shè)置OSC[1:0](CKSWT [1:0])為[1,0]選擇LIRC作為系統(tǒng)時鐘。注意:
N76E003上電后HIRC 和 LIRC都被使能,并且系統(tǒng)默認HIRC為系統(tǒng)時鐘。當(dāng)系統(tǒng)使用內(nèi)部振蕩器作為時鐘源時,XIN 自動作為普通I/O P3.0,用來擴展普通I/O數(shù)量?梢酝ㄟ^配置P3M1和P3M2寄存器來選擇P3.0的輸出模式。
23.2 系統(tǒng)時鐘切換
N76E003可以通過軟件設(shè)置CKSWT 和 CKEN寄存器切換時鐘源。這給應(yīng)用帶來了很大方便。注意,這些特殊寄存器是寫時效訪問控制受TA保護寄存器。
在時鐘源控制下,時鐘源可以在外部時鐘、內(nèi)部時鐘,甚至內(nèi)部高速與低速之間自由的切換。
然而在切換時鐘源時,必須確保待切換時鐘源已穩(wěn)定。因此,用戶需要遵循以下設(shè)置步驟才能成功完成時鐘源切換。
用戶首先要通過配置CKEN寄存器打開目標(biāo)時鐘源,再通過查詢CKSWT寄存器中對應(yīng)的標(biāo)志位,確定時鐘源是否穩(wěn)定,并且通過寫OSC[1:0] (CKSWT[2:1])切換到目標(biāo)時鐘源。
這些步驟過后,將會成功的切換時鐘源。如果用戶關(guān)心功耗的話,可以將原先時鐘源關(guān)閉了。如果不遵守以上步驟,硬件將會采取以下一些措施來應(yīng)對這些違規(guī)的操作。
1.如果用戶試圖改變CKEN的值來關(guān)閉當(dāng)前時鐘源,設(shè)備將忽略這個操作。系統(tǒng)時鐘維持現(xiàn)狀,CKEN值不變。
2.如果用戶試圖改變OSC[1:0]的值來切換系統(tǒng)時鐘,而待切換新時鐘源未被打開,OSC[1:0]值將會被立即更新,但是系統(tǒng)時鐘保持不變,CKSWTF (CLKEN.0)會被硬件置位。
3.如果用戶切換系統(tǒng)時鐘源,但是目標(biāo)時鐘源已經(jīng)打開還沒穩(wěn)定,那么硬件會等待目標(biāo)穩(wěn)定后,再切換過去。在等待期間,設(shè)備繼續(xù)以原來時鐘源工作,并且CKSWTF會被置1。等到目標(biāo)時鐘源穩(wěn)定后,標(biāo)志位(見 CKSWT[7:3])被置位,時鐘將會成功切換,CKSWTF會被硬件自動清0。
系統(tǒng)時鐘除頻
振蕩頻率(FOSC)通過配置除頻寄存器CKDIV,整數(shù)倍(最大到1/510)除頻后,再供給系統(tǒng)作為系統(tǒng)時鐘(FSYS)。這一特征可以臨時讓MCU跑在很低的速度下來降低功耗。通過時鐘除頻,可以讓MCU在正常工作模式下,很低的速度運行,確保其及時能夠響應(yīng)中斷事件(比如空閑模式只能通過中斷事件退出)。這有可能比空閑模式還要省電。這樣,可以避免掉電模式情況下,需要等待振蕩器重新起振的時間。CKDIV的值可以在任何時間被程序改變,除了不能在中斷服務(wù)程序里改變。
系統(tǒng)時鐘輸出
N76E003提供一個CLO(P1.1)引腳可以輸出系統(tǒng)時鐘,該頻率與FSYS 頻率相同。通過設(shè)置CLOEN (CKCON.1)位打開這個功能。在掉電模式下CLO輸出會停止,因為系統(tǒng)時鐘已被關(guān)閉。注意當(dāng)有干擾問題或是功耗問題時,用戶最好關(guān)閉CLO輸出。
用戶首先要通過配置CKEN寄存器打開目標(biāo)時鐘源, 再通過查詢CKSWT寄存器中對應(yīng)的標(biāo)志位,確定時鐘源是否穩(wěn)定,并且通過寫OSC[1:0] (CKSWT[2:1])切換到目標(biāo)時鐘源。
#include "N76E003.h" #include "SFR_Macro.h" #include "Function_define.h" #include "Common.h" #include "Delay.h" //======================================================================== // The test process: // 1. Power on is run as default HIRC, show LED Fsys tickle faster // 2. toggle P3.0 to GND. // 2. call modify Fsys code to LIRC. // 3. LED tickle speed slowly than before. //======================================================================== void main(void) { /* Note MCU power on system clock is HIRC (16 MHz) Please keep P3.0 HIGH before you want to modify Fsys to LIRC */ Set_All_GPIO_Quasi_Mode; // In Common.h define set_CLOEN; // Also can check P1.1 CLO pin for clock to find the Fsys change. set_P30; while (P30) // when P3.0 keep high, clock out HIRC { clr_GPIO1; // Check LED output tickle time Timer0_Delay1ms(200); set_GPIO1; Timer0_Delay1ms(200); } ////------------------------------------------------------------------------------------------------------ ///*********************************** Change system closk source ***************************************/ ////------------------------------------------------------------------------------------------------------ ////***** HIRC enable part ***** // set_HIRCEN; //step1: enable HIRC clock source run // while((CKSWT&SET_BIT5)==0); //step2: check ready // clr_OSC1; //step3: switching system clock source if needed // clr_OSC0; // while((CKEN&SET_BIT0)==1); //step4: check system clock switching OK or NG // ////***** LIRC enable part***** ////** Since LIRC is always enable, switch to LIRC directly set_OSC1; //step3: switching system clock source if needed clr_OSC0; while((CKEN&SET_BIT0)==1); //step4: check system clock switching OK or NG clr_HIRCEN; ////-------------------------------------------------------------------------------------------------------- /* Now Fsys = LIRC , LED tickle slowly. */ while(1) { clr_GPIO1; // Check LED output tickle time clr_P00; set_GPIO1; set_P00; } /* =================== */ }
#define set_CLOEN CKCON |= SET_BIT1
set_CLOEN;
#define set_P30 P30 = 1 #define clr_P30 P30 = 0
////***** HIRC enable part ***** // set_HIRCEN; //step1: enable HIRC clock source run // while((CKSWT&SET_BIT5)==0); //step2: check ready // clr_OSC1; //step3: switching system clock source if needed // clr_OSC0; // while((CKEN&SET_BIT0)==1); //step4: check system clock switching OK or NG // ////***** LIRC enable part***** ////** Since LIRC is always enable, switch to LIRC directly set_OSC1; //step3: switching system clock source if needed clr_OSC0; while((CKEN&SET_BIT0)==1); //step4: check system clock switching OK or NG clr_HIRCEN;
set_HIRCEN;
用戶首先要通過配置CKEN寄存器打開目標(biāo)時鐘源
#define set_HIRCEN BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CKEN|=SET_BIT5;EA=BIT_TMP;
while((CKEN&SET_BIT0)==1); //step4: check system clock switching OK or NG
確定時鐘源是否穩(wěn)定
并且通過寫OSC[1:0] (CKSWT[2:1])切換到目標(biāo)時鐘源
set_OSC1; //step3: switching system clock source if needed
clr_OSC0;
#define set_HIRCST BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CKSWT|=SET_BIT5;EA=BIT_TMP; #define set_LIRCST BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CKSWT|=SET_BIT4;EA=BIT_TMP; #define set_ECLKST BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CKSWT|=SET_BIT3;EA=BIT_TMP; #define set_OSC1 BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CKSWT|=SET_BIT2;EA=BIT_TMP; #define set_OSC0 BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CKSWT|=SET_BIT1;EA=BIT_TMP; #define clr_HIRCST BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CKSWT&=~SET_BIT5;EA=BIT_TMP; #define clr_LIRCST BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CKSWT&=~SET_BIT4;EA=BIT_TMP; #define clr_ECLKST BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CKSWT&=~SET_BIT3;EA=BIT_TMP; #define clr_OSC1 BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CKSWT&=~SET_BIT2;EA=BIT_TMP; #define clr_OSC0 BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CKSWT&=~SET_BIT1;EA=BIT_TMP;
while((CKEN&SET_BIT0)==1); //step4: check system clock switching OK or NG 判斷是否穩(wěn)定
掃碼關(guān)注我們
傳真:0755-82591176
郵箱:vicky@yingtexin.net
地址:深圳市龍華區(qū)民治街道民治大道973萬眾潤豐創(chuàng)業(yè)園A棟2樓A08