历史上的今天
返回首页

历史上的今天

今天是:2025年08月16日(星期六)

正在发生

2018年08月16日 | [STM8] - 外部时钟 + 内部时钟 的切换

2018-08-16 来源:eefocus

  1. 首先看一下 STM8S103K3 的时钟结构图,可以帮助你很好的理解。 
    这里写图片描述
    这里有几个时钟,就是图中标识的时钟,需要弄清楚一下:

    • fHSE: 外部高速晶振时钟,它是由外部晶振产生,大小由外部晶振大小决定,STM8S的外部晶振范围:1-24M,看图中的”HSE OSC 1-24M“。

    • fHSI:内部RC高速时钟,它是由内部的RC震荡电路产生的,其值16M。但是可以经过后面的分频器分频,四个分频系数可供选择(1,2,4,8)。注:精准度比外部晶振的要稍差一些。

    • fMASTER:主时钟,它是由HSE 或者 HSI提供时钟,主要功能给外围设备(peripherals,如I2C,SPI,ADC等)提供时钟,还有给CPU提供时钟源。

    • fCPU:cpu时钟,它是由fMASTER经过分频得到,其作用就是给CPU提供时钟,一个机械周期就是一个fCPU的时钟周期。

  2. 下面是时钟的源码部分,可供大家参考。 
    这里写了四段程序,分别是:

    • 使用高速内部时钟(寄存器版)

    • 使用高速内部时钟(库函数版)

    • 使用外部时钟(寄存器版)

    • 使用外部时钟(库函数版)

源码如下,看注释应该就可以了。



/*******************************************************************************

* Function Name  : InitCpuClock.

* Description    : Initial CPU clock, .

* Input          : None.

* Output         : None.

* Return         : None.

*******************************************************************************/

static void InitCpuClock(void)

{


#if 1

    // 寄存器版本 - 使用高速内部时钟 


    //Use HSI @8MHZ, div = 2; 8=16/2

    CLK->ECKR &= ~CLK_ECKR_HSEEN;                      // 失能外时钟


    CLK->CKDIVR &= (uint8_t)(~CLK_CKDIVR_HSIDIV);      // 清零内部时钟预分频

    CLK->CKDIVR |= CLK_PRESCALER_HSIDIV2;               // 设置内部时钟预分频 2; 具体可以参考数据手册 (reference manual)


    CLK->ICKR |= CLK_ICKR_HSIEN;                        // 使能内部高速时钟


    while(!(CLK->ICKR&CLK_ICKR_HSIRDY));                // 等待内部高速时钟稳定, 稳定后则内部时钟已经开跑了。 时钟 = 16/2 M

#endif


#if 0

    // 库函数版本 - 使用内部高速时钟


    //Use HSI @8MHZ, div = 2; 8=16/2

    CLK_HSECmd(DISABLE);                                // 失能外时钟


    CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV2);      // 设置内部时钟预分频 2; 具体可以参考数据手册 (reference manual)


    CLK_HSICmd(ENABLE);                                 // 使能内部高速时钟


    while(!(CLK->ICKR&CLK_ICKR_HSIRDY));                // 等待内部高速时钟稳定, 稳定后则内部时钟已经开跑了。 时钟 = 16/2 M

#endif


#if 0

// 寄存器版本  - 使用外部时钟


    CLK->CKDIVR |= CLK_PRESCALER_CPUDIV1;               // CPU 时钟分频 1,CPU时钟 = 外部时钟(即是外部晶振频率)


    CLK->ECKR |= CLK_ECKR_HSEEN;                        // 允许外部高速振荡器工作

    while(!(CLK->ECKR & CLK_ECKR_HSERDY));              // 等待外部高速振荡器准备好


    CLK->SWCR |= CLK_SWCR_SWEN;                         // 使能切换

    CLK->SWR = CLK_SOURCE_HSE;                          // 选择芯片外部的高速振荡器为主时钟

    while(!(CLK->SWCR&CLK_SWCR_SWIF));                  // 等待切换成功

    CLK->SWCR &= ~(CLK_SWCR_SWEN|CLK_SWCR_SWIF);       // 清除切换标志

#endif



#if 0

// 库函数版本  - 使用外部时钟


    CLK->CKDIVR |= CLK_PRESCALER_CPUDIV1;               // CPU 时钟分频 1,CPU时钟 = 外部时钟(即是外部晶振频率)

    CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO,          // 时钟自动切换模式,注: 参数是自动切换,不然只使用这一个函数是不能切换成功的

                          CLK_SOURCE_HSE,               // 要切换的时钟(这里是外部时钟)

                          DISABLE,                      // 是否使能切换完成中断(这里失能)

                          CLK_CURRENTCLOCKSTATE_ENABLE);// 是否还使能当前时钟(这里选择 关掉当前时钟HSI)

    CLK->SWCR &= ~(CLK_SWCR_SWEN|CLK_SWCR_SWIF);       // 清除切换标志


#endif


}


推荐阅读

史海拾趣

Hama公司的发展小趣事

