0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM8S时钟系统的时钟初始化函数实现

牵手一起梦 来源:eefocus 作者:eefocus 2020-01-24 17:32 次阅读

STM8S具有一个强大的时钟系统,内部提供一个高速16M的RC振荡器,和一个低速128K的RC振荡器。

时钟控制器功能强大而且灵活易用。其目的在于使用户在获得最好性能的同时,亦能保证消耗的功率最低。用户可独立地管理各个时钟源,并将它们分配到CPU或各个外设。主时钟和CPU时钟均带有预分频器。具有安全可靠的无故障时钟切换机制,可在程序运行中将主时钟从一个时钟源切换到另一个时钟源。

一般来说,时钟树是配置时钟、控制时钟的依据,所以需要掌握,以下是STM8S时钟树图:

STM8S时钟系统的时钟初始化函数实现

从图中看出,一共有3个时钟源,分别是HSE(高速外部时钟)、HSI(高速内部时钟)、LSI(低速内部时钟)。

HSE(高速外部时钟)可通过外部晶振提供,HSI(高速内部时钟)为16M的RC振荡器,LSI(低速内部时钟)为128K的RC振荡器。

高速时钟(HSE和HSI)可以通过分频器进行降频。降频过后的时钟和原本的时钟都可以通过Master Clock Switch进行选择,

以下是初始化系统时钟的函数(默认使用16M内部RC):

void Set_HSISpeed(void)

{

//启用内部高速晶振且无分频16MHz

CLK_ICKR|=0x01; //开启内部HSI

while(!(CLK_ICKR&0x02));//HSI准备就绪

CLK_SWR=0xe1; //HSI为主时钟源

CLK_CKDIVR=0x00; //HSI不分频

}

如果需要切换时钟,需要先等待时钟稳定:

void Switch_LSISpeed(void)

{

CLK_SWCR|=0x02; //开启切换

CLK_ICKR|=0x08; //开启LSI

while(!(CLK_ICKR&0x10));//HSI准备就绪

CLK_SWR=0xd2; //LSR为主时钟源

while((CLK_SWCR & 0x01)==0x01);//等待切换完成

CLK_CKDIVR=0x00; //LSI不分频

CLK_SWCR&=(~0x02); //关闭切换

}

void Switch_HSISpeed(void)

{

CLK_SWCR|=0x02; //开启切换

CLK_ICKR|=0x01; //开启内部HSI

while(!(CLK_ICKR&0x02));//HSI准备就绪

CLK_SWR=0xe1; //HSI为主时钟源

while((CLK_SWCR & 0x01)==0x01);//等待切换完成

CLK_CKDIVR=0x00; //HSI不分频

CLK_SWCR&=(~0x02); //关闭切换

}

如果想直接降频,只需要设置始终分频:

void Set_CPU_Full_Speed(void)

{

CLK_CKDIVR=0x00; //HSI不分频

}

void Set_CPU_Low_Speed(void)

{

CLK_CKDIVR=0x07; //HSI 128分频

}

以上就是初始化时钟的代码,一般用于mian函数的第一句话,方便以后计算其他外设的时钟频率。

责任编辑:gt

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制器
    +关注

    关注

    112

    文章

    15223

    浏览量

    171175
  • 振荡器
    +关注

    关注

    28

    文章

    3518

    浏览量

    137638
  • 时钟
    +关注

    关注

    10

    文章

    1479

    浏览量

    130306
