为了进一步降低功耗,使用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中及中断函数中都增加了时钟恢复函数,是否会造成时钟恢复失败?
|