STM32 CubeIDE無法進行調試的問題


解決了由於一個很容易忽視的細節最終導致系統配置存在錯誤造成STM32 CubeIDE無法進行調試的問題;

來龍去脈

在享受CubeIDE快速和便捷的服務之后,生成了一個STM32的工程開始進行系統開發,一如既往的builddebug,就在開始進行調試的時候,不幸發生了,main()函數很簡單,幾乎一窮二白,如下所示;

/** * @brief The application entry point. * @retval int */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */
  
  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

調試的時候,程序執行了函數HAL_Init();之后 ,出現以下提示:

Target is not responding, retrying...
Target is not responding, retrying...
Target is not responding, retrying...
Target is not responding, retrying...
Target is not responding, retrying...

在這里插入圖片描述

W T F ?
在這里插入圖片描述
瞬間一頭霧水;
難道是仿真器壞了?
但是,換了仿真器依然如故。
難道是芯片壞了?
換了板子,依然如故。
那么又會是什么問題呢?於是冷靜下來,開始打斷點,發現進入HAL_Init函數之后,在執行完HAL_MspInit函數直接就掛掉了;函數原型如下所示;

HAL_StatusTypeDef HAL_Init(void)
{
  /* Configure Flash prefetch */
#if (PREFETCH_ENABLE != 0)
#if defined(STM32F101x6) || defined(STM32F101xB) || defined(STM32F101xE) || defined(STM32F101xG) || \ defined(STM32F102x6) || defined(STM32F102xB) || \ defined(STM32F103x6) || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG) || \ defined(STM32F105xC) || defined(STM32F107xC)

  /* Prefetch buffer is not available on value line devices */
  __HAL_FLASH_PREFETCH_BUFFER_ENABLE();
#endif
#endif /* PREFETCH_ENABLE */

  /* Set Interrupt Group Priority */
  HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);

  /* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */
  HAL_InitTick(TICK_INT_PRIORITY);

  /* Init the low level hardware */
  HAL_MspInit();

  /* Return function status */
  return HAL_OK;
}

於是象征性地打開了HAL_MspInit函數,
W T F?
在這里插入圖片描述
這個函數居然是空的,有點不可思議,你確定你不是在玩我?

/** * @brief Initialize the MSP. * @retval None */
__weak void HAL_MspInit(void)
{
  /* NOTE : This function should not be modified, when the callback is needed, the HAL_MspInit could be implemented in the user file */
}

忽然思路一轉,不對,這個是弱定義,於是搜索了一下整個工程。

關於weak,可以參考一下《C:attribute weak 的作用》

搜索了整個工程,果然不出我所料,找到了多處定義,如下所示;
在這里插入圖片描述
最終找到了罪魁禍首,__HAL_AFIO_REMAP_SWJ_DISABLE(); ,SW-DP和JTAG-DP居然被禁用了,這就很難受了。於是直接將該函數__HAL_AFIO_REMAP_SWJ_DISABLE();注釋即可。
在這里插入圖片描述

函數原型如下所示;

/** * Initializes the Global MSP. */
void HAL_MspInit(void)
{
  /* USER CODE BEGIN MspInit 0 */

  /* USER CODE END MspInit 0 */

  __HAL_RCC_AFIO_CLK_ENABLE();
  __HAL_RCC_PWR_CLK_ENABLE();

  /* System interrupt init*/

  /** DISABLE: JTAG-DP Disabled and SW-DP Disabled */
  __HAL_AFIO_REMAP_SWJ_DISABLE();

  /* USER CODE BEGIN MspInit 1 */

  /* USER CODE END MspInit 1 */
}

解決方案

但是回想起來,我什么也沒做,軟件就給我禁用掉了?進入CubeMX,發現默認配置SYSNo Debug模式,如下圖所示;
在這里插入圖片描述
果然是大意失荊州,這里使用SWD需要選擇Serial Wire選項,最終重新生成代碼,發現問題解決了。

反思

IDE帶來傻瓜式便捷的同時,也埋下了很多坑,在這個過程中屏蔽了很多細節,雖然說沒有必要做到面面俱到,但是有必要去了解,這樣可以把握每一個細節,當初makefile都是要手動一行一行擼出來,現在點幾下就搞定了,還是妙哉。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM