




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第八章 STM8S207時鐘編程及其實例本章介紹 STM8S207 的時鐘編程。STM8S207 時鐘控制器功能強大而靈活易用,允許程序運行中將主時鐘從一個時鐘源切換到另一個時鐘源,而且同一個時鐘源可以任意更改分頻系數。 8.1 STM8 時鐘控制簡介 時鐘控制器功能強大而且靈活易用。其目的在于使用戶在獲得最好性能的同時,亦能保證消耗的功率最低。 用戶可獨立地管理各個時鐘源,并將它們分配到 CPU 或各個外設。主時鐘和CPU 時鐘均帶有預分頻器。 具有安全可靠的無故障時鐘切換機制,可在程序運行中將主時鐘從一個時鐘源切換到另一個時鐘源。 抗電磁干擾時鐘配置寄存器 為了避免由電磁干擾造成的對應用程
2、序誤寫操作或系統掛起,大多數關鍵的時鐘配置寄存器都有一個互補寄存器與之相對應。系統將會自動檢測這些關鍵寄存器與其互補寄存器之間是否匹配。如果不匹配,則產生一個 EMS 復位,從而使應用程序恢復到正常操作。詳情請參見時鐘寄存器描述。 1、主時鐘源介紹 下面 4種時鐘源可用做主時鐘 1、1-24MHz 高速外部晶振(HSE) 2、最大 24MHz 高速外部時鐘信號 3、16MHz 高速內部 RC 振蕩器(HSI) 4、128KHz 低速內部 RC(LSI) 所以總的來說可以分為三種時鐘源,HSE、HSI、LSI 2、時鐘樹,如下圖所示由上圖可以發現,作為 f_cpu 的時鐘源可以來源于 f_hse
3、、f_hsi 經過 HSIDIV分頻后的時鐘、f_lsi 這三個時鐘源。而選擇開關在 CKM7:0中。由此事實上可以作為 f_master 的時鐘源頻率有: 外部 HSE 24MHz 內部高速 HSI 16MHz、2 分頻的8MHz、4 分頻的4MHz、8 分頻的2MHz(復位默認時鐘源) 內部低速 LSI 128KHz 上面得到的頻率是 f_master 的頻率,然后 f_master 還可以通過 CPUDIV 來分頻后提供 f_cpu 的時鐘,CPUDIV 可以為 1、2、4、8、16、32、64、128 分頻,最終得到是 CPU 的時鐘頻率 f_cpu。3、時鐘切換 時鐘切換功能為用戶提
4、供了一種易用、快速、安全的從一個時鐘源切換到另一個時鐘源的途徑。 (1)、系統啟動 為使系統快速啟動,復位后時鐘控制器自動使用 HSI 的 8 分頻(HSI/8)做為主時鐘(2MHz)。其原因為 HSI 的穩定時間短,而 8 分頻可保證系統在較差的 VDD條件下安全啟動。 一旦主時鐘源穩定,用戶程序可將主時鐘切換到另外的時鐘源。 (2)、主時鐘切換的過程 用戶可選擇下面兩種方式切換時鐘源:自動切換、手動切換 自動切換使用戶可使用最少的指令完成時鐘源的切換。應用軟件可繼續其它操作而不用考慮切換事件所占的確切時間。具體方法在實例中講解 手動切換與自動切換不同,不能夠立即切換,但它允許用戶精確地控制
5、切換事件發生的時間。具體方法在實例中講解 8.2 時鐘控制寄存器及設置 第六章的 IO 口實驗之所以能正常運行的原因是在于 STM8S207 上電復位后有默認的時鐘源,所以可以正常工作,但是為了更好使用和理解 STM8S207 是有必要清楚掌握 STM8S207 的時鐘編程。 1、主時鐘切換寄存器 CLK_SWR由上面的時鐘樹可知,CLK_SWR 對應的就是 CKM7:0,我也很好奇為什么不一致。 CLK_SWR 有特定的值才有效,是選擇三個時鐘源之一作為 f_master 的時鐘輸入。具體如下所示: 0xE1:HSI 為主時鐘源(復位值) 0xD2:LSI 為主時鐘源(僅當 LSI_EN 選
6、項位為 1 時) 0xB4:HSE 為主時鐘源2、主時鐘狀態寄存器 CLK_CMSR對應著 CLK_SWR,由硬件置位或清除。用以指示當前所選的主時鐘源。如果該寄存器中的值為無效值,則產生 MCU 復位 0xE1:HSI 為主時鐘源(復位值) 0xD2:LSI 為主時鐘源(僅當 LSI_EN 選項位為 1 時) 0xB4:HSE 為主時鐘源 3、時鐘分頻寄存器 CLK_CKDIVR這個寄存器對應了時鐘樹中的 HSIDIV 以及 CPUDIV,正如前面所說的 HSIDIV可以把內部高速 RC 時鐘源分頻后才對 f_master 提供時鐘周期;CPUDIC 就是把f_master 的時鐘周期分頻后
7、再對 f_cpu 提供時鐘周期。具體分頻倍數為: HSIDIV1:0:高速內部時鐘預分頻器,由軟件寫入,用于指定 HSI 分頻因子。 00:fHSI = fHSI RC 輸出 01:fHSI = fHSI RC 輸出/2 10:fHSI = fHSI RC 輸出/4 11:fHSI = fHSI RC 輸出/8 CPUDIV2:0:CPU 時鐘預分頻器,由軟件寫入,用于指定 CPU 時鐘預分頻因子。 000:fCPU = fMASTER 001:fCPU = fMASTER/2 010:fCPU = fMASTER/4 011:fCPU = fMASTER/8 100:fCPU = fMAST
8、ER/16 101:fCPU = fMASTER/32 110:fCPU = fMASTER/64 111:fCPU = fMASTER/128 4、切換控制寄存器 CLK_SWCR這個寄存器主要是查看時鐘源的切換標志位,具體含義如下: SWIF:時鐘切換中斷標志位 由硬件置位或軟件寫 0 清除。該位的含義取決于 SWEN 位的狀態。 手動切換模式下(SWEN=0): 0:目標時鐘源未準備就緒 1:目標時鐘源準備就緒 自動切換模式下(SWEN=0): 0:無時鐘切換事件發生 1:有時鐘切換事件發生 SWIEN:時鐘切換中斷使能由軟件置位或清除 0:時鐘切換中斷禁用 1:時鐘切換中斷使能 SWE
9、N:切換啟動/停止由軟件置位或清除。向該位寫 1 將切換主時鐘至寄存器 CLK_SWR 指定的時鐘源。 0:禁止時鐘切換的執行 1:使能時鐘切換的執行 SWBSY:切換忙由硬件置位或清除。可由軟件清除以復位時鐘切換過程。 0:無時鐘切換在進行。 1:時鐘切換正在進行。 除上面上面主要涉及到的寄存器之外還有 內部時鐘寄存器 CLK_ICKR 外部時鐘寄存器 CLK_ECKR 外設時鐘門控寄存器 1 CLK_PCKENR1 外設時鐘門控寄存器 2 CLK_PCKENR2 時鐘安全系統寄存器 CLK_CSSR 可配置時鐘輸出寄存器 CLK_CCOR HIS 時鐘修正寄存器 CLK_HSITRIMR
10、SWIM 時鐘控制寄存器 CLK_SWIMCCR 這些寄存器在本章最后小節中才略為說明,時鐘編程主要以前面3個寄存器有關。例如 CLK_SWR 是選擇時鐘源、CLK_SWCR 是時鐘切換的控制寄存器,控制切換過程的設置而 CLK_CKDIVR 是設置 HIS 的分頻系數和 f_cpu 的分頻系數8.3 時鐘編程基礎應用 為了從不同角度理解時鐘編程,這節分三個基礎例程分別實現 CPU 和內部高速時鐘分頻例程、自動切換時鐘源例程以及手動切換時鐘源例程。 8.3.1 CPU 分頻以及 HIS 分頻例程 時鐘編程本身并不需要外部設備,為了檢驗時鐘分頻的效果,在這里采用了一個 LED 燈閃耀的效果來檢驗
11、時鐘的快慢,具體實現是相同的延時函數,在不同的時鐘頻率下跑的效果有很大差異,這樣就達到了檢查實驗的效果。 如下圖所示:在這里使用了 LED1,也就是 PD0 端口,對應的 IO 口操作在前一章已經有過詳細介紹。本實驗操作的寄存器只有一個,就是 CLK_CKDIVR ,具體如下所示: HSIDIV1:0:高速內部時鐘預分頻器,由軟件寫入,用于指定 HSI 分頻因子。 00:fHSI = fHSI RC 輸出 01:fHSI = fHSI RC 輸出/2 10:fHSI = fHSI RC 輸出/4 11:fHSI = fHSI RC 輸出/8(默認) CPUDIV2:0:CPU 時鐘預分頻器,由
12、軟件寫入,用于指定 CPU 時鐘預分頻因子。 000:fCPU = fMASTER 001:fCPU = fMASTER/2 010:fCPU = fMASTER/4 011:fCPU = fMASTER/8 100:fCPU = fMASTER/16 101:fCPU = fMASTER/32 110:fCPU = fMASTER/64 111:fCPU = fMASTER/128 程序代碼如下: /* 每一個時鐘分頻周期為閃耀燈5次 HSI CPU 1:1 16M HSI CPU 1:4 4MHSI CPU 2:4 2M */ #include "iostm8s207rb.h&q
13、uot; void delay_ms(int value); int main( void ) int i; /配置PD0為輸出 PD_DDR_DDR0 = 1; PD_CR1_C10 = 1; PD_CR2_C20 = 0; PD_ODR_ODR0 = 1; while(1) /HSI CPU 1:1 16M CLK_CKDIVR = 0x00; for(i=0;i!=10;+i) PD_ODR_ODR0 = PD_ODR_ODR0; delay_ms(100); delay_ms(100); /HSI CPU 1:4 4M CLK_CKDIVR_HSIDIV = 0; CLK_CKDIVR
14、_CPUDIV = 2; for(i=0;i!=10;+i) PD_ODR_ODR0 = PD_ODR_ODR0; delay_ms(100); delay_ms(100); /HSI CPU 2:4 2M CLK_CKDIVR_HSIDIV = 1; CLK_CKDIVR_CPUDIV = 2; for(i=0;i!=10;+i) PD_ODR_ODR0 = PD_ODR_ODR0; delay_ms(100); delay_ms(100); /* * 簡單延時 * */ void delay_ms(int value) int i,j; if(value < 1) value = 1
15、; for(i=0;i!=value;+i) for(j=0;j!=5000;+j); 8.3.2 自動切換時鐘源 因為 STM8S 單片機上電復位是采用了內部時鐘源 HIS,所以在這里實現的功能是切換外部時鐘源。由于 STM8S207 開發板使用的外部晶振是 24M,在主頻大于 16M 以上時,需要更改選項字,這里降低實驗的難易程度,決定在這里采用外部時鐘然后通過 CPUDIV 2 分頻得到的 f_cpu 主頻為12M 自動切換時鐘源的對應步驟: 1、設置切換控制寄存器(CLK_SWCR)中的位 SWEN,使能切換機制。 2、向主時鐘切換寄存器(CLK_SWR)寫入一個 8 位的值,用以選擇
16、目標時鐘源。寄存器 CLK_SWCR 中的 SWBSY 被硬件置位,目標源振蕩器啟動。原時鐘源依然被用于驅動內核和外設。 一旦目標時鐘源穩定,寄存器 CLK_SWR 中的值將被復制到主時鐘狀態寄存器(CLK_CMSR)中去。此時,SWBSY 位被清除,新時鐘源替代舊時鐘源。寄存器CLK_SWCR 中的標志位 SWIF 被置位,如果 SWIEN 為 1,則會產生一個中斷。硬件采用 8.3.1 的電路圖,也是通過 LED 實現檢測效果 詳細代碼如下: #include "iostm8s207rb.h" void delay_ms(int value); int main( vo
17、id ) int i; /配置PD0為輸出模式 PD_DDR_DDR0 = 1; PD_CR1_C10 = 1; /推挽輸出 PD_CR2_C20 = 0; PD_ODR_ODR0 = 1; /LED1滅while(1) /自動切換方式 CLK_SWCR_SWIEN = 0; /禁止時鐘切換中斷 CLK_SWCR_SWEN = 1; /使能切換機制 CLK_SWR = 0xB4; /0XE1: HSI為主時鐘源(復位值,內部16MHz) /0XD2: LSI為主時鐘源(僅當LSI_EN選項為1時) /0XB4: HSE為主時鐘源(外部時鐘) CLK_CKDIVR = 1; /CPUDIV 2分
18、頻 /切換后的時鐘為12M delay_ms(100); for(i=0;i!=10;+i) PD_ODR_ODR0 = PD_ODR_ODR0; delay_ms(100); /自動切換方式 CLK_SWCR_SWIEN = 0; /禁止時鐘切換中斷 CLK_SWCR_SWEN = 1; /使能切換機制 CLK_SWR = 0xE1; /0XE1: HSI為主時鐘源(復位值,內部16MHz) /0XD2: LSI為主時鐘源(僅當LSI_EN選項為1時) /0XB4: HSE為主時鐘源(外部時鐘) /切換后的時鐘時16M/2 = 8M delay_ms(100); for(i=0;i!=10;
19、+i) PD_ODR_ODR0 = PD_ODR_ODR0; delay_ms(100); /* * 簡單延時程序 * */ void delay_ms(int value) int i,j; if(value < 1) value = 1; for(i=0;i!=value;+i)for(j=0;j!=5000;+j); 8.3.3 手動切換時鐘源 手動切換與自動切換不同,不能夠立即切換,但它允許用戶精確地控制切換事件發生的時間。 具體操作步驟: 1、向主時鐘切換寄存器(CLK_SWR)寫入一個 8 位的值,用以選擇目標時鐘源。寄存器 CLK_SWCR 中的 SWBSY 被硬件置位,目
20、標源振蕩器啟動。原時鐘源依然被用于驅動內核和外設。 2、用戶軟件需等待至目標時鐘源穩定。寄存器 CLK_SWCR 中的標志位 SWIF用以指示目標時鐘源是否已穩定,如果 SWIEN 為 1,則會產生一個中斷。 3、最后,由用戶軟件在所選的時間點,設置寄存器 CLK_SWCR 中的位 SWEN,執行切換。 在前兩個例程的基礎上,我們可以進行時鐘編程的第三個例程了,具體的步驟如上所示,下面進行我們的軟件編寫。 /* * 手動切換順序 1、向CLK_SWR寫入一個數據,選擇目標時鐘源 2、等待CLK_SWCR_SWIF = 1,時鐘穩定 3、設置CLK_SWCR_SWEN = 1,開啟時鐘 * */
21、 #include "iostm8s207rb.h" void delay_ms(int value); int main( void ) int i; /配置LED1 PD_DDR_DDR0 = 1; PD_CR1_C10 = 1; /推挽輸出 PD_CR2_C20 = 0; PD_ODR_ODR0 = 1; /LED1滅 CLK_SWCR_SWIEN = 0; /禁止中斷 CLK_CKDIVR = 1; /CPUDIV設置為2分頻 while(1) /手動切換方式 CLK_SWR = 0xB4; /0XE1: HSI為主時鐘源(復位值,內部16MHz)/0XD2: LS
22、I為主時鐘源(僅當LSI_EN選項為1時) /0XB4: HSE為主時鐘源(外部時鐘) while(CLK_SWCR_SWIF = 0); /等待時鐘穩定,輸出時鐘為12M CLK_SWCR_SWEN = 1; /切換時鐘 for(i=0;i!=10;+i) PD_ODR_ODR0 = PD_ODR_ODR0; delay_ms(100); delay_ms(100); /手動切換方式 CLK_SWR = 0xE1; /0XE1: HSI為主時鐘源(復位值,內部16MHz) /0XD2: LSI為主時鐘源(僅當LSI_EN選項為1時) /0XB4: HSE為主時鐘源(外部時鐘) while(CLK_SWCR_SWIF = 0); /等待時鐘穩定,輸出時鐘為8M CLK_SWCR_SWEN = 1; /切換時鐘 for(i=0;i!=10;+i) PD_ODR_ODR0 = PD_ODR_ODR0; delay_ms(100); delay_ms(100); /* * 簡單延時程序 * */ void delay_ms(int value) int i,j; if(value < 1) value = 1; for(i=0;i!=value;+i) for(j=0;j!=5000;+j); 8.4 其它關于時鐘編程寄存器 時鐘編程的其它寄存器涉及到外設和時鐘安全方面
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 社區活躍度的預算與投資合同
- 全職員工離職說明
- 數據庫技術COMPUTER87課件
- 鐵路市場營銷集中性市場營銷策略課件
- 雙總線冗余供電方式盧凱霞時間年月課件
- 中醫特色護理課件
- 中醫關于水腫的課件
- 高空電力作業安全合同
- 養生保健品經銷合同范本
- 北京市東城區2024屆高三下學期一模歷史試題 含解析
- 環境毒理學考試整理重點
- GH-T 1388-2022 脫水大蒜標準規范
- (完整版)軟件工程導論(第六版)張海藩牟永敏課后習題答案
- 金屬材料成形工藝及控制課件:軋制理論與工藝 (2)-
- 《我與集體共成長》的主題班會
- 六年級趣味數學活動課堂課件
- imo中的問題定理與方法
- 新能源汽車運用與維修專業人才培養方案
- 氨吹脫塔單元設計示例
- 中國移動-安全-L3
- GB/T 42314-2023電化學儲能電站危險源辨識技術導則
評論
0/150
提交評論