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时钟安全系统应用例程,可下载参考。
|