历史上的今天
今天是:2024年10月09日(星期三)
2021年10月09日 | 【STM8单片机】---时钟配置小感悟
2021-10-09 来源:eefocus
今天闲着没事,在博客中想总结一下之前工作时用到的STM8时钟代码,本来觉的很简单,随便写写就完事了。这一细看让我慌了一下,还是有没有搞懂的地方。经过一个下午的努力,并且在好朋友的帮助下,终于稍微理清了一些头绪,且记下来,不对了日后再做补充。
首先上STM8单片机的时钟树图片。

这个图是时钟树的上半部分截图。从图中可以清楚的看到STM8的时钟树相对比STM32还是简单了很多。时钟来源有3种,外部晶振、内部RC 16MHz、内部RC 128KHz。CPU的运行CLK来自Fmaster,可以进行128/64/32/16/8/4/2/1分频,也就是最快等于Fmaster。如果是来自内部RC的16MHz则可以首先进行一次预分频HSIDIV,分频系数有8/4/2/1。
这里详细说一下外部时钟的问题。看一下20X系列的数据手册

从数据手册中可以看出,外部晶振的大小最高可以达到24MHz。STM8一些产品最高可以到16MHz,可以从库函数文件stm8s.h文中看到,截图如下:

假如需要外部晶振16MHz,则只需要进行修改如下所示即可。否则在进行使用串口等外设的时候会系统会错误的时间基准,导致无法正常运行。

代码的配置对库例程进行简单的修改,将内部RC和外部的合并了,使用的时候注释即可。
CLK_DeInit();
/*Configure the Fcpu to DIV1*/ //内部和外部都可以进行分频的地方
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);
/*Configure the HSI prescaler to the optimal value */ //内部16MHz独有的预分频
CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);
/*Configure the system clock to use HSE clock source and to run at 24Mhz */
status =CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE,CLK_CURRENTCLOCKSTATE_DISABLE);
if(status== SUCCESS)
{}
/*Configure the system clock to use HSI clock source and to run at 16Mhz */
status =CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI, DISABLE,CLK_CURRENTCLOCKSTATE_DISABLE);
if(status== SUCCESS)
{}

其中CLK_ClockSwitchConfig库函数遵循上图流程,手动模式暂且不管。配置到这里,其实时钟的配置基本已经OK了,但是仔细阅读库例程的readme.txt和数据手册可以发现在使用外部大于16Mhz情况下的这么一句话

这句话是啥意思呢?经过查阅手册发现

在0个等待周期时速度24MHz。也就是其实需要一些等待时间的,具体是多少呢?


在时钟稳定时需要一个HSECNT的时间延迟稳定;另外一个是当Fcpu>16MHz的时候,需要1 wait state。这2个都是“Option bytes”里可以进行预先配置的。他们的地址和默认配置如下图所示。

也就是说,在使用外部24Mhz一定要“Before using the HSE clock make sure that the "Flash_Wait_States"is set to 1.”确保这个选项字节被配置成当需要读取Flash和EEPROM的时候等待一个周期。并且还要保证在开始启动时有足够的稳定时间来确保时钟脉冲稳定,即HSECNT。配置方法可以使用ST-LINK在软件中进行配置,网上教程一堆。也可以在程序中对该地址进行读写操作,可以参考风驰STM8的方法。风驰大哥也有时钟配置的教程很详细,但是对那个等待一个周期解释的不够详细,让我这种小白很是头疼。经过一下午的奋斗,在好哥们的教导下我略微明白了一些,下面就将自己浅显的理解暂且记下,不对的地方日后更正。
在数据手册的首页上面刚开始就说了,STM采用的是哈佛结构3级流水线,也就是同时进行着3个步骤的操作,具体百度,我怕吹牛逼说错了误导别人。其中第一步骤是对Flash进行取指令,当速度大于16MHz的时候STM8要求加入1个等待周期,我的理解就是由于硬件技术的限制,当读取速度过高的时候不能保证数据的准确性,所以需要降速读取。那24Mhz的速度岂不是很垃圾,会不会比16MHz还慢呢?其实不会的,其余的操作,只要不涉及Flash的操作,时序都是在CLK=24Mhz的速度下进行的,非常快。哥们给我举例,假如一个乘法指令3个周期,读取Flash一个周期,他们同时进行的时候,即使读取Flash结束了还是要再等2个周期,等乘法指令结束了才能下一步,并不是24MHz全速运行一个周期不浪费,需要从汇编角度进行时序的严格分析才是最标准的。可以肯定,最终的速度低于24MHz,但并不能说明什么。其性能也可以用MIPS(Million Instructions Per Second)这个指标来说明它的速度,STM8的数据手册这样写“Max 20 MIPS @ 24 MHz”。
上一篇:STM8S学习笔记-时钟控制1
下一篇:STM8S学习笔记-时钟控制2
史海拾趣
|
我搞的这个可以在PC上仿真运行的袖珍示波器操作界面评估演示程序终于初稿完成,现交出来供各位大侠提提意见,砸砖头也欢迎! 由于PC端的仿真平台做的不太好,运行速度比在真机器上的嵌入式环境中慢了差不多10倍,请大家多多原谅! 至于这个东东 ...… 查看全部问答> |
|
请教:我用EW4.10单步调试定时器A时,用view-register观察TAR中的值没有变化,点击GO运行后也没有变化,我知道用IAR进行simulate模拟中断时要用Forced Interrupt-trigger触发中断,和KEIL IDE 非常不一样,而且即使中断后中断标志位也没有变化,不 ...… 查看全部问答> |
|
请教一下:用MSP30F149做采集信号,用片内AD,我只想采集40ms,40ms之后就关闭采集,用什么方法 啊?要用定时器吗?望高手指点,最好给个例子 ,非常谢谢!… 查看全部问答> |
|
【TI视频分享】TI模拟及逻辑产品在平板电脑解决方案中的应用(一) TI 是逻辑 IC 之源,其中包括开关、转换、I²C、接口、小尺寸逻辑器件、门、反向器、触发器和 FIFO。在平板电脑解决方案中要用到哪些逻辑器件呢?TI工程师为您娓娓道来。本视频来自TI 2011技术研讨会(TI Technology Day 2011)中国站的现场讲 ...… 查看全部问答> |
|
matlab2013a的 simulink里没有Target Preferences 后来我从2011a的matlab里复制了个文件夹到2013里面, 但是在建模时打开双击这个模块时弹出这个。我该怎么决解,求指导… 查看全部问答> |
|
最近在编写一段程序,用MSP430编写发送AT指令程序给GPRS模块,GPRS模块收到AT指令会有\"OK\"返回值。现在我编好运行,发现检测不了\"OK\" 返回值。我是中断没有进去呢?还是检测“OK\"程序有问题?搞了一个星期都没能搞出来,头昏脑涨,这个搞不懂 ...… 查看全部问答> |
|
AD7705硬件的drdy脚悬空了 选择软件复位 0.1S采样一次 每次采样前都会复位一次 可是运行一段时间后 AD7705就不工作了 重新上电又能正常工作了 这该怎么解决?… 查看全部问答> |




