打印
[单片机芯片]

CH32L103时钟安全系统

[复制链接]
5046|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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

使用特权

评论回复
沙发
tpgf| | 2024-9-3 14:02 | 只看该作者
CH32L103时钟安全系统是一个控制器的运行保护机制,用于在外部高速时钟信号(HSE)发生故障时,切换到内部高速时钟信号(HSI),并产生中断通知,以便应用程序软件完成营救操作

使用特权

评论回复
板凳
caigang13| | 2024-9-3 15:04 | 只看该作者
从HSE切换到HSI过程中是可控的吗?

使用特权

评论回复
地板
磨砂| | 2024-9-7 10:12 | 只看该作者
该型号集成了丰富的外设资源,如USB、PD及Type-C快充功能,以及ADC、OPA运放、CMP比较器等

使用特权

评论回复
5
晓伍| | 2024-9-7 16:51 | 只看该作者
系统会自动切换到内部高速时钟(HSI),并触发NMI(不可屏蔽中断),允许在NMI中断处理程序中执行相应的营救操作,确保程序能够以相同的频率继续运行

使用特权

评论回复
6
木木guainv| | 2024-9-12 15:36 | 只看该作者
CH32L103系列微控制器是由南京擎天科技有限公司推出的低功耗微控制器产品,基于青稞RISC-V内核

使用特权

评论回复
7
八层楼| | 2024-9-15 08:11 | 只看该作者
当时钟安全系统被激活后,如果HSE出现故障,系统会进入NMI中断

使用特权

评论回复
8
观海| | 2024-9-16 09:19 | 只看该作者
时钟安全系统的使能可以通过调用RCC_ClockSecuritySystemCmd(ENABLE)函数来实现,该函数主要对时钟控制寄存器的CSSON位进行配置

使用特权

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

本版积分规则

17

主题

26

帖子

0

粉丝