SEGGER с STM32: не удалось подключиться к цели. Идентификационный код не обнаружен

Я пытался установить тактовую частоту PLL на плате STM32H7B3, и мне удалось это сделать, установив множитель DIVN (RCC_PLL1DIVR_N1) в приведенном ниже коде. В последний раз мне удалось это сделать успешно, когда множитель был установлен на 1. Когда я попытался загрузить код с множителем, установленным на 0x18F (= 399), я получил указанное выше сообщение об ошибке. Теперь я понимаю, что максимальное значение, которое я должен был попробовать, было, вероятно, DIVN = 280 из-за спецификаций sys_ck, но, тем не менее, ошибка произошла при загрузке кода, а не при его запуске. Я пробовал использовать кнопку сброса, но безрезультатно. Я теперь не могу подключиться к плате, и я не знаю, что еще попробовать.

  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.

person Francisco Skrobola    schedule 11.06.2021    source источник
comment
Хотя мне в целом это не нравится, инструмент STM32CubeMX имеет инструмент дерева часов, который определит для вас настройки PLL и делителя на основе таких ограничений, как желаемая частота системных часов, I2S, USB, AHB и т. д. Если вы используете его вручную, он выделит конфликты. Вам не обязательно использовать сгенерированный код, вы можете просто скопировать настройки в свой собственный код. Учитывая различия и сложность деревьев часов на различных частях STM32, я бы рекомендовал его. В некоторых старых частях для этого есть электронная таблица, но вам нужно разрешить Excel запускать макросы, чтобы заставить его работать.   -  person Clifford    schedule 11.06.2021
comment
Это значение множителя кажется мне безумным. В прошлый раз, когда я делал PLL, я использовал что-то вроде mul 8 div 2. Я согласен с @Clifford, чтобы использовать дерево часов в моем, чтобы получить значения вниз.   -  person Sorenp    schedule 11.06.2021
comment
@Sorenp Я делю на 32, используя DIVM, и на 2, используя DIV(P/Q/R), поэтому тактовая частота HSI 64 МГц становится 1 МГц, что затем умножается на значение DIVN. Это, вероятно, выше, чем должно быть, но менее чем в 2 раза.   -  person Francisco Skrobola    schedule 11.06.2021
comment
@Sorenp Я думаю, что он имеет в виду значение DIVNx, а не множитель. PLLS и тактовые деревья STM32 очень гибкие и сложные, а H7 является частью 280 МГц и может работать от внешнего кристалла или генератора 4 МГц и имеет три отдельных PLLS.   -  person Clifford    schedule 11.06.2021


Ответы (1)


Запустите утилиту командной строки JLinkSTM32.exe (устанавливается вместе с инструментами J-Flash), выберите вариант 9 (для STM32H7xxxx) и надейтесь (занимает несколько нервных секунд).

введите здесь описание изображения

В случае успеха он может полностью стереть флэш-память и сбросить байты опций для всего чипа. Это вывело меня из ряда необъяснимых ситуаций блокировки, которые невозможно было восстановить с помощью инструмента J-Flash GUI.

person Clifford    schedule 11.06.2021
comment
Я попытался запустить, похоже, проблема со сбросом байтов опций. Вывод показан выше. - person Francisco Skrobola; 11.06.2021
comment
Кстати, вот два варианта, которые я смог выбрать для серии H7: [9] STM32H743_53_50 [10] STM32H745_47_55_57 Пробовал оба. Совместимы ли они с H7B3I? - person Francisco Skrobola; 11.06.2021
comment
@FranciscoSkrobola Хороший вопрос, я уверен, что это более новые детали. У вас есть последний код J-Flash? Я явно не знаю. Какое устройство вы выбрали в J-Flash, когда программировали его? - person Clifford; 11.06.2021
comment
Я только что скачал его, поэтому у меня должна быть последняя версия. - person Francisco Skrobola; 11.06.2021
comment
@FranciscoSkrobola Странная автокоррекция! Я не могу представить, каким должно быть мое сердце! Если бы мне пришлось угадывать, я бы выбрал H743. - person Clifford; 11.06.2021
comment
Я пробовал все на данный момент, и все они терпят неудачу, к сожалению - person Francisco Skrobola; 11.06.2021
comment
Поскольку микросхема при сбросе работает на внутреннем генераторе с отключенной ФАПЧ при сбросе, трудно понять, как вы можете быть заблокированы. Вы можете попробовать удерживать его в состоянии сброса при запуске инструмента и отпустить его после запуска разблокировки или отладчика. Теперь я думаю, что это не проблема SO. Чип может быть безвозвратно поврежден. - person Clifford; 11.06.2021
comment
Еще одна вещь, которую стоит попробовать - в инструменте J-Flash вы можете указать шаги инициализации. Шаг, который будет установлен по умолчанию, — это шаг сброса, но там вы можете указать различные стратегии сброса. Попробуйте изменить его с 0 на 2 (как описано здесь wiki.segger.com/UM08001_J-Link_ /_J-Trace_User_Guide). Это отчаянно, но стоит попробовать. - person Clifford; 11.06.2021
comment
Как мне потянуть штифт сброса в низкий уровень? Если это то, что нужно сделать в JLinkGDBService, я не могу заставить это подключиться - person Francisco Skrobola; 11.06.2021
comment
@FranciscoSkrobola На вашей доске есть кнопка сброса? Одним из способов является добавление переключателя между сбросом и заземлением. - person Clifford; 11.06.2021
comment
У него есть кнопка сброса. Я пробовал разные вещи с ним, но какая разница между нажатием на него и вытягиванием его на землю? - person Francisco Skrobola; 11.06.2021
comment
@FranciscoSkrobola ничего, вы спросили меня, как удерживать его в сбросе, поэтому я предположил, что кнопки сброса нет, иначе вы бы не спрашивали. - person Clifford; 11.06.2021
comment
О, я предполагал, что стратегия сброса 2 была чем-то другим, кроме нажатия кнопки сброса, но да, я тоже пробовал это. - person Francisco Skrobola; 11.06.2021
comment
@FranciscoSkrobola, ну, у него была бы лучшая синхронизация и синхронизация по отношению к J-Link, чем, возможно, толстый палец. - person Clifford; 11.06.2021
comment
Итак, какую утилиту я бы использовал, чтобы настроить JLink на низкий уровень? Wiki, кажется, не указывает, как это должно быть сделано. - person Francisco Skrobola; 11.06.2021
comment
@FranciscoSkrobola Джей-Флэш. Параметры проекта, Инициал. - person Clifford; 11.06.2021
comment
Хорошо, он также не подключается, когда я пытаюсь сбросить там. Я предполагаю, что это все, что можно попробовать, но большое спасибо за вашу помощь. Если у вас есть еще предложения, я могу их попробовать. - person Francisco Skrobola; 11.06.2021