• 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都是要手动一行一行撸出来,现在点几下就搞定了,还是妙哉。

  • 相关阅读:
    marMariaDB & MYSQL flexviews
    tomcat与resin的比较
    nginx 1.4.3能直接升到1.8.1吗
    Docker Compose vs. Dockerfile
    分布式事务 spring 两阶段提交 tcc
    linux下拷贝整个目录
    MySQL :: Fatal error: Can't change to run as user 'mysql'. Please check that the user exists!
    python Drools
    KubeCon CloudNativeCon China 2019
    在mysql中修改表名的sql语句
  • 原文地址:https://www.cnblogs.com/unclemac/p/12783339.html
Copyright © 2020-2023  润新知