完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 HARRY007 于 2016-6-4 10:33 编辑 本来是写在发烧友的博客中的,可惜好多天审核不通过…… 今天闲着没事,在博客中想总结一下之前工作时用到的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”。 上面的图片基本都是来自芯片的数据手册和中文参考手册(RM0016)中的截图。不能保证说法均是正确,纯属个人见解。在本人在进一步学习后如果有不对的地方还会更正,也请大牛指导我一下,多谢。 补充一下:我发现STM32的“闪存存储器的访问时间调整到fHCLK的频率(0~24MHz时为0个等待周期,24~48MHz时为1个等待周期,超过48MHz时为2个等待周期)。”其中意思应该和STM8一样的。 |
|
相关推荐
4 个讨论
|
|
你正在撰写讨论
如果你是对讨论或其他讨论精选点评或询问,请使用“评论”功能。
1129 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1075 浏览 2 评论
2175 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1269 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1693 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 00:18 , Processed in 0.529382 second(s), Total 45, Slave 37 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号