第一篇博文,不知如何开始,想了很久,一直都在犹豫。多年来,有每天坚持写日记的习惯,我想,二者是相通的,记录点滴和成长,唯有贵在坚持!
废话少说,进入正题。STM8的时钟系统相较于STM32,没有那么复杂,从时钟树上可以看到全貌,如图
主时钟源可以选择4种时钟源:HSE(1-24MHZ)、HSI(16M)、LSI(128K)和最大24M的外部高速时钟。
系统复位后,默认使用HSI的8分频作为主时钟,因为HSI稳定的时间较短,8分频可保证系统在较差的VDD条件下安全启动。
现在将HSI时钟切换到HSE
void Sys_clk_Init() //使用外部16M晶振
{
//CLK_ICKR |= 0x00; //开启HSI
CLK_ECKR |= 0X01; //开启HSE
while(!(CLK_ECKR&0X02)); //等待HSE准备就绪
CLK_SWCR |= 0X02; //时钟切换开启
CLK_SWR = 0XB4; //选择HSE为主时钟源
while((CLK_SWCR&0X08)==0); //等待切换成功
CLK_SWCR &= 0xf6; //开启CSS前,要先清除SWBSY位;清除SWIF位
//CLK_PCKENR1 |= 0xFF; //使能Fmaster与外设相连
CLK_CSSR |= 0x01; //开启时钟安全机制
}
在上面代码中,曾犯了个错误,就是将CLK_SWR = 0XB4写成了CLK_SWR |= 0XB4;导致在测试过程中始终切换不到HSE,原因是CLK_SWR 的复位值是0xe1(HSI),如果或上0xb4(HSE),则CLK_SWR 的值最终为0xa0,所以时钟切换错误,系统还是使用HSI,粗心导致错误。
在main.c文件中验证如下
#include "includes.h"
#define HSE_16M
void delay(uint16_t time){ //时钟源选择不同,系统时钟fmaster运行delay()的时间也不同
do{
for(int i=0;i<100;i++)
{
for(int j=0; j<100;j++)
{;}
}
}while(time--);
}
void main(){
#ifdef HSE_16M
Sys_clk_Init();
#endif
while(1){
LED_ON();
delay(100);
LED_OFF();
delay(100);
}
}
通过屏蔽#define HSE_16M来观察LED闪烁的快慢不同,说明时钟切换成功。