stm8s時(shí)鐘源切換
切換時(shí)鐘源,主要涉及到的寄存器有:主時(shí)鐘切換寄存器CLK_SWR和切換控制寄存器CLK_SWCR。
本文引用地址:http://butianyuan.cn/article/201611/315604.htm主時(shí)鐘切換寄存器的復(fù)位值為0xe1,表示切換到內(nèi)部的高速RC振蕩器上。當(dāng)往該寄存器寫(xiě)入0xb4時(shí),表示切換到外部的高速晶體振蕩器上。
在實(shí)際切換過(guò)程中,應(yīng)該先將切換控制寄存器中的SWEN(第1位)設(shè)置成1,然后設(shè)置CLK_SWCR的值,最后要判斷切換控制寄存器中的SWIF標(biāo)志是否切換成功。
下面的實(shí)驗(yàn)程序首先將主時(shí)鐘源切換到外部的晶體振蕩器上,振蕩頻率為8MHZ,然后,然后快速閃爍LED指示燈。接著,將主時(shí)鐘源又切換到內(nèi)部的振蕩器上,振蕩頻率為2MHZ,然后再慢速閃爍LED指示燈。通過(guò)觀察LED指示燈的閃爍頻率,可以看到,同樣的循環(huán)代碼,由于主時(shí)鐘源的改變的改變,閃爍頻率和時(shí)間長(zhǎng)短都發(fā)生了變化。
同樣還是利用ST的開(kāi)發(fā)工具,生成一個(gè)C語(yǔ)言程序的框架,然后修改其中的main.c,修改后的代碼如下。
// 程序描述:通過(guò)切換CPU的主時(shí)鐘源,來(lái)改變CPU的運(yùn)行速度
#include "STM8S207C_S.h"
// 函數(shù)功能:延時(shí)函數(shù)
// 輸入?yún)?shù):ms -- 要延時(shí)的毫秒數(shù),這里假設(shè)CPU的主頻為2MHZ
// 輸出參數(shù):無(wú)
// 返 回 值:無(wú)
// 備 注:無(wú)
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設(shè)置成推挽輸出,以便推動(dòng)LED
PD_DDR = 0x08;
PD_CR1 = 0x08;
PD_CR2 = 0x00;
// 啟動(dòng)外部高速晶體振蕩器
CLK_ECKR = 0x01; // 允許外部高速振蕩器工作
while((CLK_ECKR & 0x02) == 0x00); // 等待外部高速振蕩器準(zhǔn)備好
// 注意,復(fù)位后CPU的時(shí)鐘源來(lái)自?xún)?nèi)部的RC振蕩器
for(;;) // 進(jìn)入無(wú)限循環(huán)
{
// 下面將CPU的時(shí)鐘源切換到外部的高速晶體振蕩器上,在開(kāi)發(fā)板上的頻率為8MHZ
// 通過(guò)發(fā)光二極管,可以看出,程序運(yùn)行的速度確實(shí)明顯提高了
CLK_SWCR = CLK_SWCR | 0x02; // SWEN <- 1
CLK_SWR = 0xB4; // 選擇芯片外部的高速振蕩器為主時(shí)鐘
while((CLK_SWCR & 0x08) == 0); // 等待切換成功
CLK_SWCR = CLK_SWCR & 0xFD; // 清除切換標(biāo)志
for(i=0;i<10;i++) // LED高速閃爍10次
{
PD_ODR = 0x08;
DelayMS(100);
PD_ODR = 0x00;
DelayMS(100);
}
// 下面將CPU的時(shí)鐘源切換到內(nèi)部的RC振蕩器上,由于CLK_CKDIVR的復(fù)位值為0x18
// 所以16MHZ的RC振蕩器要經(jīng)過(guò)8分頻后才作為主時(shí)鐘,因此頻率為2MHZ
// 通過(guò)發(fā)光二極管,可以看出,程序運(yùn)行的速度確實(shí)明顯下降了
CLK_SWCR = CLK_SWCR | 0x02; // SWEN <- 1
CLK_SWR = 0xE1; // 選擇HSI為主時(shí)鐘源
while((CLK_SWCR & 0x08) == 0); // 等待切換成功
CLK_SWCR = CLK_SWCR & 0xFD; // 清除切換標(biāo)志
for(i=0;i<10;i++) // LED低速閃爍10次
{
PD_ODR = 0x08;
DelayMS(100);
PD_ODR = 0x00;
DelayMS(100);
}
}
}
評(píng)論