STM8 時鐘切換

2021-09-23 06:17:18 字數 2692 閱讀 8105

hse、hsi、lsi 都可以作為系統主時鐘源,stm8 微控制器復位以後預設 hsi 的 8 分頻作為系統主時鐘,其原因是 hsi 穩定時間短,而其 8 分頻又可以保證系統在較差的 vdd 條件下安全啟動。在系統執行的過程中可以切換系統的主時鐘源。系統時鐘源的切換有 2 種方式:自動切換、手動切換。

自動切換可以使用最少的指令來完成主時鐘源的切換,使用者程式可以處理其他事物而不用關心確切的切換時間;手動切換在硬體準備好之後不立即切換,允許使用者精確的控制切換發生的時間。

自動切換的步驟為:

1.設定切換控制暫存器 clk_swcr 中的 swen 位,使能時鐘切換。

2.設定主時鐘切換暫存器 clk_swr,選擇目標時鐘源。切換控制暫存器中的切換忙標誌位 swbsy被硬體置位,目標時鐘源啟動,原時鐘源依舊驅動核心和外設。一旦目標時鐘源穩定,主時鐘切換暫存器 clk_swr 中的值將被複製到主時鐘狀態暫存器 clk_cmsr 中。此時,swbsy 位被硬體清零,目標時鐘源替代原時鐘源,clk_swcr 暫存器中的時鐘切換中斷標誌位 swif 被硬體置位,如此時鐘切換中斷被使能,則會產生中斷。

手動切換的步驟為:

1.設定主時鐘切換暫存器 clk_swr,選擇目標時鐘源。swbsy 位會被硬體置位,目標時鐘源啟動,原時鐘源依然驅動核心和外設。

2.使用者程式通過讀取 clk_swcr 暫存器的 swif 位來等待目標時鐘源準備就緒,swif 為 1 時代表目標時鐘源準備就緒。如果時鐘切換被使能,swif 被硬體置位時將觸發中斷。

3.如果目標時鐘源準備就緒,則使用者程式在預期的時間點將 clk_swcr 暫存器的 swen 位置位來進行時鐘切換。

通過判斷 swif 位可以判斷時鐘切換是否完成,通過讀取 clk_cmsr 暫存器可以得知當前的系統主時鐘源。切換完成之後要寫 swif 位為 0 你來清零此標誌。

不管是自動切換還是手動切換,如果原時鐘源在切換後仍然被其他模組使用,則原時鐘源不會被自動關閉,需要通過配置內部時鐘暫存器 clk_ickr 或外部時鐘暫存器 clk_eckr 來關閉。

如果時鐘切換沒有成功,可以通過軟體清零 swbsy 位來復位當前切換,使 clk_swr 恢復原時鐘源。

自動切換和手動切換的流程圖對比如圖所示。

下面我們通過例項來掌握 stm8s 時鐘切換的操作。本章節的例項設想開發板的 led 分別在系統主時鐘為 hsi/8、hsi、hse/16、lsi 的時候各閃爍 5 次,系統主時鐘的切換分別採用自動切換和手動切換,通過實驗現象即可判斷系統時鐘切換是否成功。

;//hsi 不分頻,主時鐘 16m

for(i=

0;i<

5;i++

)//hse 做主時鐘源,自動時鐘切換

clk_swcr|

=0x02

;//時鐘切換啟動,swen=1

clk_swr=

0xb4

;//選擇目標時鐘源,0xb4=hse

while

((clk_swcr&

0x08)==

0);//等待切換時間發生,此時 swif=1

clk_swcr&

=0xf7

;//清除切換標誌

if(clk_cmsr==

0xb4

)//判斷主時鐘源是否為 hse

}//lsi 做主時鐘源,手動時鐘切換,請先在選項位元組中使能 lsi

clk_swr=

0xd2

;//選擇目標時鐘源,0xd2=lsi

while

((clk_swcr&

0x08)==

0);//等待目標時鐘源準備就緒,此時 swif=1

clk_swcr&

=0xf7

;//清除切換標誌

clk_swcr|

=0x02

;//進行切換

if(clk_cmsr==

0xd2)}

while(1

)}void

initled

(void

)initled();函式為 led 初始化函式,與前面章節的**相同。

首先 hsi 做系統主時鐘。系統復位後預設 hsi/8=2m 為系統主時鐘;接著,通過修改 clk_ckdivr暫存器,使 hsi 不分頻作為系統主時鐘。

系統主時鐘由 hsi 切換至 hse 是通過自動切換方式實現的。首先置位 swen 位以啟動時鐘切換;然後設定 clk_swr 暫存器以選擇目標時鐘源為 hse;通過讀取 swif 位的值來判斷系統時鐘切換是否完成,如果 swif 為 1 則表示轉換完成;轉換完成之後要通過軟體來寫入 0 來清標誌位 swif。

系統主時鐘由 hse 切換至 lsi 是通過手動切換的方式實現的。在編寫程式之前需要先修改選項位元組option byte 以使能 lsi;程式中先設定 clk_swr 暫存器以選擇目標時鐘源為 lsi;通過讀取 swif的值等待至 lsi 就緒之後清除 swif 位,接著置位 swen 位啟動轉換。

可以通過讀取 clk_cmsr 暫存器檢視當前系統時鐘源是否為預設的目標時鐘源。

實驗現象為 led 以 4 種不同的頻率閃爍,與預期的實驗效果相符。

STM8 時鐘源切換

1 1 24mhz的高速外部晶體振盪器 hse 即外部晶振 2 1 24mhz的高速外部時鐘訊號 hse 3 16mhz的高速內部rc振盪器 hsi 4 128khz的低速內部rc振盪器 lsi 由上述時鐘框圖,可以分析得知,16mhz hsi rc振盪器經過乙個分頻器,將時鐘訊號輸出到主時鐘選擇器...

STM8微控制器時鐘

時鐘樹 時鐘源有四種 外部高速晶振 hse 1 16mhz 內部高速rc振盪器 hsi 16mhz 外部低速晶振 lse 32.768 內部低速rc振盪器 lsi 38khz 系統預設配置的時鐘為hsi的8分頻既2mhz 外部時鐘配置hse clk deinit 復位所有時鐘暫存器 clk hsic...

1 時鐘無縫切換

時鐘切換分成兩種方式,普通切換和去毛刺無縫切換。普通切換 就是不關心切出的時鐘是否存在毛刺,這種方式電路成本小。如果時鐘切換時,使用此時鐘的模組電路處於非工作狀態,或者模組內電路被全域性復位訊號reset住的,即使切出毛刺也不會導致dff誤觸發,這樣的模組可以選擇用此種切換方式。寫法很簡單assig...