[APM32F1] APM32 CSS时钟安全系统

[复制链接]
1440|9
 楼主| Alden 发表于 2023-7-10 16:09 | 显示全部楼层 |阅读模式
本帖最后由 Alden 于 2023-7-10 16:09 编辑

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

根据用户手册,CSS的开启只需要使能时钟控制寄存器RCM_CTRL的19bit CSSEN就能开启CSS功能。
ffb011e86e830f27e9fd218dffb87d6.png
而代码就只需要简单的一行:          RCM_EnableCSS();
同时在NMI_Handler中断服务函数中加上清CSS中断的操作,即可实现基本的CSS的功能。
  1. int main(void)
  2. {
  3.     GPIO_Config_T GPIO_ConfigStruct;
  4.        
  5.           RCM_EnableCSS();

  6.     APM_MINI_LEDInit(LED2);

  7.     RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA);
  8.     GPIO_ConfigStruct.pin = GPIO_PIN_8;
  9.     GPIO_ConfigStruct.mode = GPIO_MODE_AF_PP;
  10.     GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
  11.     GPIO_Config(GPIOA, &GPIO_ConfigStruct);
  12.     RCM_ConfigMCO(RCM_MCOCLK_SYSCLK);

  13.     while(1)
  14.     {
  15.         APM_MINI_LEDToggle(LED2);
  16.         Delay();
  17.     }
  18. }


  19. void NMI_Handler(void)
  20. {
  21.                  if (RCM_ReadIntFlag(RCM_INT_CSS) != RESET)        
  22.                  {

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

想要系统时钟在短接结束后恢复原有的主频配置可以等待HSE恢复起振后重新配置系统时钟。
那要怎么知道HSE什么时候恢复起振了呢?
查看用户手册发现,HSE恢复起振也是可以产生中断的。
263ee053872f8f79b6cedea56a83235.png
在时钟中断寄存器(RCM_INT)中会产生HSECLK 就绪中断标志。由此可以在HSE恢复后重新配置时钟。
配置代码如下:
  1. int main(void)
  2. {
  3.     GPIO_Config_T GPIO_ConfigStruct;
  4.        
  5.           SetSysClock();
  6.           RCM_EnableCSS();
  7.        
  8.     NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_4);
  9.     NVIC_EnableIRQRequest(RCM_IRQn, 0, 1);

  10.     APM_MINI_LEDInit(LED2);

  11.     RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA);
  12.     GPIO_ConfigStruct.pin = GPIO_PIN_8;
  13.     GPIO_ConfigStruct.mode = GPIO_MODE_AF_PP;
  14.     GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
  15.     GPIO_Config(GPIOA, &GPIO_ConfigStruct);
  16.     RCM_ConfigMCO(RCM_MCOCLK_SYSCLK);

  17.     while(1)
  18.     {
  19.         APM_MINI_LEDToggle(LED2);
  20.         Delay();
  21.     }
  22. }

  23. void NMI_Handler(void)
  24. {
  25.                  if (RCM_ReadIntFlag(RCM_INT_CSS) != RESET)        
  26.                  {
  27.                             RCM_ConfigHSE(RCM_HSE_OPEN);
  28.                                          RCM_EnableInterrupt(RCM_INT_HSERDY);
  29.                                 RCM_ClearIntFlag(RCM_INT_CSS);
  30.                  }                         
  31. }

  32. void RCM_IRQHandler(void)
  33. {
  34.                  if (RCM_ReadIntFlag(RCM_INT_HSERDY) != RESET)        
  35.                  {
  36.                                   SetSysClock();
  37.                             RCM_EnableCSS();
  38.                                         RCM_ClearIntFlag(RCM_INT_HSERDY);
  39.                  }                         
  40. }
在短接外部晶振后,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 | 显示全部楼层
有没有可能就是有些频率是内部晶振不能替代的呢
zljiu 发表于 2023-8-4 14:39 | 显示全部楼层
内部高速时钟和外部高速时钟是一样的吗
gwsan 发表于 2023-8-4 15:34 | 显示全部楼层
这个安全系统判定的依据是什么呢?
tfqi 发表于 2023-8-4 16:14 | 显示全部楼层
css时钟安全系统的开启是自动的吗?
 楼主| Alden 发表于 2023-8-7 13:53 | 显示全部楼层
tpgf 发表于 2023-8-4 11:49
如果外部晶振失效的话 会自动切换内部时钟吗

自动切,然后进NMI_Handler
 楼主| Alden 发表于 2023-8-7 13:55 | 显示全部楼层
nawu 发表于 2023-8-4 12:08
那那些使用外部晶振的外设会不会突然就混乱了啊

会的,可以在NMI_Handler重新配置或者等待外部晶振恢复
 楼主| Alden 发表于 2023-8-7 13:55 | 显示全部楼层
tfqi 发表于 2023-8-4 16:14
css时钟安全系统的开启是自动的吗?

开启后就自动了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

115

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部