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

概述


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


软件环境:STM32CubeMX 6.9.1+keil 5 MDK

HAL库版本:STM32Cube_FW_F1_V1.8.5


 问题探究


问题之所在

 问题刨析:代码卡死是因为在执行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;}
  }
}

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
stm32wb55_nucleo是一款基于STM32WB55微控制器的开发板,可用于进行无线蓝牙(BLE)应用程序的开发。通过使用STM32CubeMX工具,我们可以生成连接手机AP的简单BLE应用程序。 首先,在STM32CubeMX中选择适合的MCU系列和型号,然后创建一个新的工程。在工程配置中,我们选择BLE模块,并配置相应的参数,例如工作模式、广播数据和服务特征等。 在生成代码后,我们可以导入生成代码到IDE中,如Keil或IAR Embedded Workbench。在IDE中,我们可以完成具体的应用程序开发。 在编写应用程序代码时,首先要初始化BLE模块,并设置相关的BLE配置,例如广播数据和服务特征等。然后,我们可以在代码中实现BLE事件处理函数,以处理与手机AP之间的通信。 对于连接手机AP,我们可以使用一些BLE API函数,如BLE_GapConnect函数来发起连接请求。连接成功后,可以通过BLE_GattRead或BLE_GattWrite函数读写数据,实现与手机AP之间的数据交换。 除此之外,我们还可以在应用程序中添加一些其他功能,如扫描周围的BLE设备、设置连接参数、尝试连接其他BLE设备等。 总结来说,使用STM32CubeMX可以方便地生成基于STM32WB55微控制器的BLE应用程序。通过初始化和配置BLE模块,使用相关的BLE API函数,我们可以实现与手机AP之间的连接,并进行数据交换。这样,我们可以应用这个简单的BLE应用程序来满足各种无线通信的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值