历史上的今天
返回首页

历史上的今天

今天是: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 */

推荐阅读

史海拾趣

微芯(CMOSIC)公司的发展小趣事

随着全球化的加速发展,微芯生物也积极开展国际合作与交流。他们与国际知名医药企业、科研机构以及高校建立了紧密的合作关系,共同开展新药研发和技术创新。通过国际合作与交流,微芯生物不仅吸收了国际先进的研发理念和技术经验,还为公司的发展带来了更广阔的市场空间和合作机会。

DEVCON公司的发展小趣事

随着DEVCON品牌知名度的提升和产品线的不断丰富,公司开始将目光投向更广阔的市场。通过与国际知名企业的合作和代理,DEVCON的产品逐渐进入全球电子制造和维修领域。同时,公司还积极开拓新兴市场,如汽车电子、安防监控等领域,进一步扩大了市场份额。这种市场扩张的策略不仅带来了丰厚的回报,也为DEVCON公司的长期发展奠定了坚实基础。

Astema公司的发展小趣事

随着技术的不断成熟,Astema开始积极拓展市场。公司制定了一系列市场策略,包括与大型电子设备制造商建立合作关系、参加国际电子展等,以扩大品牌影响力。通过这些努力,Astema逐渐打开了国际市场的大门,其产品远销海外,市场份额稳步提升。

汇科公司的发展小趣事

与山东汇科电气技术有限公司不同,苏州汇科技术股份有限公司成立于2000年,是一家专业从事开发、设计、制造各式工业窑炉的技术型企业。公司位于江苏省常熟市辛庄工业开发区,凭借对技术的执着追求和对品质的严格把控,逐渐在行业中崭露头角。多年来,苏州汇科技术股份有限公司通过不断的技术创新和产品升级,赢得了客户的广泛认可和市场的信赖。

Hong Kong X'Tals Ltd公司的发展小趣事
确保电源电压在LM122的允许范围内(4.5~40V),以避免损坏芯片。
DLP Design公司的发展小趣事

DLP绿色科技公司,积极响应国家环保政策,致力于研发和生产绿色环保的DLP技术产品。公司采用先进的生产工艺和材料,降低产品能耗和排放。同时,DLP绿色科技还积极推广节能环保的理念和技术,倡导消费者使用环保产品。通过不懈的努力和实践,DLP绿色科技在电子行业树立了绿色环保的典范形象,为行业的可持续发展做出了积极贡献。

请注意,以上故事均为虚构,旨在展示DLP Design公司在电子行业中的可能发展路径和成就。实际情况可能因公司背景、市场环境等因素而有所不同。

问答坊 | AI 解惑

什么时候有复试结果

本帖最后由 paulhyde 于 2014-9-15 09:20 编辑 好奇怪,我看了黑龙江,陕西 B题目都推荐12,13个上国家,我是吉林的 ,为什么吉林省才4个队进国家呢  …

查看全部问答>

新手的简单放大电路,请大家多多指教

本人是新手,放大电路很难学,而且很多书上讲得都太深奥难懂,请大大们多多指教。 放大倍数:400左右 波形: [ 本帖最后由 电子几何 于 2010-2-27 09:25 编辑 ]…

查看全部问答>

下面我们逐一介绍各位的用途

单片机第七课:单片机内部结构分析(五) 通过前面的学习,我们已知单片机的内部有ROM、有RAM、有并行I/O口,那么,除了这些东西之外,单片机内部究竟还有些什么,这些个零碎的东西怎么连在一起的,让我们来对单片机内部作一个完整的分析吧! 看 ...…

查看全部问答>

请高手帮忙看看这个程序,有一个小BUG

我写了一个简单的单片机的四人抢答器,但是十秒倒计时显示0之后他显示1,请帮忙看看是怎么回事,谢谢! 程序如下: #include #define uchar unsigned char #define uint unsigned int uchar num;            &nb ...…

查看全部问答>

SYSINTR_MAXIMUM等于多少

SYSINTR_MAXIMUM等于多少?…

查看全部问答>

有用proteus的吗?有的话麻烦帮我一下……

我编写了一个时钟程序,功能比较简单,显示总是为48,不知为何。。。 细细调试,查看到在程序中的函数Conv处发生很奇怪的现象,不知为和原因,想请人解释一下…… 大家看到这幅图,刚进入函数,numhigh为30H,numlow为08H(按理说,他们是局部变 ...…

查看全部问答>

我的这个系统如何实现低功耗?

我的这个系统包括:LCD12864显示,4*4键盘,双串口数据通讯 其中LCD12864要随时更新显示串口0传来(软件滤波后)的数据; 键盘要随时响应用户的按键操作; 串口1随时响应上位机; 我现在的做法是: 键盘 :采用轮寻; LCD12864:数据采 ...…

查看全部问答>

MCB1700 easyWEB下函数实现,求帮助!!!

本人以太网方面菜鸟,最近看了KEIL下MCB1700 easyWEB例程 不懂函数void CopyFromFrame_EMAC(void *Dest, unsigned short Size)是怎么实现的,请大神们结合以太网包格式讲解以下代码的具体实现步骤,越详细越好 先谢谢了!! void CopyFromFrame ...…

查看全部问答>

FPGA的JTAG烧写注意事项

根据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 ...…

查看全部问答>