STM8S的时钟源
单片机世界的多种时钟源
单片机的时钟源有很多种,根据其来源可将它们大致分为两类:内部时钟源 和 外部时钟源。而后,根据频率的不同,又可作如下划分:
内部时钟源
- 高速的内置时钟源 HSI
- 中速的内置时钟源 MSI(想到了某PC主板品牌?)
- 低速的内置时钟源 LSI
- 锁相环倍频器 PLL(和电脑CPU里的倍频系数很像)
外部时钟源
STM8S的时钟源
- HSE:1~16MHz高速的外部晶体振荡器
- HSE:最高16MHz的外部时钟信号
- HSI:16MHz内部高速RC振荡器
- LSI:128KHz的低速内部RC振荡器
上电复位后的STM8S
STM8S上电后,MCU将自动运行在HSI / 8 = 2(MHz)的时钟下。而后,你就可以随心所欲地切换时钟源,以及随心所欲地设置运行速度。
那么问题也就来了:
- 时钟源切换
- 频率设置
时钟设置代码
我自己的项目里,从没用过STM8S的LSI,所以,在代码内容中,没有LSI的切换,但我觉得可以仿照HSI的切换来编写。
新建【Drv_CLK.c】
#include "Drv_CLK.h"
void CLOCK_HSI(CLK_Prescaler_TypeDef HSI_PRESCALER, CLK_Prescaler_TypeDef CPU_PRESCALER)
{
CLK_HSICmd(ENABLE);
while (CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE) != SUCCESS);
while (CLK_GetFlagStatus(CLK_FLAG_HSIRDY) == RESET);
CLK_ClockSwitchCmd(ENABLE);
CLK_HSIPrescalerConfig(HSI_PRESCALER);
CLK_SYSCLKConfig(CPU_PRESCALER);
}
void CLOCK_HSE(CLK_Prescaler_TypeDef CPU_PRESCALER)
{
CLK_HSECmd(ENABLE);
while (CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE) != SUCCESS);
while (CLK_GetFlagStatus(CLK_FLAG_HSERDY) == RESET);
CLK_ClockSwitchCmd(ENABLE);
CLK_ClockSecuritySystemEnable();
CLK_SYSCLKConfig(CPU_PRESCALER);
}
新建【Drv_CLK.h】
#ifndef __DRV_CLK_H
#define __DRV_CLK_H
#include "main.h"
void CLOCK_HSI(CLK_Prescaler_TypeDef HSI_PRESCALER, CLK_Prescaler_TypeDef CPU_PRESCALER);
void CLOCK_HSE(CLK_Prescaler_TypeDef CPU_PRESCALER);
#endif
修改库函数【stm8s.h】中HSE_VALUE 的值 下列代码大约从该头文件的第99行开始
#if !defined HSE_Value
#if defined (STM8S208) || defined (STM8S207) || defined (STM8S007) || defined (STM8AF52Ax) || \
defined (STM8AF62Ax) || defined (STM8AF622x)
#define HSE_VALUE ((uint32_t)24000000)
#else
#define HSE_VALUE ((uint32_t)12000000)
#endif
#endif
|