时钟源

时钟源概述

时钟源的定义

  • 时钟源用于为单片机提供工作时钟信号,类似于一个节拍器
  • STM8功能重点在于计时器,而时钟源是计时器得以计时的基础

时钟源的类别

  • 单片机有三种时钟源,有在单片机之外的片外时钟源HSE,精度高,但是启动慢;也有集成在单片机之内的时钟源HSI和LSI,精度低但是启动快;具体如下:

  • 16Mhz外部时钟源HSE

    使用石英晶体振荡器,振荡频率精度高,温度漂移小,但在起振时信号不稳定,需要设置晶振稳定时间选项OPT5中的选项参数让单片机略过这段时间

    需要注意的是,对于一般的STM8系列来说,HSE最高频率是16MHz,但对于207/208系列而言,其最高频率是24MHz,此处仍按比较常见的16MHz作介绍

    由两部分组成,1~16MHz高速外部晶体振荡器最大16MHz高速外部时钟信号,合并为一个外部时钟源HSE

    • 使用最大16MHz高速外部时钟信号作为系统时钟源时,需要对时钟选项OPT4中的第三位EXT_CLK进行配置

      • 配置为0则外部晶体振荡器连接到OSCIN/OSCOUT引脚上

      • 配置为1则外部时钟连接到OSCIN引脚上,OSCOUT引脚作为GPIO引脚使用

  • 16MHz高速内部RC振荡器HSI

    HSI启动速度快,精度不高,是默认的主时钟

    可以通过时钟分频寄存器CLK_CKDIVR配置分频系数,得到16/8/4/2MHz等时钟频率作为系统主时钟频率

    • 上电后默认工作在该时钟8分频状态,即主时钟频率默认为2MHz
  • 128kHz低速内部RC振荡器LSI

    低功耗、低成本的时钟源

    主要用于在停机Halt模式下作为维持独立看门狗IWDG和自动唤醒单元AWU运行的低功耗时钟源

    因此通常不使用作主时钟,避免其出现故障时让看门狗等重要部件一同崩溃

信号的类别

  • 时钟产生的信号经过处理后,将用作不同的用途

  • 主时钟频率fMASTER

    单片机的基准时钟,是其他时钟信号的来源

    决定了计时器、ADC、SPI、I2C等的工作频率

  • CPU频率fCPU

    直接供给CPU的时钟信号,可以是主时钟的一个分配值

    直接影响CPU执行指令的速度

  • 外围时钟fPERIPH

    供给除了CPU之外外围设备的时钟


时钟源配置流程

时钟源配置简述

  1. 选择主时钟

    配置主时钟状态寄存器CLK_CMSR和主时钟切换寄存器CLK_SWR来实现

  2. 主时钟分频

    配置主时钟分频寄存器CLK_CKDIVR中的HSIDIV[1:0] 可对HSI时钟源进行分频

    经过上两步操作,就确定主时钟fMASTER的来源与频率

  3. 进一步分频

    得到主时钟后,还可以配置主时钟分频寄存器CLK_CKDIVR中的CPUDIV[2:0] 这三位对主时钟进行分频因子设定

    显然HSE时钟不受CLK_CKDIVR的HSIDIV控制,仅能用CPUDIV这一个分频系数,而HSI则可以分频两次

  4. 经过进一步分频得到是fCPU,这个信号将送到CPU(决定处理指令的速度)与窗口看门狗中应用

时钟源相关寄存器

  • 主时钟切换寄存器CLK_SWR

    用以配置欲选择的时钟源,可以写入三种值,对应三种时钟源

    • 0xE1 HSI为主时钟(默认值)
    • 0xD2 LSI为主时钟(需要LSI_EN选项字节配置为1)
    • 0xB4 HSE为主时钟
  • 时钟分频寄存器CLK_CKDIVR

    HSIDIV位控制HSI时钟的分频;CPUDIV位控制CPU时钟的预分频

