解決了由於一個很容易忽視的細節最終導致系統配置存在錯誤造成STM32 CubeIDE無法進行調試的問題;
來龍去脈
在享受CubeIDE
快速和便捷的服務之后,生成了一個STM32的工程開始進行系統開發,一如既往的build
,debug
,就在開始進行調試的時候,不幸發生了,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
,發現默認配置SYS
是No Debug模式,如下圖所示;
果然是大意失荊州,這里使用SWD需要選擇Serial Wire選項,最終重新生成代碼,發現問題解決了。
反思
在IDE帶來傻瓜式便捷的同時,也埋下了很多坑,在這個過程中屏蔽了很多細節,雖然說沒有必要做到面面俱到,但是有必要去了解,這樣可以把握每一個細節,當初makefile都是要手動一行一行擼出來,現在點幾下就搞定了,還是妙哉。