对于STM32系统时钟的监控是十分必要的。如果外部晶振失效,对于STM32来说是致命的。尤其在工程中会造成无法预料的损失。所以要总结一下对于STM32时钟安全系统(CSS)。当时钟安全系统被激活后,它会实时监控外部高速振荡器,如果高速外部时钟信号(HSE)发生故障,外部振荡器会自动关闭,并产生时钟安全中断,这个中断会连接到不可屏蔽中断(NMI),此时时钟安全系统会将高速内部RC振荡器切换为其系统时钟源。对于增强型STM32F103来说,时钟失效事件同时会被送入高级定时器TIM1刹车输入端,从而起到保护电机作用。值得注意的是一旦时钟安全系统被激活,当外部高速时钟(HSE)发生故障产生时钟安全中断时,并同时产生不可屏蔽中断(NMI)。此时NMI将会不断被执行,直到时钟安全系统中断挂起位被清除。那么就要在不可屏蔽中断NMI的中断服务函数中必须要通过设置时钟中断寄存器(RCC_CIR)的CSSC位来清除CSS中断。
//启动时钟安全系统CSS:
RCC_ClockSecuritySystemCmd(ENABLE); // (NMI中断是不可屏蔽的!)
//外部振荡器实现时,产生中断,对应的中断程序:
void NMIException(void)
{
if (RCC_GetITStatus(RCC_IT_CSS) != RESET)
{ // HSE、PLL已被禁止(但是PLL设置未变)
// 客户添加相应的系统保护代码处
// 下面为HSE恢复后的预设置代码
RCC_HSEConfig(RCC_HSE_ON); // 使能HSE
RCC_