
- U ?4 x/ U/ N i% w3 A 来龙去脉 在享受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...![]() - s. Q& B( {: y' D 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;}瞬间一头雾水; P1 M. k4 h L/ q 难道是仿真器坏了?+ s+ s2 r& {5 ` 但是,换了仿真器依然如故。3 [) v% W% F0 X9 M0 T# I 难道是芯片坏了?) Z9 ?1 Z* e1 |- z+ E 换了板子,依然如故。 那么又会是什么问题呢?于是冷静下来,开始打断点,发现进入HAL_Init函数之后,在执行完HAL_MspInit函数直接就挂掉了;函数原型如下所示; 于是象征性地打开了HAL_MspInit函数,, G7 `9 [* ~0 I6 I5 @! ]7 Q0 P8 g3 Y4 e /** * @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 */}这个函数居然是空的,有点不可思议,你确定你不是在玩我? 忽然思路一转,不对,这个是弱定义,于是搜索了一下整个工程。
搜索了整个工程,果然不出我所料,找到了多处定义,如下所示;4 ]9 M3 I4 e/ w: Z, a ![]() 最终找到了罪魁祸首,__HAL_AFIO_REMAP_SWJ_DISABLE(); ,SW-DP和JTAG-DP居然被禁用了,这就很难受了。于是直接将该函数__HAL_AFIO_REMAP_SWJ_DISABLE();注释即可。" p; O% Q% M5 Z- P$ }6 { 函数原型如下所示; /** * 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模式,如下图所示;" F7 o! u% B! ^' F) w+ l+ D; h# c5 l 反思![]() 果然是大意失荆州,这里使用SWD需要选择Serial Wire选项,最终重新生成代码,发现问题解决了。 在IDE带来傻瓜式便捷的同时,也埋下了很多坑,在这个过程中屏蔽了很多细节,虽然说没有必要做到面面俱到,但是有必要去了解,这样可以把握每一个细节,当初makefile都是要手动一行一行撸出来,现在点几下就搞定了,还是妙哉。 1 r1 @) `; i- n* q" J1 d. ]% x |