打印

STM32 xxxxxx之时钟全安检测(三)

[复制链接]
6193|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
skyler|  楼主 | 2008-7-6 14:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Flash 检测结束后只能表示代码是正确的,接着应当对内部SRAM进行检测,可是片内SRAM的可靠性相当高,至今为止我还没有见过一次因为内部SRAM硬件故障而产生的失败。因而Startup的SRAM检测跳过去不讲了。但运行时内存也可能受到外部干挠而发生位翻转,因而内存监控将在运行时再进行讲述。这里,将主要讲一下安全时钟系统的原理。

背景:

时钟是系统的脉博,而时钟也是最经常发生故障的电路。极端情况下就是晶振损坏无法起震,有时也会产生跑频,导至几部PLL也无法锁定频率。如何监控时钟电路是否正常是非常必要的。

STM32内部一共可以有四个振荡器:LSI、HSI、LSE、HSE,分别为内部低速振荡器(30K-60KHz)、内部高速振荡器(8MHz)、外部低速振荡器(32.768KHz)、外部高速振荡器。

LSI是RTC和IWDG(独立看门狗)的时钟源,而RTC也可以选择由LSE外接32.768K来提供高精度的时钟源。但IWDG只能由LSI提供时钟。

HSI是内部8M振荡器,实际上会有一些偏差。上电复位初期便由他提供时钟,以后可以由软件将系统时钟切换到HSE。

HSE是外接时钟源,可以提供准确的时钟基准,如系统需要使用USB则最好由HSE经PLL得到。

时钟安全系统(CSS):

STM32已提供了一个时钟失常恢复机制(CSS),当系统选择HSE作系工作时钟,并打开了CSS功能后,一旦HSE由于外部原因而停震时,将自动切换到内部HSI运行,并产生NMI中断,于是可以在NMI中断中进行安全处理。

跑频检测:

当外部振荡器跑频但没有停止时,CSS并不会生效,此时我们需要用软件来检测。

检测原理:

第一步,上电初期时打开LSI并使之作为RTC的时钟源,接着将系统时钟切换到HSI并设置Systick溢出为2ms,将RTC计数器清零,然后等待systick 2ms溢出标志到来,然后读取RTC的计数值:LSIPeriod。

第二步,选择HSE作为系统时钟,同样设置Systick 2ms溢出,将RTC计数器清零。接着等待systick 2ms到来,读取RTC计数值:RefHSEPeriod。

第三步,比较:以上LSIPeriod和RefHSEPeriod均是在高速振荡器计数2ms时的RTC计数,如果两个高速振荡器准确,那这两个值应是相同或相近,比较这个值就知道上电时时钟是否异常。

运行时的检测:

假如你的系统正常工作时SysTick也恰好是2ms,那每隔2ms去取得RTC计数,并与上电时RefHSEPeriod进行比较来检测运行时的时钟误差。在安全系统中,看门狗是必不可少的部件,因为STM32的IWDG使用的是LSI,因而对LSI的检查也是需要的。假设LSI产生故障变慢或停止,实时取得的RTC计数都将产生误差,因而从另一个角度上又去保证了IWDG的可靠运行。

代码:

沙发
香水城| | 2008-7-6 15:02 | 只看该作者

总结的不错,还有创意,酷之!

但有2个小问题还是要注意:

1)晶振是晶体振荡器的简称,LSI和HSI是芯片内部的阻容振荡器,不是晶振,特此更正。

2)LSI和HSI是阻容振荡器,它们的振荡频率受供电电压和环境温度的影响较大,楼主关于外部晶振跑频的软件检测方法需要充分考虑这个误差影响。


正确地使用STM32的CSS和IWDG,可以有效地提供系统的安全性。

使用特权

评论回复
板凳
skyler|  楼主 | 2008-7-6 17:05 | 只看该作者

谢谢香主加cool

改过来了,平时叫惯了晶振也就顺口带过。

使用特权

评论回复
地板
shian| | 2008-7-17 09:22 | 只看该作者

可以,支持

使用特权

评论回复
5
supreme42| | 2012-5-24 00:35 | 只看该作者
内部的RC振荡器HSI和LSI误差还是比较大的

使用特权

评论回复
6
xlsbz| | 2014-11-8 11:09 | 只看该作者
mark

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

57

帖子

1

粉丝