概述
Annotation: 本文记录了使用STM32CubeMX生成配置模板,在MDK环境下撰写完逻辑代码进行编译后下载后,代码在单片机内卡死的问题解决。
软件环境:STM32CubeMX 6.9.1+keil 5 MDK
HAL库版本:STM32Cube_FW_F1_V1.8.5
问题探究
![](https://img-blog.csdnimg.cn/fa18909ca24246c1baf4807d4a06da9b.png)
问题刨析:代码卡死是因为在执行RCC初始化时,由于时间太短没有延时就开始检测标志位HAL_OK是否被置位。故进入了Error_Handler(); 但是这里面啥都没有还有个死循环故当标志位检测不到时卡进死循环。
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
__disable_irq(); //这个是关闭全局中断的意思
while (1)
{
}
/* USER CODE END Error_Handler_Debug */
}
解决方法
A PLAN: 直接将if判断标志位是否置位代码删除。或者让Error_Handler(void)函数体为空。
B PLAN:添加等待函数,放弃error_hander若没置位继续循环检测是否置位,直到其置位则退出循环 ,给出代码如下
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
while(1){if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) break;}
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
while(1){if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) break;}
}
}