前言 目前很多用户在使用 STM8 的时候使用了 16MHz 的内部振荡或者外部晶体来作为时钟源。事实上,STM8 家族中有些系列是支持最高 24MHz 主频的,比如 STM8S207、STM8AF52,等等。那么,需要更快的运行速度时,是否只需要使用更高的主频就可以直接运行了呢?+ R, }7 R1 N6 ^, K' n0 ~ 问题 F7 C, t$ K7 a$ n7 E/ z( C 某客户在其产品的设计中,使用了 STM8AF52A9。客户工程师称其一段以前已经验证过的代码,使用 STVP 下载后无法正常运行。但是他试过在 IAR for STM8 中是可以正常调试的,不知道为何使用 STVP 后就无法正常工作了呢? 5 S. m9 Z( a# W, J, e 调研" m" w1 R; I5 L8 s 1. 了解问题 使用编译好的.s19 文件使用 STVP 烧写到 STM8AF52A9,发现上电后是无法正常工作的。观察用户代码,在 IAR 中进入调试状态,可以断点调试,单步调试,都可以。不过,最后发现在线调试时,一旦运行到以下代码时,程序就死掉了。 2. 分析问题 STM8 上电后默认的主时钟源为内部 HSI RC 时钟的 8 分频,即 f HSI /8。原因是 HSI 时钟的稳定时间短,而 8 分频可保证系统在较差的 V DD 条件下安全启动。等主时钟源稳定后,用户可以自行将主时钟切换到其他时钟源上。 / I4 B7 j) o. R X 先来看一下刚才这个函数的原型: 它的作用在于切换时钟源。CLK_SwitchMode 代表使用的切换方式,有自动切换和手动切换;CLK_NewClock 代表新的时钟源;ITState 代表是否使能或禁用中断;CLK_CurrentClockState 代表切换后原时钟源的状态是否保持或关闭。所以,用户代码的意思就是:使用自动切换方式,切换主时钟到 HSE,不产生中断,切换后原主时钟源关闭。 切换主时钟源后程序就出问题这种情况,看来问题很可能出在 HSE 上,必须对外部晶振进行检测。原本思考是否 HSE 外部晶体的振荡是否存在什么问题,但是在使用示波器进行检测后发现 HSE 已经是在正常的振荡当中了,而且波形很漂亮。但是,在示波器上看到频率是 24MHz。检查晶体上的标记,果然是 24MHz 的频率。所以,客户在使用 STM8AF52A9 时,为了提高性能,使用了最高主频 24MHz。 客户所遇到的问题应该就出在 24MHz 的使用上了。客户以前使用都是 16MHz 的主频。STM8 要求,如果用户使用的主时钟+ Z& d6 J0 d" y8 N% Z 频率超过了 16MHz,那么 Flash 以及 EEPROM 的访问需要配置 1 个等待周期。, t _! M$ {0 L8 ~# @- u 7 M0 N l8 \. R; ?6 m+ [6 N STM8AF52A9 数据手册可见如下: 参考手册 RM0016 在 HSE 的描述中,也提到了: ...; R" U. q/ `* y# z$ W0 E 了解更多,请下载后阅读 下载地址1>> 下载地址2>> 更多实战经验>> 2 t: x9 x# f! R b( p. k |
! g# c: x+ A% b3 ?. U: B! I
这个应该是开发人员的基本知识。这帮家伙只知道拿 ST 的库代码,不晓得先看一遍手册,难怪开发出来的程序都如同渣渣。不管是这里,还是学校和培训机构,还是企业,都应该培训开发人员上手芯片找库之前先把芯片本身的手册读一遍。
开发人员!RTFM!读一遍他妈的手册有这么费劲吗?!