新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > msp430g2231基礎定時器設置

        msp430g2231基礎定時器設置

        作者: 時間:2016-11-13 來源:網絡 收藏
        本實驗的目的是了解用于執行對MSP430 Value Line設備的初始化過程的步驟。在這個練習中,您將編寫初始化代碼,并運行該設備使用各種時鐘資源。

        1、寫初始化代碼

        本文引用地址:http://www.104case.com/article/201611/316486.htm

        2、運行CPU的MCLK的來源方式:VLO 、32768晶體、DCO

        3、主體程序部分

        4、觀察LED閃光燈速度

        MSP430時鐘:

        1、在MSP430單片機中一共有三個時鐘源:

        一個LFXT1CLK,為低速/高速晶振源,通常接32.768khz,也可以接(400khz~8Mhz);

        一個為XT2CLK,外接標準高速晶振,通常是接8Mhz,也可以接(400khz~8Mhz);

        還有一個叫DCOCLK,為內部晶振,有RC震蕩回路構成。

        2、在MSP430單片機內部一共有三個時鐘系統 :

        一個為ACLK,通常由LFXT1CLK作為時鐘源,可以通過軟件控制改時鐘的分頻系數樹;

        一個為MCLK(Main CLK)一聽就知道是主時鐘單元,為系統內核提供時鐘,它可以通過軟件從三個時鐘源選擇;

        還有一個為SMCLK,稱作輔助主時鐘,也是可以由軟件選擇時鐘源。

        Basic Clock Module Registers(基礎時鐘寄存器)

        DCO control register DCOCTL

        Basic clock system control 1 BCSCTL1

        Basic clock system control 2 BCSCTL2

        Basic clock system control 3 BCSCTL3

        SFR interrupt enable register 1 IE1

        SFR interrupt flag register 1 IFG1

        3、MSP430的時鐘設置包括3個寄存器,DCOCTL、BCSCTL1、BCSCTL2、BCSCTL3

        DCOCTL,DCO控制寄存器,地址為56H,初始值為60H

        DCO2

        DCO1

        DCO0

        MOD4

        MOD3

        MOD2

        MOD1

        MOD0

        DCO0~DCO2: DCO Select Bit,定義了8種頻率之一,而頻率由注入直流發生器的電流定義。

        MOD0~MOD4: Modulation Bit,頻率的微調。

        一般不需要DCO的場合保持默認初始值就行了。

        BCSCTL1,Basic Clock System Control 1,地址為57H,初始值為84H

        XT2OFF

        XTS

        DIVA1

        DIVA0

        XT5V

        RSEL2

        RSEL1

        RSEL0

        RSEL0~RSEL2: 選擇某個內部電阻以決定標稱頻率.0最低,7最高。

        XT5V: 1.

        DIVA0~DIVA1:選擇ACLK的分頻系數。DIVA=0,1,2,3,ACLK的分頻系數分別是1,2,4,8;

        XTS: 選擇LFXT1工作在低頻晶體模式(XTS=0)還是高頻晶體模式(XTS=1)。

        XT2OFF: 控制XT2振蕩器的開啟(XT2OFF=0)與關閉(XT2OFF=1)。

        正常情況下把XT2OFF復位就可以了.

        BCSCTL2,Basic Clock System Control 2,地址為58H,初始值為00H

        SEM1

        SELM0

        DIVM1

        DIVM0

        SELS

        DIVS1

        DIVS0

        DCOR

        DCOR: Enable External Resistor. 0,選擇內部電阻;1,選擇外部電阻

        DIVS0~DIVS1: DIVS=0,1,2,3對應SMCLK的分頻因子為1,2,4,8

        SELS: 選擇SMCLK的時鐘源, 0:DCOCLK; 1:XT2CLK/LFXTCLK.

        DIVM0~1: 選擇MCLK的分頻因子, DIVM=0,1,2,3對應分頻因子為1,2,4,8.

        SELM0~1: 選擇MCLK的時鐘源, 0,1:DCOCLK, 2:XT2CLK, 3:LFXT1CLK

        我用的時候一般都把SMCLK與MCLK的時鐘源選擇為XT2。

        其它:

        1. LFXT1: 一次有效的PUC信號將使OSCOFF復位,允許LFXT1工作,如果LFXT1信號沒有用作SMCLK或MCLK,可軟件置OSCOFF關閉LFXT1.

        2. XT2: XT2產生XT2CLK時鐘信號,如果XT2CLK信號沒有用作時鐘MCLK和SMCLK,可以通過置XT2OFF關閉XT2,PUC信號后置XT2OFF,即XT2的關閉的。

        3. DCO振蕩器:振蕩器失效時,DCO振蕩器會自動被選做MCLK的時鐘源。如果DCO信號沒有用作SMCLK和MCLK時鐘信號時,可置SCG0位關閉DCO直流發生器。

        4. 在PUC信號后,由DCOCLK作MCLK的時鐘信號,根據需要可將MCLK的時鐘源另外設置為LFXT1或XT2,設置順序如下:

        (1)清OSCOFF/XT2

        (2)清OFIFG

        (3)延時等待至少50uS

        (4)再次檢查OFIFG,如果仍置位,則重復(1)-(4)步,直到OFIFG=0為止。

        (5)設置BCSCTL2的相應SELM。

        實例分析

        1、CPU運行在VLO時鐘下:

        這是最慢的時鐘,在約12千赫茲下運行。因此,我們將通過可視化的LED閃爍的紅色慢慢地在約每3秒鐘率。我們可以讓時鐘系統默認這種狀態,設置專門來操作VLO。我們將不使用任何ALCK外設時鐘在此實驗室工作,但你應該認識到,ACLK來自VLO時鐘。

        #include

        void main(void)

        {

        WDTCTL = WDTPW + WDTHOLD; // 關閉看門狗定時器

        P1DIR = 0x40; // P1.6 配置輸出

        P1OUT = 0; // 關閉LED

        BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO

        IFG1&= ~OFIFG; // 清除OSCFault 標志

        __bis_SR_register(SCG1 + SCG0); // 關閉 DCO

        BCSCTL2 |= SELM_3 + DIVM_3; // MCLK = VLO/8

        while(1)

        {

        P1OUT = 0x40; // 開啟LED

        _delay_cycles(100);

        P1OUT = 0; // 關閉 LED

        _delay_cycles(5000);

        }

        }

        2、CPU運行在晶振(32768Hz)時鐘下:

        晶體頻率為32768赫茲,約3倍的VLO。如果我們在前面的代碼中使用晶振,指示燈應閃爍大約每秒一次。你知道為什么32768赫茲是一個標準?這是因為這個數字是2的15次方,因此很容易用簡單的數字計數電路,以每秒一次獲得率 ——手表和其他時間時基。認識到ACLK來自外部晶振時鐘。

        #include

        void main(void)

        {

        WDTCTL = WDTPW + WDTHOLD; // 關閉看門狗定時器

        P1DIR = 0x41; // P1.0 和P1.6配置輸出

        P1OUT = 0x01; // 開啟P1.0

        BCSCTL3 |= LFXT1S_0; // LFXT1 = 32768Hz 晶振

        while(IFG1&OFIFG)

        {

        IFG1&= ~OFIFG; // 清除 OSCFault 標志

        _delay_cycles(100000); // 為可見的標志延時

        }

        P1OUT = 0; // 關閉P1

        __bis_SR_register(SCG1 + SCG0); // 關閉 DCO

        BCSCTL2 |= SELM_3 + DIVM_3; // MCLK = 32768/8

        while(1)

        {

        P1OUT = 0x40; // 開啟 LED

        _delay_cycles(100);

        P1OUT = 0; / / 關閉LED

        _delay_cycles(5000);

        }

        }

        3、CPU運行在晶振(32768Hz)和DCO時鐘下:

        最慢的頻率,我們可以運行DCO約在1MHz(這也是默認速度)。因此,我們將開始切換MCLK到DCO下。在大多數系統中,你會希望ACLK上運行的VLO或32768赫茲晶振。由于ACLK在我們目前的代碼是在晶體上運行,我們會打開DCO計算。

        #include

        void main(void)

        {

        WDTCTL = WDTPW + WDTHOLD; // 關閉看門狗定時器

        if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)

        {

        while(1); // If cal const erased, 掛起

        }

        BCSCTL1 = CALBC1_1MHZ; // Set range

        DCOCTL = CALDCO_1MHZ; //設置DCO模式

        P1DIR = 0x41; // P1.0 和P1.6配置輸出

        P1OUT = 0x01; // P1.0 開啟

        BCSCTL3 |= LFXT1S_0; // LFXT1 = 32768Hz

        while(IFG1&OFIFG)

        {

        IFG1&= ~OFIFG; // 清除OSCFault 標志

        _delay_cycles(100000); // 為可見標志延時

        }

        P1OUT = 0; // P1.6 關閉

        // __bis_SR_register(SCG1 + SCG0); // 關閉DCO

        BCSCTL2 |= SELM_0 + DIVM_3; // MCLK = DCO

        while(1)

        {

        P1OUT = 0x40; // P1.6 開啟

        _delay_cycles(100);

        P1OUT = 0; / / P1.6 關閉

        _delay_cycles(5000);

        }

        }

        4、CPU運行在DCO時鐘下:

        最慢的頻率,我們可以運行DCO約在1MHz(這也是默認速度)。因此,我們將開始切換MCLK到DCO下。在大多數系統中,你會希望在VLO或者是晶振下運行ACLK。由于ACLK在我們目前的代碼是在VLO上運行,我們會打開DCO運行。

        #include

        void main(void)

        {

        WDTCTL = WDTPW + WDTHOLD; // 關閉看門狗定時器

        if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)

        {

        while(1); // If cal const erased,掛起

        }

        BCSCTL1 = CALBC1_1MHZ; // Set range

        DCOCTL = CALDCO_1MHZ; // 設置DCO模式

        P1DIR = 0x40; // P1.6 配置輸出

        P1OUT = 0; // P1關閉

        BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO

        IFG1&= ~OFIFG; // 清除 OSCFault 標志

        //__bis_SR_register(SCG1 + SCG0); // 關閉DCO

        BCSCTL2 |= SELM_0 + DIVM_3; // MCLK = DCO/8

        while(1)

        {

        P1OUT = 0x40; // P1.6 關閉

        _delay_cycles(100);

        P1OUT = 0; // P1.6 開啟

        _delay_cycles(5000);

        }

        }

        以下將會分析上面4個例子的代碼細微差別:

        首先讓我們看一下msp430x20x2.h這個文件中的內容,由于頭文件信息量很大這里就只簡單說明和以上四個代碼有關的部分,其余請大家自行閱讀。

        一、WDTCTL = WDTPW + WDTHOLD; // 關閉看門狗定時器(例1、2、3、4)

        頭文件中的相關說明如下:

        /************************************************************

        * WATCHDOG TIMER

        ************************************************************/

        #define __MSP430_HAS_WDT__ /* Definition to show that Module is available */

        SFR_16BIT(WDTCTL); /* Watchdog Timer Control */

        /* The bit names have been prefixed with "WDT" */

        #define WDTIS0 (0x0001)

        #define WDTIS1 (0x0002)

        #define WDTSSEL (0x0004)

        #define WDTCNTCL (0x0008)

        #define WDTTMSEL (0x0010)

        #define WDTNMI (0x0020)

        #define WDTNMIES (0x0040)

        #define WDTHOLD (0x0080)

        #define WDTPW (0x5A00)

        這個指令設置密碼(WDTPW)和停止位定時器(WDTHOLD),所有的WatchDog配置都需要在WDTPW的輔助下完成。

        舉例如下:

        A、間隔時間由Bit0-2位編碼:

        1、看門狗的時鐘由FSMCLK(假設為1MHz)

        #define WDT_MDLY_32 (WDTPW+WDTTMSEL+WDTCNTCL) /* 32ms interval (default) */

        #define WDT_MDLY_8 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS0) /* 8ms " */

        #define WDT_MDLY_0_5 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1) /* 0.5ms " */

        #define WDT_MDLY_0_064 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1+WDTIS0) /* 0.064ms " */

        2、看門狗的時鐘由FACLK(假設為32KHz)

        #define WDT_ADLY_1000 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL) /* 1000ms " */

        #define WDT_ADLY_250 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS0) /* 250ms " */

        #define WDT_ADLY_16 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1) /* 16ms " */

        B、看門狗模式——在過期時間后重啟:

        1、看門狗的時鐘由FSMCLK(假設為1MHz)

        #define WDT_MRST_32 (WDTPW+WDTCNTCL) /* 32ms interval (default) */

        #define WDT_MRST_8 (WDTPW+WDTCNTCL+WDTIS0) /* 8ms " */

        #define WDT_MRST_0_5 (WDTPW+WDTCNTCL+WDTIS1) /* 0.5ms " */

        #define WDT_MRST_0_064 (WDTPW+WDTCNTCL+WDTIS1+WDTIS0) /* 0.064ms " */

        2、看門狗的時鐘由FACLK(假設為32KHz)

        #define WDT_ARST_1000 (WDTPW+WDTCNTCL+WDTSSEL) /* 1000ms " */

        #define WDT_ARST_250 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS0) /* 250ms " */

        #define WDT_ARST_16 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1) /* 16ms " */

        #define WDT_ARST_1_9 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0) /* 1.9ms " */

        二、P1DIR = 0x40; // P1.6 配置輸出

        P1OUT = 0; // P1關閉 (例1、2、3、4)

        其中DIR 和P1OUT分別配置IO口的方向和輸出值,這里不在贅述,請參考手冊。

        三、BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO (例1和例4)

        BCSCTL3 |= LFXT1S_0; // LFXT1 = 32768Hz (例2和例3)

        /************************************************************

        * Basic Clock Module

        ************************************************************/

        #define __MSP430_HAS_BC2__

        /* Definition to show that Module is available */

        SFR_8BIT(DCOCTL); /* DCO Clock Frequency Control */

        SFR_8BIT(BCSCTL1); /* Basic Clock System Control 1 */

        SFR_8BIT(BCSCTL2); /* Basic Clock System Control 2 */

        SFR_8BIT(BCSCTL3); /* Basic Clock System Control 3 */

        #define MOD0 (0x01) /* Modulation Bit 0 */

        #define MOD1 (0x02) /* Modulation Bit 1 */

        #define MOD2 (0x04) /* Modulation Bit 2 */

        #define MOD3 (0x08) /* Modulation Bit 3 */

        #define MOD4 (0x10) /* Modulation Bit 4 */

        #define DCO0 (0x20) /* DCO Select Bit 0 */

        #define DCO1 (0x40) /* DCO Select Bit 1 */

        #define DCO2 (0x80) /* DCO Select Bit 2 */

        #define LFXT1OF (0x01)

        /* Low/high Frequency Oscillator Fault Flag */

        #define XT2OF (0x02)

        /* High frequency oscillator 2 fault flag */

        #define XCAP0 (0x04) /* XIN/XOUT Cap 0 */

        #define XCAP1 (0x08) /* XIN/XOUT Cap 1 */

        #define LFXT1S0 (0x10) /* Mode 0 for LFXT1 (XTS = 0) */

        #define LFXT1S1 (0x20) /* Mode 1 for LFXT1 (XTS = 0) */

        #define XT2S0 (0x40) /* Mode 0 for XT2 */

        #define XT2S1 (0x80) /* Mode 1 for XT2 */

        #define XCAP_0 (0x00) /* XIN/XOUT Cap : 0 pF */

        #define XCAP_1 (0x04) /* XIN/XOUT Cap : 6 pF */

        #define XCAP_2 (0x08) /* XIN/XOUT Cap : 10 pF */

        #define XCAP_3 (0x0C) /* XIN/XOUT Cap : 12.5 pF */

        #define LFXT1S_0 (0x00)

        /* Mode 0 for LFXT1 : Normal operation */

        #define LFXT1S_1 (0x10) /* Mode 1 for LFXT1 : Reserved */

        #define LFXT1S_2 (0x20) /* Mode 2 for LFXT1 : VLO */

        #define LFXT1S_3 (0x30)

        /* Mode 3 for LFXT1 : Digital input signal */

        #define XT2S_0 (0x00) /* Mode 0 for XT2 : 0.4 - 1 MHz */

        #define XT2S_1 (0x40) /* Mode 1 for XT2 : 1 - 4 MHz */

        #define XT2S_2 (0x80) /* Mode 2 for XT2 : 2 - 16 MHz */

        #define XT2S_3 (0xC0)

        /* Mode 3 for XT2 : Digital input signal */

        四、__bis_SR_register(SCG1 + SCG0); // 關閉 DCO

        __bis_SR_register()是在intrinsics.h這個頭文件中定義了,實現的功能是將SR中的位置零。

        關于頭文件中的代碼作用

        #ifdef __cplusplus

        extern "C"

        {

        #endif

        #ifdef __cplusplus

        }

        #endif /* extern "C" */

        一般用于將C++代碼以標準C形式輸出(即以C的形式被調用),這是因為C++雖然常被認為是C的超集,但是C++的編譯器還是與C的編譯器不同的。C中調用C++中的代碼這樣定義會是安全的。

        五、BCSCTL2 |= SELM_3 + DIVM_3; // MCLK = VLO/8

        BCSCTL2 |= SELM_3 + DIVM_3; // MCLK = 32768/8

        BCSCTL2 |= SELM_0 + DIVM_3; // MCLK = DCO

        BCSCTL2 |= SELM_0 + DIVM_3; // MCLK = DCO/8

        MSP430中有如下定義:

        #define RSEL0 (0x01) /* Range Select Bit 0 */

        #define RSEL1 (0x02) /* Range Select Bit 1 */

        #define RSEL2 (0x04) /* Range Select Bit 2 */

        #define RSEL3 (0x08) /* Range Select Bit 3 */

        #define DIVA0 (0x10) /* ACLK Divider 0 */

        #define DIVA1 (0x20) /* ACLK Divider 1 */

        #define XTS (0x40)

        /* LFXTCLK 0:Low Freq. / 1: High Freq. */

        #define XT2OFF (0x80) /* Enable XT2CLK */

        #define DIVA_0 (0x00) /* ACLK Divider 0: /1 */

        #define DIVA_1 (0x10) /* ACLK Divider 1: /2 */

        #define DIVA_2 (0x20) /* ACLK Divider 2: /4 */

        #define DIVA_3 (0x30) /* ACLK Divider 3: /8 */

        #define DIVS0 (0x02) /* SMCLK Divider 0 */

        #define DIVS1 (0x04) /* SMCLK Divider 1 */

        #define SELS (0x08)

        /* SMCLK Source Select 0:DCOCLK / 1:XT2CLK/LFXTCLK */

        #define DIVM0 (0x10) /* MCLK Divider 0 */

        #define DIVM1 (0x20) /* MCLK Divider 1 */

        #define SELM0 (0x40) /* MCLK Source Select 0 */

        #define SELM1 (0x80) /* MCLK Source Select 1 */

        #define DIVS_0 (0x00) /* SMCLK Divider 0: /1 */

        #define DIVS_1 (0x02) /* SMCLK Divider 1: /2 */

        #define DIVS_2 (0x04) /* SMCLK Divider 2: /4 */

        #define DIVS_3 (0x06) /* SMCLK Divider 3: /8 */

        #define DIVM_0 (0x00) /* MCLK Divider 0: /1 */

        #define DIVM_1 (0x10) /* MCLK Divider 1: /2 */

        #define DIVM_2 (0x20) /* MCLK Divider 2: /4 */

        #define DIVM_3 (0x30) /* MCLK Divider 3: /8 */

        #define SELM_0 (0x00) /* MCLK Source Select 0: DCOCLK */

        #define SELM_1 (0x40) /* MCLK Source Select 1: DCOCLK */

        #define SELM_2 (0x80)

        /* MCLK Source Select 2: XT2CLK/LFXTCLK */

        #define SELM_3 (0xC0)

        /* MCLK Source Select 3: LFXTCLK */

        六、BCSCTL1 = CALBC1_1MHZ; //設置值 (例3、4)

        #ifndef __DisableCalData

        SFR_8BIT(CALDCO_16MHZ); /* DCOCTL Calibration Data for 16MHz */

        SFR_8BIT(CALBC1_16MHZ); /* BCSCTL1 Calibration Data for 16MHz */

        SFR_8BIT(CALDCO_12MHZ); /* DCOCTL Calibration Data for 12MHz */

        SFR_8BIT(CALBC1_12MHZ); /* BCSCTL1 Calibration Data for 12MHz */

        SFR_8BIT(CALDCO_8MHZ); /* DCOCTL Calibration Data for 8MHz */

        SFR_8BIT(CALBC1_8MHZ); /* BCSCTL1 Calibration Data for 8MHz */

        SFR_8BIT(CALDCO_1MHZ); /* DCOCTL Calibration Data for 1MHz */

        SFR_8BIT(CALBC1_1MHZ); /* BCSCTL1 Calibration Data for 1MHz */

        #endif /* #ifndef __DisableCalData */

        關于SFR_8BIT的相關說明:

        External references resolved by a device-specific linker command file

        (外部引用解決的特定于設備的連接器命令文件)

        #define SFR_8BIT(address) extern volatile unsigned char address

        #define SFR_16BIT(address) extern volatile unsigned int address

        七、if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)

        {

        while(1); // If cal const erased,掛起

        } (例3、例4)

        請注意這里的陷阱。它可以清除內存段信息。

        八、IFG1&= ~OFIFG; // 清除OSCFault 標志 (例1、例4)

        時鐘系統將強制使用的MCLK作為其源的DCO在一個時鐘故障的存在。因此,我們必須清除故障標志。

        FG1中斷標志寄存器是1。寄存器中的位域是唯一的振蕩器故障中斷標志 - OFIFG。

        九、while(IFG1&OFIFG)

        {

        IFG1&= ~OFIFG; // 清除OSCFault 標志

        _delay_cycles(100000); // 為可見標志延時

        } (例2、例3)

        在上面的代碼我們把OSCFault標志繼續做我們的任務,由于時鐘系統將默認為VLO?,F在,我們希望確保該標志保持清零,這意味著晶體是啟動并運行著的。

        如果該故障標志是明確的,我們就退出循環。我們需要等待清算后的標志,直到我們再次測試50微秒。該_delay_cycles(100000)。我們需要它是那么長的時間,所以我們可以看到在代碼開頭的LED燈。否則,它會這么快,我們的光將無法看到它。

        配置:

        BCSCTL1

        BCSCTL2

        BCSCTL3

        DCOCTL

        IFG1

        VLO(12KHz)

        SELM_3 + DIVM_3

        LFXT1S_2

        32768KHz

        SELM_3 + DIVM_3

        LFXT1S_0

        While

        晶振、DCO

        SELM_0+ DIVM_3

        LFXT1S_0

        While

        DCO

        CALBC1_1MHZ

        SELM_0+ DIVM_3

        LFXT1S_2

        CALDCO_1MHZ

        結果:

        ACLK

        MCLK

        LFXT1

        VLO(12KHz)

        VLO

        VLO/8

        VLO

        32768Hz

        32768Hz

        32768Hz/8

        32768Hz

        晶振、DCO

        32768Hz

        DCO

        32768Hz

        DCO

        VLO

        DCO/8

        VLO

        首先申明一下我也是才剛剛開始接觸MSP430的片子,算是和大家一起學習吧,很多地方也不是很清楚??傊M蠹液煤皿w會一下MSP430的頭文件(名為:msp430x20x2.h),如果文章中有錯誤的話希望大家發郵件給我。純屬菜鳥入門級別文檔,只是簡單的分析了一下MSP430的時鐘配置問題,對于一個單片機系統而言時鐘可謂是重中之重,可能剛入門多是采用51系列的片子(不包括C8051f系列)所以對時鐘也就沒有過多的接觸,只是涉及速度以及延時程序的時候才會去關心。其實芯片越是高端越是對時鐘有很高的要求,不管是PIC、AVR還是C8051F這些8位的片子,在32位的領域更是這樣,像我所熟悉的Cortex-M3系列包括STM32f103、Stellaris、NXP都是這樣,片子內部的時鐘都是相當的復雜。

        最后在來嘮叨幾句,記得以前玩51的時候那個頭文件真是小兒科,只有寄存器的定義還有一些位操作。程序寫起來相當的麻煩,很多東西都需要去記憶或者干脆去看文檔,所以那個時候還特地寫了一個驅動庫(效仿STM32f103給STC12C5A60S2寫的,取名為Easy Hw OS,其實還是很方便的直接調用函數就可以啦),看到430的頭文件才豁然開朗,這樣做好,雖然沒有驅動庫方便但是很靈活也不需要去記憶那些寄存器的,真的很不錯。喜歡上了430為文以記之。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 五大连池市| 汽车| 黑水县| 锡林郭勒盟| 盐亭县| 泰和县| 虹口区| 济南市| 靖边县| 屏东市| 垦利县| 祁连县| 平罗县| 黎城县| 武夷山市| 临泽县| 徐水县| 临西县| 延津县| 新密市| 临颍县| 平度市| 文安县| 从江县| 凯里市| 安仁县| 原阳县| 旌德县| 格尔木市| 盐边县| 金华市| 金阳县| 佛冈县| 桦川县| 凤凰县| 丹棱县| 平塘县| 多伦县| 德惠市| 恩平市| 博乐市|