你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32 CubeIDE无法进行调试的问题

[复制链接]
STMCU小助手 发布时间:2022-1-29 01:04
解决了由于一个很容易忽视的细节最终导致系统配置存在错误造成STM32 CubeIDE无法进行调试的问题;
- 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...
20200305093736276.png
- s. Q& B( {: y' D
瞬间一头雾水;  P1 M. k4 h  L/ q
难道是仿真器坏了?+ s+ s2 r& {5 `
但是,换了仿真器依然如故。3 [) v% W% F0 X9 M0 T# I
难道是芯片坏了?) Z9 ?1 Z* e1 |- z+ E
换了板子,依然如故。
' {, y3 g+ v8 L) m( ^& o/ e$ K那么又会是什么问题呢?于是冷静下来,开始打断点,发现进入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函数,, G7 `9 [* ~0 I6 I5 @! ]7 Q0 P8 g3 Y4 e

$ a0 m/ k7 l: h* v8 w3 }这个函数居然是空的,有点不可思议,你确定你不是在玩我?
/**  * @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 的作用》
搜索了整个工程,果然不出我所料,找到了多处定义,如下所示;4 ]9 M3 I4 e/ w: Z, a
20200305094113391.png
$ m5 I3 @0 ^# t4 v/ o; E最终找到了罪魁祸首,__HAL_AFIO_REMAP_SWJ_DISABLE(); ,SW-DP和JTAG-DP居然被禁用了,这就很难受了。于是直接将该函数__HAL_AFIO_REMAP_SWJ_DISABLE();注释即可。" p; O% Q% M5 Z- P$ }6 {

8 [! e2 h5 x+ l1 z0 l# B" W
函数原型如下所示;
/**  * 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
20200305094329562.png 9 P8 P5 b9 g% t/ K1 \( x" J
果然是大意失荆州,这里使用SWD需要选择Serial Wire选项,最终重新生成代码,发现问题解决了。
反思
IDE带来傻瓜式便捷的同时,也埋下了很多坑,在这个过程中屏蔽了很多细节,虽然说没有必要做到面面俱到,但是有必要去了解,这样可以把握每一个细节,当初makefile都是要手动一行一行撸出来,现在点几下就搞定了,还是妙哉。
1 r1 @) `; i- n* q" J1 d. ]% x
收藏 评论0 发布时间:2022-1-29 01:04

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版