image

具体配置示例:例如,希望将单片机工作时钟配置为4MHz的内部fHSI时钟

CLK_CKDIVR = 0x10;//000 10 000
//配置HSIDIV,将原16M的HSI分4,得到4MHz的HSI频率
//CPUDIV置0,此时f_CPU=f_MASTER/1
  • HSI时钟修正寄存器CLK_HSITRIMR

    在STM8S系列中,此寄存器0-3位为HSITRIM位,用以配置修正步进,其它位置零(在其它STM8系列中其它位也用于配置修正),配置如下

image

代码实现

  • 设置时钟源并更改其频率
    void Clock_HSI_Init()
    {
      CLK_SWR = 0xE1;       //配置为HSI 16MHZ
      CLK_CKDIVR = 0x18;    //设置HSIDIV为11,8分频,得到2MHz
    }  //这是上电后的默认配置,在不对时钟进行配置的情况下,单片机的CPU就工作在2MHz下
    void Clock_HSE_Init()
    {
      CLK_SWR = 0xB4;       //配置为HSE 16MHZ
      CLK_CKDIVR = 0x03;	//设置CPUDIV为011:8分频,得到2MHz
      Delay();//HSE启动需要一段时间稳定,所以不能直接使用,需要延时
    }
    
    main()
    {
    	Clock_HSE_Init();
    	CLK_CKDIVR = 0x00;//不分频
    	//执行操作……
    	CLK_CKDIVR = 0x10;//4分频
    	//执行操作……
    //通过更改分频系数,就能更改当前的工作频率
    //如果需要改变使用的时钟,则需要额外的配置
    }
    

时钟源的切换

  • 自动切换流程

    1. 配置切换控制寄存器SWEN位(位1)为1,启动切换时钟源
    2. 如有需要,可配置SWIEN位(位2)为1,使能中断
    3. 将欲设定的时钟源值写入主时钟切换寄存器CLK_SWR

    接下来的步骤由硬件自动进行:

    1. 切换控制CLK_SWCR寄存器的SWBSY位(位0)硬件自动置1,表示切换状态忙
    2. 启动目标振荡器,启动后等待一段时间使其稳定
    3. SWBSY自动清0,主时钟切换寄存器CLK_SWR中的值转入主时钟状态寄存器CLK_CMSR
    4. 按之前的配置产生中断,SWIF位硬件自动置1,表示有时钟切换事件发生
    5. 程序接收中断,并由软件对SWIF位清0
    6. 单片机工作在新时钟频率下
  • 手动切换流程

    1. 直到“程序接收中断,并由软件对SWIF位清0“这一步,除去不必配置切换控制寄存器SWEN位外,都同自动切换
    2. 中断在于:用户自行决定执行切换的时间,配置切换控制寄存器CLK_SWCRSWEN位为1,启动切换时钟源
    3. SWBSY自动清0,主时钟切换寄存器CLK_SWR中的值转入主时钟状态寄存器CLK_CMSR,新旧时钟切换完成
  • 两种切换方式都不会关闭原时钟源

    如果需要关闭时钟源以节省系统功耗,可以配置以下位为0,关闭对应时钟:

    内部时钟寄存器CLK_ICKRLSIEN位(位3),HSIEN位(位0);

    外部时钟寄存器CLK_ECKRHSEEN位(位0)

切换时钟源相关寄存器

  • 主时钟状态寄存器CLK_CMSR

    与主时钟切换寄存器CLK_SWR相对应,用以反应当前主时钟的配置,由硬件进行配置,若寄存器中为无效值则进行复位

    • 0xE1 HSI为主时钟(默认值)
    • 0xD2 LSI为主时钟(需要LSI_EN选项字节配置为1)
    • 0xB4 HSE为主时钟
  • 切换控制寄存器CLK_SWCR

