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

    文章

    16316

    浏览量

    177788
  • 振荡器
    +关注

    关注

    28

    文章

    3832

    浏览量

    139023
  • 时钟
    +关注

    关注

    10

    文章

    1733

    浏览量

    131443
收藏 人收藏

    评论

    相关推荐

    求助,关于STM8S105全局中断的问题求解

    环境是IAR 芯片stm8s105c6没有使用库函数,而直接使用的寄存器。 我在主函数main中先初始化系统
    发表于 05-15 07:36

    STM8S的定时器1和定时器4同时初始化和打开遇到的疑问求解

    我把STM8S的定时器1和定时器4同时初始化和打开。然后分别在定时器1中断函数和定时器4中断函数里处理程序,发现定时器4不工作,当屏蔽定时器1后,定时器4就能工作了,这是怎么回事啊?如
    发表于 05-09 08:31

    STM8S TIM4中断一开,程序异常怎么解决?

    使用内部时钟16M ,1分频,TIM4定时8us,初始化程序如下: CLK->PCKENR1 = (uint8_t)(0x1C);//使能定时器和串口 TIM4->
    发表于 04-28 06:52

    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

    STM32F303RCT6 CAN初始化时钟卡住了显示超时状态,造成初始化异常怎么解决?

    STM32F303RCT6 CAN初始化时钟卡住了显示超时状态,造成初始化异常!恳请大佬们帮忙解惑解惑,谢谢!!
    发表于 03-14 07:32

    使用CUBEMX生成配置好的UCPD外设初始化代码后,未发现UCPDHAL库函数是为什么?

    我使用CUBEMX生成配置好的UCPD外设初始化代码后发现就使能外设时钟且未发现UCPDHAL库函数,是我的CUBEMX版本低了吗。
    发表于 03-14 07:32

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

    GPIO初始化时有时钟配置、模式配置、输出配置、复用配置,那么在编写初始化代码时,到底该按什么顺序执行呢?如果顺序不当那初始化过程可能会出现短暂的电平跳变。
    的头像 发表于 02-22 11:07 1523次阅读
    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

    控制系统之间如何实现时钟同步?

    控制系统之间如何实现时钟同步? 控制系统之间的时钟同步是确保不同系统之间的时钟保持一致的过程。它
    的头像 发表于 01-16 14:37 1102次阅读

    labview运行后如何初始化

    LabVIEW是一款强大的图形编程软件,在运行之前通常需要进行一些初始化操作。本文将详细介绍LabVIEW运行前的初始化过程,并提供了一些常用的初始化方法。 创建新项目: 在LabV
    的头像 发表于 12-28 17:24 2607次阅读