Перейти к содержанию
    

Я извиняюсь что пишу тут. Локализовал свою проблему и встал вопрос как написать свой лоадер для внешней QSPI памяти под J-Link? Где брать исходники для правки тех что предоставлены производителем. Ну или как объяснить ему что у меня есть только Flash 2 (BK2). При загрузке J-Link использует программу ST_STM32H753_Eval_QSPI.elf

Изменено пользователем MasterElectric

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 минут назад, MasterElectric сказал:

Локализовал свою проблему и встал вопрос как написать свой лоадер для внешней QSPI памяти под J-Link?

Глянь ТУТ.

1 час назад, MementoMori сказал:

RCC->AHB3ENR |= 0x00000002;

Либо начни с чего-нибудь попроще, либо напиши правильную инициализацию полностью. Есть вероятность, что доступ к недоинициализированной памяти может HardFault делать. А IDE, перед стиранием может проверять что там записано. Или пустышку на функцию BlanckCheck добавь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, MasterElectric сказал:

Спасибо то что надо

Похоже, всё один в один с Keil.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 minutes ago, VladislavS said:

Похоже, всё один в один с Keil.

Жаль описание для debug режима нет. Но ссылка крайне полезная.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

42 минуты назад, x893 сказал:

Жаль описание для debug режима нет

Глянь ещё  "c:\Program Files (x86)\SEGGER\JLink_V640\Doc\Manuals" - там три достаточно объёмных документа, что-нибудь найдёшь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не пойму до конца в чем проблема. В Segger Embedded Studio открыл проект, плюс к тем что в вики нашел еще на гите. Переделал под себя, в дебаг конфигурации все работает нормально, в каждой из функций сделал ногодрыг. Далее все по инструкции, но судя по логу J-Flash не может запустить код из ОЗУ  - ERROR: Failed to initialize RAMCode

это лог:

 - J-Link found 1 JTAG device. Core ID: 0x6BA02477 (None)
 - Connected successfully
Erasing selected sectors ...
 - 4096 of 4096 sectors selected, 1 range, 0x90000000 - 0x90FFFFFF
 - Start of determining flash info (Bank 0 @ 0x90000000)
 - End of determining flash info
 - Flash bank info:
 - 4096 * 4 KB @ 0x90000000
 - Start of preparing flash programming
 - End of preparing flash programming
 - Start of determining dirty areas in flash cache
 - End of determining dirty areas
 - CPU speed could not be measured.
 - Start of erasing sectors
 - ERROR: Timeout while preparing target, core does not stop. (PC = 0x080201B2, XPSR = 0x01000003, SP = 0x000008E0)!
 - ERROR: Failed to initialize RAMCode
 - Erasing range 0x90000000 - 0x9001FFFF ( 32 Sectors, 128 KB)
 - ERROR: Timeout while erasing sectors, core does not stop. (PC = 0x000004EE, XPSR = 0x41000003, SP = 0x00000928)!
 - ERROR: Failed to erase sectors.
 - End of erasing sectors
 - ERROR: Erase failed
 - Start of restoring
 - End of restoring
 - ERROR: Failed to erase sectors
Disconnecting ...
 - Disconnected

Куда копать дальше, у меня идей пока нет. Блин попробую еще под st-link сделать.

Изменено пользователем MasterElectric

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проверить, что скомпилировано в Position Independent Code и где в J-Flash указывается с какого адреса загружать алгоритм.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да действительно не были указаны параметры ОЗУ, странно в JLinkDevices.xml взял такой же МК скопировал и переделал только путь к внешнему загрузчику. Как же он узнает параметры ОЗУ у него?

  <Device>
   <ChipInfo Vendor="ST" Name="STM32H750VB" Core="JLINK_CORE_CORTEX_M7" JLinkScriptFile="Devices/ST/STM32H7/ST_STM32H7xx.pex"/>
   <FlashBankInfo Name="QSPI Flash" BaseAddr="0x90000000" MaxSize="0x08000000" Loader="Devices/ST/STM32H7/ST_STM32H745I_Disco_QSPI.elf" LoaderType="FLASH_ALGO_TYPE_OPEN" />
  </Device>
  <Device>
   <ChipInfo Vendor="ST" Name="STM32H750VB_QSPI_BK2" Core="JLINK_CORE_CORTEX_M7" WorkRAMAddr="0x24000000" WorkRAMSize="0x8000" JLinkScriptFile="Devices/ST/STM32H7/ST_STM32H7xx.pex"/>
   <FlashBankInfo Name="QSPI Flash" BaseAddr="0x90000000" MaxSize="0x08000000" Loader="Devices/ST/STM32H7/ST_STM32H7_QSPI.elf" LoaderType="FLASH_ALGO_TYPE_OPEN" />
  </Device> 

 Добавил WorkRAMAddr="0x24000000" WorkRAMSize="0x8000" и начало все работать, но это из J-Flash. Как себя поведет из CubeIDE буду смотреть ну и еще отладить нужно работу с самой QSPI флешкой. VladislavS спасибо за помощь. 

Изменено пользователем MasterElectric

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

29 минут назад, MasterElectric сказал:

Как же он узнает параметры ОЗУ у него?

Там *.elf указан в качестве лоадера. В elf есть вся атрибутика для загрузки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да!!!!!!!!!!!!!

 

JSXKnyQP.png?download=1

Надеюсь, уважаемый Forger не переел попкорна?))

Отдельное спасибо Владиславу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему при включении тактирования qspi у Вас висло все? Решили эту проблему?

Изменено пользователем pvo125

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23 минуты назад, pvo125 сказал:

Почему при включении тактирования qspi у Вас висло все? Решили эту проблему?

Потому что память на QSPI отображается на общее адресное пространство и IDE лазила в неё в обход функций BlankCheck и Verify. А так как режимы были недоконфигурированы, то это заканчивалось HardFault-ми. 

 

Подробности

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

39 minutes ago, pvo125 said:

Почему при включении тактирования qspi у Вас висло все? Решили эту проблему?

 

Да, полностью решил, все работает.

На самом деле термин "висло", как оказалось, не совсем правильный.

В двух словах ответить вам не получится. Не знаю, насколько глубоко Вы разобрались в написании алгоритма, но попробую разжевать.

IDE (то есть KEIL) в первую очередь вызывает функцию Init. Поставьте в конце этой функции какой-нибудь маячок - зажигание светодиода или, что я настоятельно рекомендую не полениться и сделать, настройте UART на отправку отладочных сообщений.   Уверен, что маячок этот, будучи выставлен в конце init сработает даже при включенном тактировании QSPI, которое, как вам кажется, вешает контроллер.

Следующий шаг, которые делает IDE - пытается стереть сектор. Перед стиранием она вызывает функцию BlankCheck, которая сверяет содержимое памяти с образцом (как правило затирание осуществляется не нулями, а 0xFF) и за зря не стирает  ячейку, не расходует ее ресурс. Если функция BlankCheck  в тексте алгоритма есть, то IDE ею пользуется. Если нет, то общается с памятью как с единым адресным пространством.  А чтобы это было возможно, QSPI нужно не только проинициализировать, но и включить Memory Mapped Mode.

Резюме - посмотрите, есть ли у вас функция BlankCheck. Если нет, то создайте ее, но пустую, чтобы всегда возвращала 0. То же самое и с EraseSector. И поставьте в функциях маячки. А потом расскажите, все ли они сработали. Потом будем разбираться с вашей проблемой дальше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...