1、时钟安全系统介绍 时钟安全系统是控制器的一种运行保护机制,它可以在HSE时钟发送故障的情况下,切换到HSI时钟下,并产生中断通知,允许应用程序软件完成营救操作。 一般情况下,当时钟安全系统被激活后,在HSE故障后会进入NMI中断,在NMI中断函数中,可以切换至HSI,配置HSI与HSE相同的系统主频,保证程序能以相同的频率运行下去。注意中断函数中要清除CSSF位标志。
2、时钟安全系统应用 关于时钟安全系统的使能,可在程序中直接调用RCC_ClockSecuritySystemCmd(ENABLE);函数使能开启时钟安全系统,该函数主要是对时钟控制寄存器(RCC_CTLR)位19 CSSON位进行配置,如下图,该位置1,使能时钟安全系统。 进入NMI中断后,注意要清除时钟安全系统中断标志位,可直接调用RCC_ClearITPendingBit(RCC_IT_CSS);函数进行清除或直接对时钟中断寄存器(RCC_INTR)位23置1,都是一样的。 时钟安全系统应用程序如下: /*********************************************************************
* @fn main
*
* [url=home.php?mod=space&uid=247401]@brief[/url] Main program.
*
* [url=home.php?mod=space&uid=266161]@return[/url] none
*/
int main(void)
{
u8 i = 0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
SystemCoreClockUpdate();
Delay_Init();
USART_Printf_Init(115200);
printf("SystemClk:%d\r\n", SystemCoreClock);
printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
printf("This is printf example\r\n");
GPIO_Toggle_INIT();
/* Enable Clock Security System(CSS): this will generate an NMI exception when HSE clock fails */
RCC_ClockSecuritySystemCmd(ENABLE);
while(1)
{
Delay_Ms(250);
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (i == 0) ? (i = Bit_SET) : (i = Bit_RESET));
}
}
/*********************************************************************
* @fn NMI_Handler
*
* [url=home.php?mod=space&uid=247401]@brief[/url] This function handles NMI exception.
*
* [url=home.php?mod=space&uid=266161]@return[/url] none
*/
void NMI_Handler(void)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
//清除时钟安全系统中断标志位(CSSF)
// RCC->INTR |= (1<<23);
RCC_ClearITPendingBit(RCC_IT_CSS);
/* Flash 2 wait state */
FLASH->ACTLR = (uint32_t)FLASH_ACTLR_LATENCY_2;
EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE;
/* HCLK = SYSCLK */
RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;
/* PCLK2 = HCLK */
RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;
/* PCLK1 = HCLK */
RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;
/* PLL configuration: PLLCLK = HSI * 12 = 96 MHz */
RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));
RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL12);
/* Enable PLL */
RCC->CTLR |= RCC_PLLON;
/* Wait till PLL is ready */
while((RCC->CTLR & RCC_PLLRDY) == 0)
{
}
/* Select PLL as system clock source */
RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));
RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;
/* Wait till PLL is used as system clock source */
while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)
{
}
// while (1)
// {
// }
}
程序中,使能开启时钟安全系统,当HSE故障异常时,会进入NMI中断,并配置HSI提供与HSE相同的系统主频,保证程序的正常运行。 程序中,若不开启时钟安全系统,当HSE故障后,会切换到HSI,以8M的系统主频运行,表现现象为LED的闪烁频率下降。 正常情况下,LED灯每隔250ms闪烁,波形如下: HSE故障后,LED灯每隔3s闪烁,波形如下,程序运行异常: 当开启时钟安全系统后,HSE故障后,会进入NMI中断配置HSI提供与HSE相同的系统主频,保证程序的正常运行。时钟安全系统开启后,HSE故障时波形如下: 由上图可以看到,HSE故障后,切换到HSI,程序以同样的频率运行。NMI中断中,进入中断后会将PA1引脚拉低(初始化配置高电平),由上图通道2可以看到PA1引脚已被拉低。 附件为CH32L103时钟安全系统应用例程,可下载参考。
|