收藏 人收藏

    评论

    相关推荐

    stm32定时器在初始化参数之前是否必须开启对应时钟

    参数的时候,对应定时器时钟并没有开启,导致PWM不能正常输出,当在这些函数之前,开启对应时钟,就正常了。看是调试对比,TIM的寄存器没有差别,不知道为什么,所以问一下在初始化参数之前是
    发表于 04-18 06:42

    请问STM8S的AWU功能的时钟源能使用外接的32.768KHZ晶振吗?

    请问大神,STM8S的AWU功能的时钟源能使用外接的32.768KHZ晶振吗?
    发表于 04-16 08:07

    关于STM32F103VC零下10℃时钟初始化问题求解

    LSE和HSE,那么设备在零下10℃的时候重新上电,APP初始化LSE过不去; 2.如果BOOT初始化时钟的时候,使用LSE和HSE,在APP里面重新配置为LSE和HSE,那么设备在零下10℃的时候
    发表于 04-15 06:12

    启动外部16MHz时钟后STM8S003的ADC无法初始化是怎么回事?

    如题,STM8S003F3P6做的驱动板,启动外部16MHz时钟,UART, TIMER, GPIO, 中断等一切工作正常,整个系统运行也很OK。但当加入ADC初始化时,无法写入ADC
    发表于 04-08 08:24

    STM32F4卡死在时钟初始化配置上是哪里出了问题?

    时钟初始化if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE){return HAL_TIMEOUT; }
    发表于 03-29 08:32

    MCU单片机GPIO初始化该按什么顺序配置?为什么初始化时有电平跳变?

    GPIO初始化时有时钟配置、模式配置、输出配置、复用配置,那么在编写初始化代码时,到底该按什么顺序执行呢?如果顺序不当那初始化过程可能会出现短暂的电平跳变。
    的头像 发表于 02-22 11:07 371次阅读
    MCU单片机GPIO<b class='flag-5'>初始化</b>该按什么顺序配置?为什么<b class='flag-5'>初始化</b>时有电平跳变?

    rtc时钟如何在启动后会不被初始化为默认值?

    请教一个关于rtc的问题。 1.我发现我的rtc时钟根据例子,在启动后会被初始化为默认值。 但是如果我想在软件复位或者看门狗复位的情况下,不让我的rtc时钟重新初始化。这样是否能够
    发表于 02-21 06:08

    使用CYB06445LQI-S3D42设备配置系统时钟,BSP在时钟初始化时失败怎么解决?

    我们正在使用 CYB06445LQI-S3D42 设备。 从默认时钟配置开始效果很好。 当我们尝试根据电路板设计配置系统时钟(我们有 ECO)时,BSP 无法
    发表于 01-19 06:12

    Linux内核时钟系统和定时器实现

    Linux内核时钟系统和定时器实现 Linux 2.6.16之前,内核只支持低精度时钟,内核定时器的工作方式: 系统启动后,会读取
    的头像 发表于 11-09 09:12 587次阅读
    Linux内核<b class='flag-5'>时钟</b><b class='flag-5'>系统</b>和定时器<b class='flag-5'>实现</b>

    求助,谁有STM8S ADC1初始化函数例程呢?

    谁有STM8S ADC1初始化函数例程呢?
    发表于 10-25 07:45

    关于ds1302的初始化问题

    用ds1302写时钟的过程中,发现每一次上电后,时间都被赋了初值,每次上电ds1302都被被初始化,通过百度知道需要判断秒的第8位是否为1,来使得ds1302只初始化一次,从而
    发表于 10-25 06:06

    STM32f105时钟初始化之后,delay函数时间不对是怎么回事?

    STM32f105时钟初始化之后,delay函数时间不对
    发表于 09-26 06:28

    求助,M0516关于时钟初始化的问题

    有几个问题如下1.因为SPI1口需要1.6M输出频率,我将晶振改为16M,系统会产生如何的变化呢? 2.为提高运行速度将CPU速度提高到48M需要进行如何的改动呢? 3.进行时钟频率重新设置后,初始化向导提供了相关外设的重置代码
    发表于 08-24 08:16

    求分享M0518系统时钟初始化程序

    那个有M0518系统时钟寄存器版本的初始化程序,库函数的太大了, 系统时钟
    发表于 08-22 07:00

    安装HSE后APP系统时钟初始化失败的原因?

    安装HSE后APP系统时钟初始化失败。
    发表于 05-09 07:58