SMT8L的四大时钟源LSE,LSI,HSE,HSI,都可以作为系统时钟。

系统上电后,HSI/8作为默认系统时钟,启动完成后,用户可以切换系统时钟源。
切换分为自动切换和手动切换,没有太大的区别。
下面是自动切换的流程图,按照此流程图,编写程序,即可实现时钟切换。
只需要三步即可实现系统时钟切换:
①置位CLK_SWCR寄存器中的SWEN位,允许时钟切换
②向CLK_SWR中写数据,选择目标时钟源
③等待SWBSY清零,即等待时钟切换完成

时钟切换完成后,在主循环中翻转IO电平,通过测量IO口的输出频率,可以直观的看到切换时钟,系统时钟频率发生了变化。
本程序选择LSE(32.768KHz)作为系统时钟,时钟切换完成后,PC7翻转电平,使用逻辑分析可以测量到此时PC7的输出频率。如下图:

可以看到PC7输出频率为2.73KHz,并不是32.768KHz。这是因为,STM8L一个指令周期为二个时钟周期,同时翻转电平的程序,高电平时间需要3个指令周期,低电平时间同样为3个指令周期。所以最终测量到的IO输出频率为32.768KHz/2/6=2.730667KHz。如果选择的时钟源为16M(HSI),则最终测得的IO输出频率为16M/2/6=1.33M。要注意,系统时钟的分频器默认8分频,需要清零分频器,才满足此计算方式。
#include"iostm8l152c6.h"
/****************************************************************************************
*开发环境:IAR for stm8v6.5
*硬件平台:STM8L-DISCOVERY
*功能说明:本程序选择LSE(32.768KHz)作为系统时钟,时钟切换完成后,PC7翻转电平,使用逻辑分析可以测量到此时PC7的输出频率,最终测量到的IO输出频率为32.768KHz/2/6=2.730667KHz。
*作 者:茗风
****************************************************************************************/
/******************************************************************************************************
* 名 称:voidGPIO_Init(void)
* 功 能:初始化PC7为高速推挽输出
* 入口参数:无
* 出口参数:无
* 说 明:测量系统时钟频率的IO,测量到的频率是:目标时钟源/2/6
* 范 例:无
******************************************************************************************************/
void GPIO_Init(void)
{
PC_CR1_C17 =1;//推挽输出
PC_CR2_C27 =1;//高速输出
PC_DDR_DDR7 =1;//PC4输出
// PC_ODR_ODR7 =0;//输出低电平
}
/******************************************************************************************************
* 名 称:voidCLOCK_Init(void)
* 功 能:系统时钟切换为LSE,32.768KHz
* 入口参数:无
* 出口参数:无
* 说 明:
* 范 例:无
******************************************************************************************************/
void CLOCK_Init(void)
{
CLK_CKDIVR =0x00;//CLK_CKDI,VR寄存器默认0x03分频值为8
//自动切换
CLK_SWCR_SWEN =1;//允许切换时钟
CLK_SWR =0x08;//写入一个八位的值,用于选择目标时钟源
while(CLK_SWCR_SWBSY);//等待时钟切换完成
//手动切换
// CLK_SWR =0x08;//写入一个八位的值,用于选择目标时钟源
// while(!CLK_ECKR_LSERDY);//等待目标时钟源稳定
// CLK_SWCR_SWEN =1;//允许切换时钟
/*
*0x01:HSI selected as system clock source
*0x02:LSI selected as system clock source
*0x04:HSE selected as system clock source
*0x08:LSE selected as system clock source
*/
}
/******************************************************************************************************
* 名 称:int main(void)
* 功 能:通过PC4输出选择的时钟
* 入口参数:无
* 出口参数:无
* 说 明:因为STM8l discovery没有接外部高速晶振,所以没办法输出HSE,不要
* 范 例:无
******************************************************************************************************/
void main( void )
{
GPIO_Init();
CLOCK_Init();
while(1)
{
PC_ODR_ODR7 ^=1;
}
}
|