历史上的今天
今天是:2024年09月13日(星期五)
2021年09月13日 | STM8S自学笔记-004 时钟:HSI、HSE与LSI
2021-09-13 来源:eefocus
STM8S的时钟源
单片机世界的多种时钟源
单片机的时钟源有很多种,根据其来源可将它们大致分为两类:内部时钟源 和 外部时钟源。而后,根据频率的不同,又可作如下划分:
内部时钟源
高速的内置时钟源 HSI
中速的内置时钟源 MSI(想到了某PC主板品牌?)
低速的内置时钟源 LSI
锁相环倍频器 PLL(和电脑CPU里的倍频系数很像)
外部时钟源
高速的外置时钟源 HSE
低速的外置时钟源 LSE
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】
/**
******************************************************************************
* @file Drv_CLK.c
* @author Elsa
* @version V1.0.0
* @date 5-August-2021
* @brief
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "Drv_CLK.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/**
* @brief Switch system clock to the Internal High Speed oscillator (HSI).
* @param HSIPrescaler : Specifies the HSI clock divider to apply.
* This parameter can be any of the @ref CLK_Prescaler_TypeDef enumeration.
* @param ClockPrescaler : Specifies the HSI or CPU clock divider to apply.
* @retval None
*/
void CLOCK_HSI(CLK_Prescaler_TypeDef HSI_PRESCALER, CLK_Prescaler_TypeDef CPU_PRESCALER)
{
/* Enables the Internal High Speed oscillator (HSI). */
CLK_HSICmd(ENABLE);
/* Configures the Switch from one clock to HSI */
while (CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE) != SUCCESS);
/* Checks whether the CLK_FLAG_HSIRDY flag is set. */
while (CLK_GetFlagStatus(CLK_FLAG_HSIRDY) == RESET);
/* Starts manually the clock switch execution. */
CLK_ClockSwitchCmd(ENABLE);
/* Configures the HSI clock dividers. */
CLK_HSIPrescalerConfig(HSI_PRESCALER);
/* Configures the HSI and CPU clock dividers. */
CLK_SYSCLKConfig(CPU_PRESCALER);
}
/**
* @brief Switch system clock to the the External High Speed oscillator (HSE).
* @param ClockPrescaler : Specifies the HSI or CPU clock divider to apply.
* @retval None
*/
void CLOCK_HSE(CLK_Prescaler_TypeDef CPU_PRESCALER)
{
/* Enable the External High Speed oscillator (HSE). */
CLK_HSECmd(ENABLE);
/* Configures the Switch from one clock to HSE */
while (CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE) != SUCCESS);
/* Checks whether the CLK_FLAG_HSERDY flag is set. */
while (CLK_GetFlagStatus(CLK_FLAG_HSERDY) == RESET);
/* Starts manually the clock switch execution. */
CLK_ClockSwitchCmd(ENABLE);
/* Enables the Clock Security System. */
CLK_ClockSecuritySystemEnable();
/* Configures the HSI and CPU clock dividers. */
CLK_SYSCLKConfig(CPU_PRESCALER);
}
新建【Drv_CLK.h】
/**
******************************************************************************
* @file Drv_CLK.h
* @author Elsa
* @version V1.0.0
* @date 5-August-2021
* @brief This file contains the headers of the Drv_CLK.c
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __DRV_CLK_H
#define __DRV_CLK_H
/* Includes ------------------------------------------------------------------*/
#include "main.h"//This is my version of include.h
/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
void CLOCK_HSI(CLK_Prescaler_TypeDef HSI_PRESCALER, CLK_Prescaler_TypeDef CPU_PRESCALER);
void CLOCK_HSE(CLK_Prescaler_TypeDef CPU_PRESCALER);
#endif
如果用HSE作为时钟源,记得修改库函数【stm8s.h】中HSE_VALUE的值。
下列代码大约从该头文件的第99行开始:
/**
* @brief In the following line adjust the value of External High Speed oscillator (HSE)
used in your application
Tip: To avoid modifying this file each time you need to use different HSE, you
can define the HSE value in your toolchain compiler preprocessor.
*/
#if !defined HSE_Value
#if defined (STM8S208) || defined (STM8S207) || defined (STM8S007) || defined (STM8AF52Ax) ||
defined (STM8AF62Ax) || defined (STM8AF622x)
#define HSE_VALUE ((uint32_t)24000000) /* Value of the External oscillator in Hz*/
#else
#define HSE_VALUE ((uint32_t)12000000) /* Value of the External oscillator in Hz*/ //See here
//#define HSE_VALUE ((uint32_t)16000000) /* Value of the External oscillator in Hz*/ //See here
#endif /* STM8S208 || STM8S207 || STM8S007 || STM8AF62Ax || STM8AF52Ax || STM8AF622x */
#endif /* HSE_Value */
史海拾趣
|
本人是新手,放大电路很难学,而且很多书上讲得都太深奥难懂,请大大们多多指教。 放大倍数:400左右 波形: [ 本帖最后由 电子几何 于 2010-2-27 09:25 编辑 ]… 查看全部问答> |
|
单片机第七课:单片机内部结构分析(五) 通过前面的学习,我们已知单片机的内部有ROM、有RAM、有并行I/O口,那么,除了这些东西之外,单片机内部究竟还有些什么,这些个零碎的东西怎么连在一起的,让我们来对单片机内部作一个完整的分析吧! 看 ...… 查看全部问答> |
|
我写了一个简单的单片机的四人抢答器,但是十秒倒计时显示0之后他显示1,请帮忙看看是怎么回事,谢谢! 程序如下: #include #define uchar unsigned char #define uint unsigned int uchar num; &nb ...… 查看全部问答> |
|
我编写了一个时钟程序,功能比较简单,显示总是为48,不知为何。。。 细细调试,查看到在程序中的函数Conv处发生很奇怪的现象,不知为和原因,想请人解释一下…… 大家看到这幅图,刚进入函数,numhigh为30H,numlow为08H(按理说,他们是局部变 ...… 查看全部问答> |
|
我的这个系统包括:LCD12864显示,4*4键盘,双串口数据通讯 其中LCD12864要随时更新显示串口0传来(软件滤波后)的数据; 键盘要随时响应用户的按键操作; 串口1随时响应上位机; 我现在的做法是: 键盘 :采用轮寻; LCD12864:数据采 ...… 查看全部问答> |
|
本人以太网方面菜鸟,最近看了KEIL下MCB1700 easyWEB例程 不懂函数void CopyFromFrame_EMAC(void *Dest, unsigned short Size)是怎么实现的,请大神们结合以太网包格式讲解以下代码的具体实现步骤,越详细越好 先谢谢了!! void CopyFromFrame ...… 查看全部问答> |
|
根据ALTERA官方FAE(现场应用工程师)的强烈建议,请注意不要随意带电插拔JTAG下载接口,否则会损坏FPGA芯片的JTAG口信号管脚。 现象: 在排除了下载线的问题后,还是不能访问FPGA的JTAG口,那么很有可能你的FPGA芯片的JTAG口已经损坏。此时请用 ...… 查看全部问答> |
|
【玩转C2000 Launchpad】通用输入/输出模块(I/O) 1.多功能复用 GPIO 介绍 F2807提供了多个通用数字I/O引脚,大部分引脚的功能是复用的,通过GPIO多路开关寄存器(GPIO MUX)为这些功能复用的引脚选择工作方式,通过这些寄存器可以把这些引脚设置成数字I/O或者外设I/O信号工作模式。如果是数字I/O ...… 查看全部问答> |




