1. 程式人生 > >STM8 時鐘源切換

STM8 時鐘源切換

STM8時鐘源:

1、1~24MHz的高速外部晶體振盪器(HSE),即外部晶振
2、1~24MHz的高速外部時鐘訊號(HSE),
3、16MHz的高速內部RC振盪器(HSI)
4、128KHz的低速內部RC振盪器(LSI)
時鐘框圖

預設時鐘源:

由上述時鐘框圖,可以分析得知,16MHz HSI RC振盪器經過一個分頻器,將時鐘訊號輸出到主時鐘選擇器。微控制器上電後預設該分頻器的值為8分頻,即微控制器上電主時鐘預設使用HSI 8分頻後的時鐘輸出,即主時鐘頻率fmaster=16MHz/8=2MHz,然後由主時鐘輸出時鐘訊號到外設和CPU。

時鐘源選擇:

可以通過讀取主時鐘狀態暫存器CLK_CMSR來獲取當前主時鐘是採用的哪一個時鐘源。
主時鐘狀態暫存器


既然可以知道當前使用的是哪一個時鐘源了,那麼怎麼切換呢?就需要操作主時鐘切換暫存器CLK_SWR和切換控制暫存器CLK_SWCR了,先看CLK_SWCR暫存器:
主時鐘切換控制暫存器
用到了低四位,切換忙標誌位SWBSY,切換使能位SWEN,切換中斷使能位SWIEN和時鐘切換中斷標誌位SWIF。
而向主時鐘切換暫存器CLK_SWR寫入資料可以指定要切換的時鐘源:
主時鐘切換暫存器

在開始切換時鐘時,需要首先置位SWEN,使能時鐘切換然後等待時鐘切換事件發生,然後機制時鐘切換即可,具體實現程式碼如下(我這裡切換到HSE時鐘源):

 if(CLK_CMSR !=0xB4){  //如果當前時鐘不是使用外部HSE時鐘源
    CLK_SWCR |=0x02
; //使能時鐘切換 CLK_SWR = 0xB4; //切換時鐘, while((CLK_SWCR & 0x08)==0);//等待時鐘切換完成 CLK_SWCR &=~0x02;//禁止時鐘切換 }

在除錯時,程式碼執行完成之後,如果CLK_CMSR的值為0xB4則時鐘源切換成功。

這裡附上一個例程,實現功能為:STM8時鐘源切換時鐘到HSE(8MHz),然後在主函式中迴圈列印一串字串到PC機,例程地址為:http://download.csdn.net/detail/yuanquanzheng/9756971
另外我的編譯環境使用的是IAR for STM8