当前位置:   article > 正文

STM32学习--STM32CUBEMX 生成代码运行时卡死问题解决_stm32cubemx 生成代码卡死

stm32cubemx 生成代码卡死

概述


Annotation: 本文记录了使用STM32CubeMX生成配置模板,在MDK环境下撰写完逻辑代码进行编译后下载后,代码在单片机内卡死的问题解决。


软件环境:STM32CubeMX 6.9.1+keil 5 MDK

HAL库版本:STM32Cube_FW_F1_V1.8.5


 问题探究


问题之所在

 问题刨析:代码卡死是因为在执行RCC初始化时,由于时间太短没有延时就开始检测标志位HAL_OK是否被置位。故进入了Error_Handler(); 但是这里面啥都没有还有个死循环故当标志位检测不到时卡进死循环。

  1. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  2. {
  3. Error_Handler();
  4. }
  5. void Error_Handler(void)
  6. {
  7. /* USER CODE BEGIN Error_Handler_Debug */
  8. /* User can add his own implementation to report the HAL error return state */
  9. __disable_irq(); //这个是关闭全局中断的意思
  10. while (1)
  11. {
  12. }
  13. /* USER CODE END Error_Handler_Debug */
  14. }

解决方法

A PLAN: 直接将if判断标志位是否置位代码删除。或者让Error_Handler(void)函数体为空。

B PLAN:添加等待函数,放弃error_hander若没置位继续循环检测是否置位,直到其置位则退出循环 ,给出代码如下

  1. void SystemClock_Config(void)
  2. {
  3. RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  4. RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  5. /** Initializes the RCC Oscillators according to the specified parameters
  6. * in the RCC_OscInitTypeDef structure.
  7. */
  8. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  9. RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  10. RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  11. RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  12. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  13. RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  14. RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  15. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  16. {
  17. while(1){if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) break;}
  18. }
  19. /** Initializes the CPU, AHB and APB buses clocks
  20. */
  21. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  22. |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  23. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  24. RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  25. RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  26. RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  27. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  28. {
  29. while(1){if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) break;}
  30. }
  31. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/50656
推荐阅读
相关标签
  

闽ICP备14008679号