[应用相关] 时钟安全系统的应用(LSE 篇)

[复制链接]
 楼主| 黑心单片机 发表于 2021-12-29 20:07 | 显示全部楼层 |阅读模式
前言
某公司用 ST 的 STM32L476 在水表上,在开启时钟安全系统(CSS)之后,发现 MCU 重启后,
LSE 无法正常启动,通过示波器看,发现 LSE 已经正常起振。这是由于他们对 CSS 的了解不够,应
用错误导致,下面我们来深入了解一下 MCU 内部的时钟安全系统。
 楼主| 黑心单片机 发表于 2021-12-29 20:08 | 显示全部楼层
时钟安全系统
功能介绍
时钟安全系统主要功能是检测外部时钟(HSE 和 LSE,LSE 只有在某些系列存在,如
STM32L4),当外部时钟发生故障时,此振荡器将自动禁止,一个时钟故障时间将发送到高级控制定
时器 TIM1 和 TIM8 的断路输出(刹车),并同时产生一个中断来向软件通知此故障(时钟系统中断,
CSSI),以使 MCU 能够执行救援操作,这是一个不可屏蔽中断(NMI)。
关键因素
1:LCECSSON 必须在 LSERDY 置位后设置。
2:CSS 可以工作在系统复位上(除了上电复位),因为它受控于备份域,所以要注意
RCC_BDCR 上的寄存器,并不会在系统复位后被清除。
3:CSS_LSE 和 RTC Tamper,TimeStamp 复用 EXIT Line19.所以不仅要使能 NVIC(复用
TAMP_STAMP_IRQn),还要使能 EXIT(EXTI->IMR1 |= ((uint32_t)0x00080000))。

 楼主| 黑心单片机 发表于 2021-12-29 20:09 | 显示全部楼层
实际应用
1:时钟使能
  1. SystemClock_Config(); //里面主要设置主时钟,LSE 的使能
2:CSS 以及中断使能.
  1. HAL_RCCEx_EnableLSECSS_IT(); //CSS 中断使能
  2. HAL_NVIC_SetPriority(TAMP_STAMP_IRQn, 0, 1); //CSS 的优先级以及 NVIC 使能
  3. HAL_NVIC_EnableIRQ(TAMP_STAMP_IRQn);
  4. __HAL_RTC_TAMPER_TIMESTAMP_EXTI_ENABLE_IT(); //CSS 的 EXIT 以及触发条件使能
  5. __HAL_RTC_TAMPER_TIMESTAMP_EXTI_ENABLE_RISING_EDGE();
3:CSS 的中断处理

  1. void TAMP_STAMP_IRQHandler(void) //中断函数和 TAMP&STAMP 复用,在
  2. { //HAL_RCC_NMI_IRQHandler();二次检测即可
  3. HAL_RCC_NMI_IRQHandler();
  4. }
  5. void HAL_RCC_NMI_IRQHandler(void)
  6. {
  7. /* Check RCC CSSF interrupt flag */
  8. if(__HAL_RCC_GET_IT(RCC_IT_CSS)|__HAL_RCC_GET_IT(RCC_IT_LSECSS)) //二次判断
  9. {
  10. /* RCC Clock Security System interrupt user callback */
  11. HAL_RCC_CSSCallback();
  12. } }
  13. void HAL_RCC_CSSCallback(void) //中断函数处理
  14. {
  15. RCC_OscInitTypeDef RCC_OscInitStruct;
  16. HAL_RCCEx_DisableLSECSS();
  17. __HAL_RCC_ENABLE_IT(RCC_CICR_LSECSSC); //清除相关标志位
  18. __HAL_RCC_ENABLE_IT(RCC_CICR_CSSC);
  19. __HAL_RCC_CLEAR_IT(RCC_IT_CSS);
  20. __HAL_RCC_CLEAR_IT(RCC_IT_LSECSS);
  21. __HAL_RCC_BACKUPRESET_FORCE(); //这部份最重要,当 CSS 中断触发之后,LSECSSD 被置位了,
  22. __HAL_RCC_BACKUPRESET_RELEASE(); //必须要在中断内复位清除, 不然会一直被触发,就算系统
  23. //复位了,也会导致 LSE 不能置位 LSERDY
  24. __HAL_RTC_TAMPER_TIMESTAMP_EXTI_CLEAR_FLAG(); //清 LSE 的 EXIT 标志
  25. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI; //转为 LSI
  26. RCC_OscInitStruct.LSIState = RCC_LSI_ON;
  27. RCC_OscInitStruct.LSEState = RCC_LSE_OFF;
  28. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  29. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  30. {
  31. Error_Handler();
  32. } }


SystemClock_Conf

您需要登录后才可以回帖 登录 | 注册

本版积分规则

72

主题

514

帖子

0

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