新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > stm8s時鐘源切換

        stm8s時鐘源切換

        作者: 時間:2016-11-18 來源:網絡 收藏
        STM8單片機的時鐘源非常豐富,芯片內部既有16MHZ的高速RC振蕩器,也有128KHZ的低速RC振蕩器,外部還可以接一個高速的晶體振蕩器。在系統運行過程中,可以根據需要,自由地切換。單片機復位后,首先采用的是內部的高速RC振蕩器,且分頻系數為8,因此CPU的上電運行的時鐘頻率為2MHZ。

        切換時鐘源,主要涉及到的寄存器有:主時鐘切換寄存器CLK_SWR和切換控制寄存器CLK_SWCR。

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

        主時鐘切換寄存器的復位值為0xe1,表示切換到內部的高速RC振蕩器上。當往該寄存器寫入0xb4時,表示切換到外部的高速晶體振蕩器上。

        在實際切換過程中,應該先將切換控制寄存器中的SWEN(第1位)設置成1,然后設置CLK_SWCR的值,最后要判斷切換控制寄存器中的SWIF標志是否切換成功。

        下面的實驗程序首先將主時鐘源切換到外部的晶體振蕩器上,振蕩頻率為8MHZ,然后,然后快速閃爍LED指示燈。接著,將主時鐘源又切換到內部的振蕩器上,振蕩頻率為2MHZ,然后再慢速閃爍LED指示燈。通過觀察LED指示燈的閃爍頻率,可以看到,同樣的循環代碼,由于主時鐘源的改變的改變,閃爍頻率和時間長短都發生了變化。

        同樣還是利用ST的開發工具,生成一個C語言程序的框架,然后修改其中的main.c,修改后的代碼如下。

        // 程序描述:通過切換CPU的主時鐘源,來改變CPU的運行速度

        #include "STM8S207C_S.h"

        // 函數功能:延時函數

        // 輸入參數:ms -- 要延時的毫秒數,這里假設CPU的主頻為2MHZ

        // 輸出參數:無

        // 返 回 值:無

        // 備 注:無

        void DelayMS(unsigned int ms)

        {

        unsigned char i;

        while(ms != 0)

        {

        for(i=0;i<250;i++)

        {

        }

        for(i=0;i<75;i++)

        {

        }

        ms--;

        }

        }

        main()

        {

        int i;

        // 將PD3設置成推挽輸出,以便推動LED

        PD_DDR = 0x08;

        PD_CR1 = 0x08;

        PD_CR2 = 0x00;

        // 啟動外部高速晶體振蕩器

        CLK_ECKR = 0x01; // 允許外部高速振蕩器工作

        while((CLK_ECKR & 0x02) == 0x00); // 等待外部高速振蕩器準備好

        // 注意,復位后CPU的時鐘源來自內部的RC振蕩器

        for(;;) // 進入無限循環

        {

        // 下面將CPU的時鐘源切換到外部的高速晶體振蕩器上,在開發板上的頻率為8MHZ

        // 通過發光二極管,可以看出,程序運行的速度確實明顯提高了

        CLK_SWCR = CLK_SWCR | 0x02; // SWEN <- 1

        CLK_SWR = 0xB4; // 選擇芯片外部的高速振蕩器為主時鐘

        while((CLK_SWCR & 0x08) == 0); // 等待切換成功

        CLK_SWCR = CLK_SWCR & 0xFD; // 清除切換標志

        for(i=0;i<10;i++) // LED高速閃爍10次

        {

        PD_ODR = 0x08;

        DelayMS(100);

        PD_ODR = 0x00;

        DelayMS(100);

        }

        // 下面將CPU的時鐘源切換到內部的RC振蕩器上,由于CLK_CKDIVR的復位值為0x18

        // 所以16MHZ的RC振蕩器要經過8分頻后才作為主時鐘,因此頻率為2MHZ

        // 通過發光二極管,可以看出,程序運行的速度確實明顯下降了

        CLK_SWCR = CLK_SWCR | 0x02; // SWEN <- 1

        CLK_SWR = 0xE1; // 選擇HSI為主時鐘源

        while((CLK_SWCR & 0x08) == 0); // 等待切換成功

        CLK_SWCR = CLK_SWCR & 0xFD; // 清除切換標志

        for(i=0;i<10;i++) // LED低速閃爍10次

        {

        PD_ODR = 0x08;

        DelayMS(100);

        PD_ODR = 0x00;

        DelayMS(100);

        }

        }

        }



        關鍵詞: stm8s時鐘源切

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 井陉县| 工布江达县| 崇左市| 华阴市| 永年县| 北流市| 石景山区| 嘉禾县| 岢岚县| 英德市| 镇坪县| 辉南县| 海门市| 安阳县| 桑日县| 陵水| 宜兰县| 康保县| 吉木乃县| 富蕴县| 高尔夫| 平凉市| 类乌齐县| 东乡族自治县| 元氏县| 天峨县| 无棣县| 定襄县| 区。| 浮梁县| 布尔津县| 岑溪市| 城步| 梅州市| 阿拉善盟| 台山市| 铜梁县| 兰坪| 高安市| 涟源市| 渝北区|