打印
[单片机芯片]

CH32L103时钟安全系统

[复制链接]
640|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
L-MCU|  楼主 | 2024-6-18 17:34 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
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时钟安全系统应用例程,可下载参考。

CH32L103 时钟安全系统.zip

662.62 KB

使用特权

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

本版积分规则

7

主题

8

帖子

0

粉丝