#申请原创# #有奖活动#
前言
对于MCU来说,时钟是单片机能够稳定执行程序的关键。通常,单片机使用的时钟源为外部晶振。如果在一些重要的场合中应用时,单片机的时钟收到外界的干扰而导致时钟失效,从而使得单片机无法正常运行程序,系统卡死,可能会造成损失。如果单片机使用在安全生产场所,还有可能造成人身事故。因此,对于时钟的安全管理对于单片机来说至关重要。正好,在我刚刚获得的APM32F030Mini板中,有相关的功能存在。因此,下面进行探讨。
1 时钟安全系统(CSS)
时钟安全系统顾名思义就是管理时钟使得MCU能够运行在安全状态。时钟安全系统的开启在RCM模块中。选择开启时钟安全系统后,外部高速时钟使能后会同时使能时钟安全系统,随后时钟安全系统会一直监视外部高速时钟的状态,如果外部高速时钟受外外部干扰而失效时,会关闭外部高速时钟,同时关闭时钟环并将内部高速时钟作为系统时钟。我们在参考书册的时钟树中也能找到它的存在。
虽然时钟安全系统可以通过选择内部时钟源作为系统时钟来解决外部时钟突然失效的问题,但是内部时钟对比外部时钟来说不稳定,不能一直当作单片机的系统时钟。因此,我们需要重新开启外部时钟。时钟安全系统的标志位会挂起NMI中断,因此我们可以在NMI中断里面对时钟进行重新配置。
2 程序编写 上面可以知道,当我们开启CSS,外部高速时钟出现故障,会发生时钟安全中断,同时会不断执行NMI中断程序,直到时钟安全中断被清除。我们可以在NMI中断程序中进行外部时钟的重新配置,并输出时钟失效信息。以下的代码是基于APM32F030标准库进行操作的。
首先我们需要开启时钟安全系统:
接着就是编写NMI中断程序。CSS在关闭HSE的同时也会将PLL关闭。如果我们需要串口打印信息的话则需要重新选择串口的时钟源,将其时钟源选为CSS自动打开的内部高速时钟。同时因为串口的波特率计算是根据当前时钟的,因此我们还需要进行串口的重新配置。经过上面两步操作就可以打印信息了。接着就是重新开启外部高速时钟。
void NMI_Handler(void)
{
/* 选择串口时钟源 */
RCM_ConfigUSARTCLK(RCM_USART1CLK_HSI);
/* 初始化串口,打印信息 */
USART_Config(&usartstruct);
printf("打印信息");
/* 外部时钟重新开启 */
/*
*/
/* 清除时钟安全中断标志 */
RCM_ClearIntFlag(RCC_IT_CSS);
}
需要主要的是,时钟安全中断的标志位会一直触发NMI中断。如果不清除标志位的话,程序将一直执行NMI中断的代码。因此,在NMI中断中,需要进行时钟安全中断的标志位清除。
最后将程序烧入到APM32F030开发板中,当外部晶振失效时,程序顺利执行,并打印出信息。
以上就是时钟安全中断的相关知识,欢迎大家一起交流讨论。
|