在获得多轮融资后,H&D Wireless加快了全球化战略的步伐。公司计划利用融资资金进行全球业务扩张,并发布物联网云服务平台,以支持更多应用程序实现非现金支付和位置追踪服务。此外,H&D Wireless还透露了上市计划,考虑在斯德哥尔摩纳斯达克北欧交易所(Nasdaq First North)寻求上市。这一计划将为公司带来更多的资金支持和市场关注,进一步推动其全球化发展。

EUCHNER公司的发展小趣事

EUCHNER公司一直将产品创新视为其核心竞争力。公司不断投入研发资源,推出了一系列具有创新性的产品,如安全限位开关CES-CMFS系列、机械式安全开关MGB系列以及多光束安全栅ESPE系列等。这些产品在汽车制造、轨道交通、环保监测等领域得到了广泛应用,并赢得了客户的广泛赞誉。通过产品创新和市场拓展,EUCHNER公司的市场份额逐年提升。

General Magnetics Inc公司的发展小趣事
采用更高效的散热方式,如增加散热面积、优化风道设计等,以降低电子变压器的运行温度。
极海半导体(Geehy)公司的发展小趣事
可能由于输入电压波动、负载变化或内部元件老化等原因导致。
Holt Integrated Circuits公司的发展小趣事

自成立以来,Holt Integrated Circuits便专注于为航空电子行业提供高性能的集成电路解决方案。四十多年来,Holt始终站在技术前沿,为全球超过400家制造商提供模拟和混合信号IC数据总线解决方案。从F-16到A-350等先进飞行器,Holt的IC产品已成为飞行控制、导航、发动机管理、通信、安全系统及机上娱乐系统的核心部件。这种长期且稳定的合作关系,不仅奠定了Holt在航空电子领域的领导地位,也推动了整个行业的技术进步。

CT [ Central Technologies ]公司的发展小趣事

CT公司成立于电子行业的黄金时期,起初只是一个小型研发团队,专注于研发新型半导体技术。创始人凭借对技术的敏锐洞察和不懈追求,带领团队攻克了一个又一个技术难题。然而,资金短缺、市场竞争激烈以及技术迭代的快速性给初创期的CT公司带来了巨大的挑战。公司多次面临生死存亡的边缘,但创始人始终坚持技术创新的初心,不断寻求合作伙伴和投资,逐渐在市场中站稳了脚跟。

问答坊 | AI 解惑

直流电平转换——TI解决方案

在多电平系统中,直流电平转换是很常见的事情,这直接关系到一个系统设计的成败,TI在直流电平转换上的方案还是不错的,如SN74LVC4245(3.3V~5V),SN74AVC8T245(1.2V~3.6V)等,附件是TI的相关器件的详细介绍。 …

查看全部问答>

管脚编号时的问题

在布局布线那一步时 有时候会没有出现我需要的管脚,比如说我定义了 input clk; out[7:0] seg; 但在管脚编号的时候,只出现seg【0】-seg【7】,没有了 clk 的这一项, 请问各位有没有遇到类似的问题啊, 应该如何解决?? 源程序在6楼 [ ...…

查看全部问答>

单片机怎么学好啊

学哪些内容就可以掌握单片机…

查看全部问答>

在一个 I2C 总线中,如何处理两个地址一样的从器件?

现在要通过 I2C 接口读写两个一样的从器件; 但这个器件的从地址是固定的; 所以就会产生地址冲突; 请问:有什么简单的办法?…

查看全部问答>

求wince重启后应用软件及其配置文件被自动删除的解决办法

wince重启后,我在根目录下建立的应用程序配置文件目录及文件都没有了,应用程序也没了。请问该如何解决? 我是wince新手,请各位知道的给个意见,最好能举个例子。谢谢!…

查看全部问答>

求助!~~~如何在eVC环境下使用mmioOpen函数

本人最近在弄音频,在VC6.0上用mmioOpen,mmioRead等函数来实现播放wav文件的功能,但移植到wince上时,却不支持这些函数,eVC总编译不过,百思不得其解,恳请论坛上的高人指点如何在eVC里使用mmioOpen函数,谢谢!…

查看全部问答>

PLC针对回流焊设备控制的应用方案

回流焊又称\"再流焊\"或\"再流焊机\"(Reflow Oven Machine),它是通过提供一种加热环境,使焊锡膏受热融化从而让表面贴装元器件和PCB焊盘通过焊锡膏合金可靠地结合在一起的设备。根据技术的发展分为:气相回流焊、红外回流焊、远红外回流焊、红 ...…

查看全部问答>

iar 2.2 编译release版时出错,请教大虾们

Building configuration: gas - Release Error[e16]: Segment DATA16_Z (size: 0xb9 align: 0x1) is too long for segment definition. At least 0x38 more bytes needed. The pro××em occurred while processing the segment placement comma ...…

查看全部问答>

MSP430F169的封装

数据手册里写的封装是QFP,可是protel99se封装库中QFP有QFP、QFP-1、QFP-2、QFP-3、QFP-4等,请问选哪个啊?…

查看全部问答>