实际应用
1:时钟使能
SystemClock_Config(); //里面主要设置主时钟,LSE 的使能
2:CSS 以及中断使能.
HAL_RCCEx_EnableLSECSS_IT(); //CSS 中断使能
HAL_NVIC_SetPriority(TAMP_STAMP_IRQn, 0, 1); //CSS 的优先级以及 NVIC 使能
HAL_NVIC_EnableIRQ(TAMP_STAMP_IRQn);
__HAL_RTC_TAMPER_TIMESTAMP_EXTI_ENABLE_IT(); //CSS 的 EXIT 以及触发条件使能
__HAL_RTC_TAMPER_TIMESTAMP_EXTI_ENABLE_RISING_EDGE();
3:CSS 的中断处理
void TAMP_STAMP_IRQHandler(void) //中断函数和 TAMP&STAMP 复用,在
{ //HAL_RCC_NMI_IRQHandler();二次检测即可
HAL_RCC_NMI_IRQHandler();
}
void HAL_RCC_NMI_IRQHandler(void)
{
/* Check RCC CSSF interrupt flag */
if(__HAL_RCC_GET_IT(RCC_IT_CSS)|__HAL_RCC_GET_IT(RCC_IT_LSECSS)) //二次判断
{
/* RCC Clock Security System interrupt user callback */
HAL_RCC_CSSCallback();
} }
void HAL_RCC_CSSCallback(void) //中断函数处理
{
RCC_OscInitTypeDef RCC_OscInitStruct;
HAL_RCCEx_DisableLSECSS();
__HAL_RCC_ENABLE_IT(RCC_CICR_LSECSSC); //清除相关标志位
__HAL_RCC_ENABLE_IT(RCC_CICR_CSSC);
__HAL_RCC_CLEAR_IT(RCC_IT_CSS);
__HAL_RCC_CLEAR_IT(RCC_IT_LSECSS);
__HAL_RCC_BACKUPRESET_FORCE(); //这部份最重要,当 CSS 中断触发之后,LSECSSD 被置位了,
__HAL_RCC_BACKUPRESET_RELEASE(); //必须要在中断内复位清除, 不然会一直被触发,就算系统
//复位了,也会导致 LSE 不能置位 LSERDY
__HAL_RTC_TAMPER_TIMESTAMP_EXTI_CLEAR_FLAG(); //清 LSE 的 EXIT 标志
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI; //转为 LSI
RCC_OscInitStruct.LSIState = RCC_LSI_ON;
RCC_OscInitStruct.LSEState = RCC_LSE_OFF;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
} }
SystemClock_Conf
|