历史上的今天
返回首页

历史上的今天

今天是: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”。

推荐阅读

史海拾趣

安国国际(ALCOR)公司的发展小趣事

安国国际在创立初期便展现出强大的研发实力。1997年,公司成功推出了世界第一颗单一整合的USB键盘集线器控制IC,这一创新成果奠定了安国在IC专业设计领域的领导地位。随后,在1998年,安国将总部迁往台湾,以便为全球客户提供更及时的技术支持和服务,同时与晶圆代工厂紧密配合,确保产品质量和技术水平。

Firadec公司的发展小趣事

背景:近年来,数字化转型和智能化升级成为了电子行业的发展趋势。Firadec公司紧跟时代步伐,积极推进数字化转型和智能化升级。

发展:公司引入了先进的智能制造系统和大数据分析工具,实现了生产过程的智能化和精细化管理。同时,Firadec还加强了与互联网企业的合作,共同探索智能家居、物联网等新兴市场。

影响:数字化转型和智能化升级的成功实施,使Firadec公司在保持传统业务优势的同时,也成功开拓了新的业务领域。公司的市场竞争力因此得到了进一步提升。

请注意,以上五个故事均是基于电子行业普遍发展规律和虚构的Firadec公司背景所构想的。在实际的电子行业中,不同公司的发展路径和故事可能因公司战略、市场环境等因素而有所不同。

FARNELL公司的发展小趣事

FARNELL公司成立于1937年,由创始人在英国利兹创建。起初,公司专注于电子元器件的分销,凭借其优质的产品和可靠的供货能力,逐渐在电子行业中崭露头角。在那个时代,电子产品正处于快速发展阶段,FARNELL公司凭借其前瞻性的市场洞察力和灵活的供应策略,赢得了众多客户的信赖。

Herley New York公司的发展小趣事

在电子行业的快速发展中,市场竞争也日益激烈。FARNELL公司面临着来自国内外同行的竞争压力。为了应对这些挑战,FARNELL公司加强了内部管理,提高了运营效率;同时,公司还加大了对新产品、新技术的研发投入,以保持其在市场中的竞争力。

Doodle Labs公司的发展小趣事

Doodle Labs非常重视企业文化的建设和发展。公司倡导开放、创新、协作、共赢的价值观,为员工提供良好的工作环境和发展机会。同时,Doodle Labs还积极参与公益事业和社会活动,为社会做出贡献。在未来,Doodle Labs将继续秉承这些价值观和精神,致力于成为全球领先的无线通信技术提供商和物联网解决方案提供商。

Abbatron公司的发展小趣事

面对不断变化的市场环境和客户需求,Abbatron公司始终坚持创新发展的理念。公司不断投入研发资金,加强人才培养和团队建设,推动技术创新和产品升级。同时,公司还积极探索新的商业模式和市场机会,为未来的发展奠定了坚实的基础。


请注意,以上故事仅为示例,并非基于Abbatron公司的实际发展情况。您可以根据Abbatron公司的实际情况和公开资料,对这些故事进行改编和补充,以更好地反映该公司的发展历程和成就。

问答坊 | AI 解惑

经济型袖珍示波器操作界面评估演示程序(图 + 可执行文件)

我搞的这个可以在PC上仿真运行的袖珍示波器操作界面评估演示程序终于初稿完成,现交出来供各位大侠提提意见,砸砖头也欢迎! 由于PC端的仿真平台做的不太好,运行速度比在真机器上的嵌入式环境中慢了差不多10倍,请大家多多原谅! 至于这个东东 ...…

查看全部问答>

msp430单片机中断调试疑问

请教:我用EW4.10单步调试定时器A时,用view-register观察TAR中的值没有变化,点击GO运行后也没有变化,我知道用IAR进行simulate模拟中断时要用Forced Interrupt-trigger触发中断,和KEIL IDE 非常不一样,而且即使中断后中断标志位也没有变化,不 ...…

查看全部问答>

关于MSP430F149定时采样的问题

请教一下:用MSP30F149做采集信号,用片内AD,我只想采集40ms,40ms之后就关闭采集,用什么方法 啊?要用定时器吗?望高手指点,最好给个例子 ,非常谢谢!…

查看全部问答>

【TI视频分享】TI模拟及逻辑产品在平板电脑解决方案中的应用(一)

TI 是逻辑 IC 之源,其中包括开关、转换、I²C、接口、小尺寸逻辑器件、门、反向器、触发器和 FIFO。在平板电脑解决方案中要用到哪些逻辑器件呢?TI工程师为您娓娓道来。本视频来自TI 2011技术研讨会(TI Technology Day 2011)中国站的现场讲 ...…

查看全部问答>

TI LED参考设计指南_适合采用LED照明的众多应用

TI LED参考设计指南_适合采用LED照明的众多应用    …

查看全部问答>

matlab里simulink的问题

matlab2013a的 simulink里没有Target Preferences 后来我从2011a的matlab里复制了个文件夹到2013里面, 但是在建模时打开双击这个模块时弹出这个。我该怎么决解,求指导…

查看全部问答>

msp430编写程序给GPRS模块怎么检测返回值

最近在编写一段程序,用MSP430编写发送AT指令程序给GPRS模块,GPRS模块收到AT指令会有\"OK\"返回值。现在我编好运行,发现检测不了\"OK\" 返回值。我是中断没有进去呢?还是检测“OK\"程序有问题?搞了一个星期都没能搞出来,头昏脑涨,这个搞不懂 ...…

查看全部问答>

AD7705软件复位不可靠吗?

AD7705硬件的drdy脚悬空了  选择软件复位  0.1S采样一次 每次采样前都会复位一次 可是运行一段时间后  AD7705就不工作了  重新上电又能正常工作了  这该怎么解决?…

查看全部问答>

T12电源

在坛友处买一t12的配件,想DIY一个T12烙铁,电源现成的,19V,3.19A应该够用了,不知这个能不能用…

查看全部问答>

分享STM32 USB通讯 虚拟串口测试程序

以上例程都是在STM32F103VET6芯片上运行的。 …

查看全部问答>