为了进一步降低功耗,使用STOP模式。但是恢复时就出问题了。卡死处为以下代码处:
- while (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
- {
- _Error_Handler(__FILE__, __LINE__);
- }
原始代码应为“if”,但是为了找到问题替换成了“while”,果真就卡死了在这里,返回的值是HAL_ERROR和HAL_TIMEOUT。
跟踪函数流程,具体返回HAL_ERROR位置为如下代码处:
- /*-------------------------------- PLL Configuration -----------------------*/
- /* Check the parameters */
- assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState));
- if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE)
- {
- /* Check if the PLL is used as system clock or not */
- if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL)
- {……}else{<font color="Red">return HAL_ERROR;//此处返回错误!</font>}
返回HAL_TIMEOUT位置代码如下:
- /*-------------------------------- PLL Configuration -----------------------*/
- /* Check the parameters */
- assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState));
- if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE)
- {
- /* Check if the PLL is used as system clock or not */
- if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL)
- {
- if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON)
- {
- /* Check the parameters */
- assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource));
- assert_param(IS_RCC_PLLM_VALUE(RCC_OscInitStruct->PLL.PLLM));
- assert_param(IS_RCC_PLLN_VALUE(RCC_OscInitStruct->PLL.PLLN));
- assert_param(IS_RCC_PLLP_VALUE(RCC_OscInitStruct->PLL.PLLP));
- assert_param(IS_RCC_PLLQ_VALUE(RCC_OscInitStruct->PLL.PLLQ));
- /* Disable the main PLL. */
- __HAL_RCC_PLL_DISABLE();
- /* Get Start Tick */
- tickstart = HAL_GetTick();
- /* Wait till PLL is ready */
- while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET)
- {
- if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE)
- {
- <font color="DarkOrange">return HAL_TIMEOUT;//此处返回超时错误</font>
- }
- }
问题:
1、当出现如上两种错误时,在不重启的情况下,我应该如何解决?
2、在main中进入停止模式,使用外部中断进行唤醒后,系统先执行main进入停止模式后面的代码,还是首先执行外部中断的代码?
3、在main中及中断函数中都增加了时钟恢复函数,是否会造成时钟恢复失败?
|