时钟源
时钟源概述
时钟源的定义
- 时钟源用于为单片机提供工作时钟信号,类似于一个节拍器
- 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之外外围设备的时钟
时钟源配置流程
时钟源配置简述
-
选择主时钟
配置主时钟状态寄存器CLK_CMSR和主时钟切换寄存器CLK_SWR来实现
-
主时钟分频
配置主时钟分频寄存器CLK_CKDIVR中的HSIDIV[1:0] 可对HSI时钟源进行分频
经过上两步操作,就确定主时钟fMASTER的来源与频率
-
进一步分频
得到主时钟后,还可以配置主时钟分频寄存器CLK_CKDIVR中的CPUDIV[2:0] 这三位对主时钟进行分频因子设定
显然HSE时钟不受CLK_CKDIVR的HSIDIV控制,仅能用CPUDIV这一个分频系数,而HSI则可以分频两次
-
经过进一步分频得到是fCPU,这个信号将送到CPU(决定处理指令的速度)与窗口看门狗中应用
时钟源相关寄存器
-
主时钟切换寄存器CLK_SWR
用以配置欲选择的时钟源,可以写入三种值,对应三种时钟源
-
0xE1
HSI为主时钟(默认值) -
0xD2
LSI为主时钟(需要LSI_EN选项字节配置为1) -
0xB4
HSE为主时钟
-
-
时钟分频寄存器CLK_CKDIVR
HSIDIV位控制HSI时钟的分频;CPUDIV位控制CPU时钟的预分频
具体配置示例:例如,希望将单片机工作时钟配置为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系列中其它位也用于配置修正),配置如下
代码实现
-
设置时钟源并更改其频率
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分频 //执行操作…… //通过更改分频系数,就能更改当前的工作频率 //如果需要改变使用的时钟,则需要额外的配置 }
时钟源的切换
-
自动切换流程
- 配置切换控制寄存器SWEN位(位1)为1,启动切换时钟源
- 如有需要,可配置SWIEN位(位2)为1,使能中断
- 将欲设定的时钟源值写入主时钟切换寄存器CLK_SWR中
接下来的步骤由硬件自动进行:
- 切换控制CLK_SWCR寄存器的SWBSY位(位0)硬件自动置1,表示切换状态忙
- 启动目标振荡器,启动后等待一段时间使其稳定
- SWBSY自动清0,主时钟切换寄存器CLK_SWR中的值转入主时钟状态寄存器CLK_CMSR
- 按之前的配置产生中断,SWIF位硬件自动置1,表示有时钟切换事件发生
- 程序接收中断,并由软件对SWIF位清0
- 单片机工作在新时钟频率下
-
手动切换流程
- 直到“程序接收中断,并由软件对SWIF位清0“这一步,除去不必配置切换控制寄存器SWEN位外,都同自动切换
- 中断在于:用户自行决定执行切换的时间,配置切换控制寄存器CLK_SWCR的SWEN位为1,启动切换时钟源
- SWBSY自动清0,主时钟切换寄存器CLK_SWR中的值转入主时钟状态寄存器CLK_CMSR,新旧时钟切换完成
-
两种切换方式都不会关闭原时钟源
如果需要关闭时钟源以节省系统功耗,可以配置以下位为0,关闭对应时钟:
内部时钟寄存器CLK_ICKR的LSIEN位(位3),HSIEN位(位0);
外部时钟寄存器CLK_ECKR的HSEEN位(位0)
切换时钟源相关寄存器
-
主时钟状态寄存器CLK_CMSR
与主时钟切换寄存器CLK_SWR相对应,用以反应当前主时钟的配置,由硬件进行配置,若寄存器中为无效值则进行复位
-
0xE1
HSI为主时钟(默认值) -
0xD2
LSI为主时钟(需要LSI_EN选项字节配置为1) -
0xB4
HSE为主时钟
-
-
切换控制寄存器CLK_SWCR
- 另外,主时钟切换寄存器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_EN为LSI clock available as CPU clock soure
- 在IAR的Option Bytes中配置LSI_EN为enable
之后按切换时钟的流程即可
关闭外设时钟源
-
单片机复位后默认启动全部外设时钟,会增加很多功耗,因此需要关闭用不到的外设时钟
-
关闭或重启时钟流程
关闭或重新开启相应的时钟需要两个步骤:
- 通过外设资源控制位禁用想关闭的外设资源
- 配置外设时钟门寄存器1或2 CLK_PCKENR1/2的相应位关闭外设时钟
-
外设时钟门寄存器CLK_PCKENR1/2
时钟安全系统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_CSSR的CSSEN位(位0)为1即可
具体代码如下:
CLK_CSSR_CSSEN = 1;
注意:时钟切换并不能立即完成,因为时钟刚启动需要时间稳定,因此关闭HSE后需要进行延时
时钟输出功能CCO
-
可输出的信号
用单片机输出一路时钟信号供给外部电路,CCO可以选择6种时钟信号通过其指定的引脚进行时钟信号输出
这6种信号包括HSE/HSI/HSIDIV(HSI第一次分频)/LSI/MASTER/CPU
-
可配置时钟输出寄存器CLK_CCOR
配置可配置时钟输出寄存器CLK_CCOR即可对CCO进行设定
- 如果需要更改CCO输出的针脚,需要更改选项字节OPT2中的AFR2位
本文来自博客园,作者:无术师,转载请注明原文链接:https://www.cnblogs.com/untit1ed/p/18565864
本文使用知识共享4.0协议许可 CC BY-NC-SA 4.0
请注意: 特别说明版权归属的文章以及不归属于本人的转载内容(如引用的文章与图片)除外
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?