本文介绍STM8L的CLK相关知识。内容分为以下几部分:
1、CLK简介STM8L051F3的时钟控制系统设计时非常稳定的,同时也很容易使用,它可以使得MUC在低消耗下获仍然保持优性能。用户可以通过管理分配到CPU&外设的时钟来达到降低功耗。STM8L051F3有一个安全无干扰的时钟切换机制允许用户切换系统时钟源,同时可以通过预分频器来控制系统时钟频率。时钟结构图如下:
注:STM8L051F3的Peripheral Clock enable是13 bit,没有LCD外设
STM8L051F3的系统时钟源有以下4种:
- 16MHz内部高速(出厂已校准)RC时钟HSI
- 1~16MHz外部高速振荡器时钟HSE
- 768kHz外部低速振荡器时钟LSE
- 38kHz内部低速低功耗时钟LSI
每个时钟源皆可独立打开或关闭来节省功耗,每个时钟源都可经过可编程预分频之后再用于驱动系统时钟,系统复位后默认使用的时钟是HSI/8。所有的外设时钟都是从系统时钟(SYSCLK)中派生出来的,除了以下几个:
- BEEP(蜂鸣器)时钟,使用LSE/LSI
- RTC时钟,使用LSE/LSI/HSI/HSE
- 独立看门狗(IWDG)时钟
STM8LL051F3有一个外设时钟门(Peripheral clock gating),在系统复位后,所有的外设时钟是关闭的(除了PCKEN27),用户可以配置CLK_PCKENRx外设时钟门寄存器相应的PCKEN位来使能相应的外设时钟。
STM8LL051F内部有一个时钟安全系统(CSS),该系统的作用是在使用外部时钟作为系统时钟源时,对其检测试试检测,一旦外部时钟源出现异常就会做出相应的处理。STM8LL051F有一个可配置时钟输出功能(CCO),该功能是把系统时钟在CCO引脚上输出。
2、系统时钟频率切换2.1 系统时钟频率配置本小节内容介绍如何改变改变系统时钟的频率(不改变系统时钟源)。系统上电时默认系统时钟源为HSI,频率为HSI/8 = 2MHz。例程通过按键KEY(外部中断方式)来改变系统时钟频率,LED1的闪烁速度会产生变化。内容比较简单,只需要一条语句即可改变系统时钟的频率:
CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1); //系统时钟1分频(16M) 使用的例程:STM8L051F3_03_CLK
2.2 例程介绍主函数代码如下(初始化LED,EXTI,开启外部中断,进入循环):
void main(void)
{
LED_Init(); //初始化LED1 EXTI_Init(); //初始化KEY enableInterrupts(); //开总中断 while(1) { if(Flag != 0) //判断标志位 CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1); //系统时钟1分频(16M) delay_ms(500); GPIO_ToggleBits(LED1_GPIO_PORT, LED1_GPIO_PINS);//切换LED1状态 } }
在主函数的循环中,根据判断Flag标志位是否被置位来决定是否改变系统时钟的频率,该标志位的置位程序在外部中断程序中,(程序中的Flag标志位在main.c文件中定义,中断函数的stm8l15x_it.c文件声明使用)如下:
INTERRUPT_HANDLER(EXTI4_IRQHandler,12)
{
/* In order to detect unexpected events during development, it is recommended to set a breakpoint on the following instruction. */ //延迟消抖 delay_ms(10); //松手检测 while(GPIO_ReadInputDataBit(KEY_GPIO_PORT, KEY_GPIO_PINS)== 0); //标志位置1 Flag = 1; //清除中断标志位 EXTI_ClearITPendingBit(EXTI_IT_Pin4); }
使用ST-LINK把程序下载到开发板中,LED1闪烁,按下KEY后LED1闪烁变快。注:由于核心板没有接HSE,所以这里不介绍系统时钟源的切换,在官方手册中有详细的系统时钟源切换的介绍。
|