image

  • 另外,主时钟切换寄存器CLK_SWR和主时钟状态寄存器CLK_CMSR在切换过程中也会用到,不再赘述

代码实现

  • 从HSI自动切换到HSE
    if(CLK_CMSR != OxB4)//确认现在主时钟不是HSE
    {
    	CLK_SWCR |= 0x02; //SWEN位置1,使能切换
    	CLK_SWR = 0xB4; //写入要切换的时钟
    	while((CLK_SWCR & 0x08)==0);//等待切换中断标志位SWIF变为1
    	//0x08=0000 1000,对应SWIF位,当为1时表示有时钟切换事件发生
    	CLK_SWCR = 0;//清除相关标志位
    }
    
  • 从HSI手动切换到HSE
    CLK_SWCR |= 0x04; //SWIEN位置1,使能切换中断
    CLK_SWR = 0xB4; //配置主时钟源为HSE,此时还不会进行切换
    asm("rim");//开中断
    
    #pragma vector =4//只有进入此中断程序,才会切换为HSE
    __interrupt void CLK_IRQHandler(void)
    {
    	CLK_SWCR &= 0xF7;//清除SWIF中断标志位
    	CLK_SWCR |= Ox02;//对SWEN置1,启动切换过程
    }
    

时钟的功能拓展

LSI时钟配置

  • LSI时钟源切换比HSI与HSE间的切换特殊,因为它承担了特殊的任务:独立看门狗IWDG运行所需的时钟源就是LSI时钟源,若LSI同时作为看门狗和CPU的时钟源,一旦其出现问题,那么整个系统将一齐崩溃(看门狗无法检测到程序异常)

  • 具体启用方法是配置选项字节,不同软件方法不同:

    • 使用STVP配置LSI_ENLSI clock available as CPU clock soure
    • 在IAR的Option Bytes中配置LSI_ENenable

    之后按切换时钟的流程即可

关闭外设时钟源

  • 单片机复位后默认启动全部外设时钟,会增加很多功耗,因此需要关闭用不到的外设时钟

  • 关闭或重启时钟流程

    关闭或重新开启相应的时钟需要两个步骤:

    1. 通过外设资源控制位禁用想关闭的外设资源
    2. 配置外设时钟门寄存器1或2 CLK_PCKENR1/2的相应位关闭外设时钟
  • 外设时钟门寄存器CLK_PCKENR1/2

image
image

时钟安全系统CSS

  • 如果HSE时钟源故障,程序无法正常执行,为此设计CSS功能,让HSE时钟坏掉时HSI内部时钟可以马上启动替补,保障系统功能的正常运行

  • 启动条件
    • 外部时钟寄存器CLK_ECKR中的HSEEN位必须为1,即HSE启动
    • HSE时钟设定为1~16MHz高速外部晶体振荡器,需要配置选项字节OPT4中的EXT_CLK位:在STVP中配置EXTCLK选项为external crystal connect to OSCIN/OSCOUT,在IAR中配置为external oscillator
  • 开启CSS系统

    配置时钟安全系统寄存器CLK_CSSRCSSEN位(位0)为1即可

    具体代码如下:

    CLK_CSSR_CSSEN = 1;
    

    注意:时钟切换并不能立即完成,因为时钟刚启动需要时间稳定,因此关闭HSE后需要进行延时

时钟输出功能CCO

  • 可输出的信号

    用单片机输出一路时钟信号供给外部电路,CCO可以选择6种时钟信号通过其指定的引脚进行时钟信号输出

    这6种信号包括HSE/HSI/HSIDIV(HSI第一次分频)/LSI/MASTER/CPU

  • 可配置时钟输出寄存器CLK_CCOR

    配置可配置时钟输出寄存器CLK_CCOR即可对CCO进行设定

image

  • 如果需要更改CCO输出的针脚,需要更改选项字节OPT2中的AFR2

posted on   无术师  阅读(54)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?

统计

点击右上角即可分享
微信分享提示