微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有 STM32 的 SEGGER:无法连接到目标未检测到 idcode

如何解决带有 STM32 的 SEGGER:无法连接到目标未检测到 idcode

我一直试图在 STM32H7B3 板上设置 PLL 时钟频率,我能够通过在下面的代码中设置 DIVN 乘法器 (RCC_PLL1DIVR_N1) 来实现。我最后一次能够成功执行此操作是将乘数设置为 1。当我尝试下载将乘数设置为 0x18F (= 399) 的代码时,我收到了上述错误消息。我现在意识到,由于 sys_ck 规范,我应该尝试的最大值可能是 DIVN = 280,但尽管如此,错误发生在下载代码时,而不是运行它。我尝试使用重置按钮,但无济于事。我现在无法连接到开发板,我不知道还能尝试什么。

  RCC -> CFGR &= 0; // Reset register
  int32_t cfgr = RCC -> CFGR;
  int32_t sws_pll1 = RCC_CFGR_SWS_PLL1;
  int32_t status = cfgr & sws_pll1;
  while (!status) {
   cfgr = RCC -> CFGR;
   sws_pll1 = RCC_CFGR_SWS_PLL1;
   status = cfgr & sws_pll1;
  } // System clock switch status: Wait until PLL1 is system clock; Todo: hangs*/
  // RCC source control register
  RCC->CR |= RCC_CR_HSION; // HSI clock enable
  while (!(RCC->CR & RCC_CR_HSIRDY)); // Wait until HSI clock is ready
  /* -------- PLL Config -------- */
  // RCC PLLs clock source selection register
  RCC -> PLLCKSELR |= RCC_PLLCKSELR_PLLSRC_HSI; // Select HSI as PLL clock source (hsi_ck)
  // Note: Must have PLL1ON = 0 for modifying prescaler
  RCC -> PLLCKSELR &= ~RCC_PLLCKSELR_DIVM1; // Reset prescaler for PLL1 to disabled
  RCC -> PLLCKSELR |= RCC_PLLCKSELR_DIVM1_5; // Set prescaler for PLL1 to divsion by 32
  // RCC PLL1 fractional divider register
  RCC -> PLL1FRACR = 0; // Set FRACN to 0
  // RCC PLLs configuration register
  RCC -> PLLCFGR |= RCC_PLLCFGR_PLL1FRACEN; // PLL1 franctional latch enable
  RCC -> PLLCFGR &= ~RCC_PLLCFGR_PLL1VCOSEL; // Select PLL1 output frequency range: wide VCO range from 128 to 560 MHz
  RCC -> PLLCFGR |= RCC_PLLCFGR_PLL1RGE_3; // Select PLL1 input reference frequency range: between 8 and 16 MHz
  // Note: Must have PLL1ON = 0 and PLL1RDY = 0 for enabling divider output
  RCC -> PLLCFGR |= RCC_PLLCFGR_DIVP1EN; // PLL1 DIVP divider output enable
  RCC -> PLLCFGR |= RCC_PLLCFGR_DIVQ1EN; // PLL1 DIVQ divider output enable
  RCC -> PLLCFGR |= RCC_PLLCFGR_DIVR1EN; // PLL1 DIVR divider output enable
  // RCC PLL1 dividers configuration register
  // Note: Must have PLL1ON = 0 and PLL1RDY = 0 for writing bits
  RCC -> PLL1DIVR &= 0; // Reset register
  RCC -> PLL1DIVR |= (0x1 << RCC_PLL1DIVR_N1_Pos) & RCC_PLL1DIVR_N1; // DIVN = 0x18F = 399
  RCC -> PLL1DIVR |= (0x1 << RCC_PLL1DIVR_P1_Pos) & RCC_PLL1DIVR_P1; // DIVP = 1
  RCC -> PLL1DIVR |= (0x1 << RCC_PLL1DIVR_Q1_Pos) & RCC_PLL1DIVR_Q1; // DIVQ = 1
  RCC -> PLL1DIVR |= (0x1 << RCC_PLL1DIVR_R1_Pos) & RCC_PLL1DIVR_R1; // DIVR = 1
  // RCC source control register
  RCC -> CR |= RCC_CR_PLL1ON; // PLL1 enable
  //while((RCC -> CR & RCC_CR_PLL1RDY) == 0); // Wait until PLL1 clock is ready; Todo: hangs

更新:我运行了 JLinkSTM32,但它打印了以下内容

Connecting to J-Link via USB...O.K.
Using SWD as target interface.
Target interface speed: 1000 kHz.
VTarget = 3.299V
Reset target...O.K.
Reset option bytes to factory settings...
Option bytes reset to factory settings.
Resetting option bytes Failed.
Press any key to exit.

解决方法

运行命令行 JLinkSTM32.exe 实用程序(与 J-Flash 工具一起安装),选择选项 9(对于 STM32H7xxxx)并希望(需要几秒钟)。

enter image description here

如果成功,它可能已经批量擦除了闪存,并将重置整个芯片的选项字节。它使我摆脱了许多无法通过 J-Flash GUI 工具恢复的莫名其妙的锁定情况。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。