STM32 MCU 在断点调试下运行良好,但在调试模式下失败

问题描述 投票:0回答:1

我使用的是STM32F303 MCU。我使用STM32CubeIDE生成了一个简单的项目。在项目中,它在 main() -> while() 循环中将 int data 加 1。

int data = 0;

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  while (1)
  {
      // HAL_Delay(20);
      data++;
  }
}
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.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;
  RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** 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)
  {
    Error_Handler();
  }
}
  • 如果我在调试模式下运行并在 data++ 行添加断点,一切都很好。我可以看到 int dataLive Expressions 中增加。

  • 但是,如果我删除断点,int data将立即变为3145848并且固件停止。

  • 此外,HAL_Delay()会导致固件失败。所以我把它注释掉了。

  • 该固件在NUCLEO开发板中运行良好。

stm32 stm32cubeide
1个回答
0
投票

编译器知道,在您递增该值一次之后,接下来要做的唯一一件事就是再次递增它。通过一次增加全部而不是一次增加一点来节省时间,这很有帮助。

如果你不希望编译器像这样提供帮助,那么你需要将你的计数器声明为易失性的:

volatile int data = 0;

这告诉编译器按照指定的确切顺序一次执行一次对变量的访问。

© www.soinside.com 2019 - 2024. All rights reserved.