STM8S具有一個強大的時鐘系統,內部提供一個高速16M的RC振蕩器,和一個低速128K的RC振蕩器。
時鐘控制器功能強大而且靈活易用。其目的在于使用戶在獲得最好性能的同時,亦能保證消耗的功率最低。用戶可獨立地管理各個時鐘源,并將它們分配到CPU或各個外設。主時鐘和CPU時鐘均帶有預分頻器。具有安全可靠的無故障時鐘切換機制,可在程序運行中將主時鐘從一個時鐘源切換到另一個時鐘源。
一般來說,時鐘樹是配置時鐘、控制時鐘的依據,所以需要掌握,以下是STM8S時鐘樹圖:
從圖中看出,一共有3個時鐘源,分別是HSE(高速外部時鐘)、HSI(高速內部時鐘)、LSI(低速內部時鐘)。
HSE(高速外部時鐘)可通過外部晶振提供,HSI(高速內部時鐘)為16M的RC振蕩器,LSI(低速內部時鐘)為128K的RC振蕩器。
高速時鐘(HSE和HSI)可以通過分頻器進行降頻。降頻過后的時鐘和原本的時鐘都可以通過Master Clock Switch進行選擇,
以下是初始化系統時鐘的函數(默認使用16M內部RC):
void Set_HSISpeed(void)
{
//啟用內部高速晶振且無分頻16MHz
CLK_ICKR|=0x01; //開啟內部HSI
while(!(CLK_ICKR&0x02));//HSI準備就緒
CLK_SWR=0xe1; //HSI為主時鐘源
CLK_CKDIVR=0x00; //HSI不分頻
}
如果需要切換時鐘,需要先等待時鐘穩定:
void Switch_LSISpeed(void)
{
CLK_SWCR|=0x02; //開啟切換
CLK_ICKR|=0x08; //開啟LSI
while(!(CLK_ICKR&0x10));//HSI準備就緒
CLK_SWR=0xd2; //LSR為主時鐘源
while((CLK_SWCR & 0x01)==0x01);//等待切換完成
CLK_CKDIVR=0x00; //LSI不分頻
CLK_SWCR&=(~0x02); //關閉切換
}
void Switch_HSISpeed(void)
{
CLK_SWCR|=0x02; //開啟切換
CLK_ICKR|=0x01; //開啟內部HSI
while(!(CLK_ICKR&0x02));//HSI準備就緒
CLK_SWR=0xe1; //HSI為主時鐘源
while((CLK_SWCR & 0x01)==0x01);//等待切換完成
CLK_CKDIVR=0x00; //HSI不分頻
CLK_SWCR&=(~0x02); //關閉切換
}
如果想直接降頻,只需要設置始終分頻:
void Set_CPU_Full_Speed(void)
{
CLK_CKDIVR=0x00; //HSI不分頻
}
void Set_CPU_Low_Speed(void)
{
CLK_CKDIVR=0x07; //HSI 128分頻
}
以上就是初始化時鐘的代碼,一般用于mian函數的第一句話,方便以后計算其他外設的時鐘頻率。
責任編輯:gt
-
控制器
+關注
關注
112文章
16396瀏覽量
178512 -
振蕩器
+關注
關注
28文章
3839瀏覽量
139167 -
時鐘
+關注
關注
11文章
1736瀏覽量
131577
發布評論請先 登錄
相關推薦
ESP32S2在復位初始化的時最初的GPIO的狀態是什么樣的?
把STM8S的定時器1和定時器4同時初始化和打開遇到的疑問求解
STM8S TIM4中斷一開,程序異常怎么解決?
stm32定時器在初始化參數之前是否必須開啟對應時鐘?
關于STM32F103VC零下10℃時鐘初始化問題求解
啟動外部16MHz時鐘后STM8S003的ADC無法初始化是怎么回事?
STM32F4卡死在時鐘初始化配置上是哪里出了問題?
STM32F303RCT6 CAN初始化時鐘卡住了顯示超時狀態,造成初始化異常怎么解決?
使用CUBEMX生成配置好的UCPD外設初始化代碼后,未發現UCPDHAL庫函數是為什么?
MCU單片機GPIO初始化該按什么順序配置?為什么初始化時有電平跳變?
![MCU單片機GPIO<b class='flag-5'>初始化</b>該按什么順序配置?為什么<b class='flag-5'>初始化</b>時有電平跳變?](https://file1.elecfans.com/web2/M00/C1/7A/wKgaomXWul2AKoIuAAAxlaP9tbg978.png)
評論