打印
[APM32F1]

APM32 CSS时钟安全系统

[复制链接]
859|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Alden|  楼主 | 2023-7-10 16:09 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Alden 于 2023-7-10 16:09 编辑

#申请原创# #技术资源#
CSS时钟安全系统是MCU中防止外部晶振失效导致MCU无法正常工作的故障处理功能。
能够自动关闭外部高速晶振,并且将系统时钟切换到内部高速时钟HSI。保障芯片继续运行,并且可以软件再配置系统时钟。
接下来使用APM32F103ZE开发板和APM32的SDK来测试下CSS的功能。


根据用户手册,CSS的开启只需要使能时钟控制寄存器RCM_CTRL的19bit CSSEN就能开启CSS功能。

而代码就只需要简单的一行:          RCM_EnableCSS();
同时在NMI_Handler中断服务函数中加上清CSS中断的操作,即可实现基本的CSS的功能。
int main(void)
{
    GPIO_Config_T GPIO_ConfigStruct;
       
          RCM_EnableCSS();

    APM_MINI_LEDInit(LED2);

    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA);
    GPIO_ConfigStruct.pin = GPIO_PIN_8;
    GPIO_ConfigStruct.mode = GPIO_MODE_AF_PP;
    GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
    GPIO_Config(GPIOA, &GPIO_ConfigStruct);
    RCM_ConfigMCO(RCM_MCOCLK_SYSCLK);

    while(1)
    {
        APM_MINI_LEDToggle(LED2);
        Delay();
    }
}


void NMI_Handler(void)
{
                 if (RCM_ReadIntFlag(RCM_INT_CSS) != RESET)        
                 {

                         RCM_ClearIntFlag(RCM_INT_CSS);
                 }                         
}
使用镊子短接外部高速晶振可以看到,之前72M主频下闪灯比较快,短接后主频切换到内部晶振8M的主频,闪灯频率明显变慢。
但是松开镊子后频率还是慢的,没有恢复。
这是因为触发CSS后PLL和HSE都被关闭,需要软件开启才能重新恢复。

想要系统时钟在短接结束后恢复原有的主频配置可以等待HSE恢复起振后重新配置系统时钟。
那要怎么知道HSE什么时候恢复起振了呢?
查看用户手册发现,HSE恢复起振也是可以产生中断的。

在时钟中断寄存器(RCM_INT)中会产生HSECLK 就绪中断标志。由此可以在HSE恢复后重新配置时钟。
配置代码如下:
int main(void)
{
    GPIO_Config_T GPIO_ConfigStruct;
       
          SetSysClock();
          RCM_EnableCSS();
       
    NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_4);
    NVIC_EnableIRQRequest(RCM_IRQn, 0, 1);

    APM_MINI_LEDInit(LED2);

    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA);
    GPIO_ConfigStruct.pin = GPIO_PIN_8;
    GPIO_ConfigStruct.mode = GPIO_MODE_AF_PP;
    GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
    GPIO_Config(GPIOA, &GPIO_ConfigStruct);
    RCM_ConfigMCO(RCM_MCOCLK_SYSCLK);

    while(1)
    {
        APM_MINI_LEDToggle(LED2);
        Delay();
    }
}

void NMI_Handler(void)
{
                 if (RCM_ReadIntFlag(RCM_INT_CSS) != RESET)        
                 {
                            RCM_ConfigHSE(RCM_HSE_OPEN);
                                         RCM_EnableInterrupt(RCM_INT_HSERDY);
                                RCM_ClearIntFlag(RCM_INT_CSS);
                 }                         
}

void RCM_IRQHandler(void)
{
                 if (RCM_ReadIntFlag(RCM_INT_HSERDY) != RESET)        
                 {
                                  SetSysClock();
                            RCM_EnableCSS();
                                        RCM_ClearIntFlag(RCM_INT_HSERDY);
                 }                         
}
在短接外部晶振后,CSS时钟安全系统启动,系统时钟切换到HSICLK,进入NMI_Handler开启HSE使能和HSE就绪中断使能,
HSE恢复起振后触发HSE就绪中断,进入RCM_IRQHandler重新初始化时钟,再次开启CSS时钟安全系统。
实测也可以看到短接外部高速晶振后LED闪烁频率变慢,不短接后LED闪烁频率恢复正常,往复多少都可以正常响应。

由此可以看出CSS时钟安全系统在HSE容易受到干扰的场景可以有效的维持芯片的运行,并能够配置恢复正常的时钟配置,提高系统的稳定性。

使用特权

评论回复
沙发
tpgf| | 2023-8-4 11:49 | 只看该作者
如果外部晶振失效的话 会自动切换内部时钟吗

使用特权

评论回复
板凳
nawu| | 2023-8-4 12:08 | 只看该作者
那那些使用外部晶振的外设会不会突然就混乱了啊

使用特权

评论回复
地板
aoyi| | 2023-8-4 13:47 | 只看该作者
有没有可能就是有些频率是内部晶振不能替代的呢

使用特权

评论回复
5
zljiu| | 2023-8-4 14:39 | 只看该作者
内部高速时钟和外部高速时钟是一样的吗

使用特权

评论回复
6
gwsan| | 2023-8-4 15:34 | 只看该作者
这个安全系统判定的依据是什么呢?

使用特权

评论回复
7
tfqi| | 2023-8-4 16:14 | 只看该作者
css时钟安全系统的开启是自动的吗?

使用特权

评论回复
8
Alden|  楼主 | 2023-8-7 13:53 | 只看该作者
tpgf 发表于 2023-8-4 11:49
如果外部晶振失效的话 会自动切换内部时钟吗

自动切,然后进NMI_Handler

使用特权

评论回复
9
Alden|  楼主 | 2023-8-7 13:55 | 只看该作者
nawu 发表于 2023-8-4 12:08
那那些使用外部晶振的外设会不会突然就混乱了啊

会的,可以在NMI_Handler重新配置或者等待外部晶振恢复

使用特权

评论回复
10
Alden|  楼主 | 2023-8-7 13:55 | 只看该作者
tfqi 发表于 2023-8-4 16:14
css时钟安全系统的开启是自动的吗?

开启后就自动了

使用特权

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

本版积分规则

37

主题

84

帖子

1

粉丝