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

STM32F750 отладка, сборка

Всем привет!

Есть демоборда STM32F7508-DK. 

Внутренней флэши только 64кб. По QSPI подключено еще 16МБт.

Не могу найти информации, как эту связку запустить в отладке? 

Может кто уже прошел эти камни?

Спасибо!

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


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

2 часа назад, eu1cc сказал:

Не могу найти информации, как эту связку запустить в отладке? 

Как любой другой STM32. Там же на борту ST-Link. Создаёте проект в любой известной вам IDE, нажимаете кнопку Debug и понеслась...

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


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

1 hour ago, VladislavS said:

Как любой другой STM32. Там же на борту ST-Link. Создаёте проект в любой известной вам IDE, нажимаете кнопку Debug и понеслась...

Не все так просто. Т.к. на борту всего 64к флеши, в нее загружается только "кусок" кода, в котором инициализируется работа с внешней флеш по QSPI, а вся остальная программа записывается в эту флеш. И дебаггер отваливается...

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


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

5 минут назад, eu1cc сказал:

Не все так просто. Т.к. на борту всего 64к флеши

А всё ещё проще. Так как на борту есть 340КБ ОЗУ. В неё загружается программа и отлаживается. Это если делать по уму....

Когда перестанет влезать в 340КБ, обнаружите на плате 16МБ SDRAM.

Отлаживаться в маленьком флеше, при наличии рядом 340КБ + 16МБ ОЗУ, можно только сдуру.  :unknw:

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


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

42 minutes ago, jcxz said:

А всё ещё проще. Так как на борту есть 340КБ ОЗУ. В неё загружается программа и отлаживается. Это если делать по уму....

Когда перестанет влезать в 340КБ, обнаружите на плате 16МБ SDRAM.

Отлаживаться в маленьком флеше, при наличии рядом 340КБ + 16МБ ОЗУ, можно только сдуру.  :unknw:

Это интересно! Спасибо! Может есть какой нибуть пример?

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


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

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

Это интересно! Спасибо! Может есть какой нибуть пример?

Что примерять? IAR .icf-файл:

define region RAM_regionA    = mem:[from 0x1FFE8000 size 0x17F00]; //PSRAM (ro-code)
...
define block IMAGE_HEAD with fixed order {section .intvec, section .checksum,
  section .codehead, section .intvecTail, section .codeSignature};
place in RAM_regionA {ro, first block IMAGE_HEAD, last section .codetail};

говорю компоновщику чтобы все read-only-секции он помещал в регион ОЗУ = RAM_regionA. Всё.

Посмотрите какие регионы ОЗУ есть в вашем МК, распределите их (куда RW-данные, куда - RO-данные/код), опишите в .icf-файле и укажите какие секции в какие регионы класть.

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


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

4 часа назад, VladislavS сказал:

Как любой другой STM32.

Интересная тенденция, вроде всегда флеша набивали под завязку, 512,1024,2048Кб, тут же всего 64, явно только под бутлоадер задумано...  Чем этот камень так хорош, цена дешевле, чем у МК с большим флешем?

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

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


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

17 hours ago, jcxz said:

Что примерять? IAR .icf-файл:


define region RAM_regionA    = mem:[from 0x1FFE8000 size 0x17F00]; //PSRAM (ro-code)
...
define block IMAGE_HEAD with fixed order {section .intvec, section .checksum,
  section .codehead, section .intvecTail, section .codeSignature};
place in RAM_regionA {ro, first block IMAGE_HEAD, last section .codetail};

говорю компоновщику чтобы все read-only-секции он помещал в регион ОЗУ = RAM_regionA. Всё.

Посмотрите какие регионы ОЗУ есть в вашем МК, распределите их (куда RW-данные, куда - RO-данные/код), опишите в .icf-файле и укажите какие секции в какие регионы класть.

Да, спасибо! Заработало. IDE - CubeIDE. Поменял в STM32F750N8HX_FLASH.ld:

/* Memories definition */
MEMORY
{
  /*RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 320K
  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 64K*/
 RAM    (xrw)    : ORIGIN = 0x20025000,   LENGTH = 160K
 FLASH      (rx)      : ORIGIN = 0x20000000,   LENGTH = 160K
}

Правда, некоторые вещи ведут себя странно. Например HAL_Delay перестала работать. (в __weak uint32_t HAL_GetTick uwTick не меняется)

А как теперь сделать, чтобы можно было в SDRAM, или QSPI отлаживать? Просто замена адресов, как с RAM не работает. Очевидно, вначале должны стартануть процедуры работы с этой памятью, и где-то в теле программы надо сказать какие куски кода куда складывать?

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


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

49 минут назад, eu1cc сказал:

А как теперь сделать, чтобы можно было в SDRAM, или QSPI отлаживать? Просто замена адресов, как с RAM не работает. Очевидно, вначале должны стартануть процедуры работы с этой памятью, и где-то в теле программы надо сказать какие куски кода куда складывать?

Как в Вашей IDE - не знаю. Но как правило делается так:

1. Сперва (код во внутренней ОЗУ) пишете и отлаживаете процедуру иниализации контроллера SDRAM.

2. В IAR-е переносите процедуру инициализации SDRAM из своего си-файла в .mac-файл. В нём надо создать функцию с соответствующим именем, которую IAR вызывает перед началом загрузки образа прошивки в память МК.

3. Указываете этот .mac-файл в свойствах проекта. Перераспределяете регионы в .icf-файле с использованием пространства SDRAM.

Всё. В вашей IDE должны быть аналогичные шаги. Там тоже должна быть возможность выполнения некоего командного скрипта перед началом загрузки образа прошивки.

 

PS: Смысла отлаживать в QSPI-памяти нет никакого, но можно сделать аналогично процедуре с SDRAM.

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


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

2 часа назад, eu1cc сказал:

Поменял в STM32F750N8HX_FLASH.ld

1. Это неправильный подход. Посмотрите приложенный скрипт.

2. Ещё не забудьте в стартапе по Reset_Handler загрузить правильное значение указателя стека. Не все отладчики делают это автоматически. На С это как-то так выглядит. Если у вас стартап на асме (что скорее всего), то поколдуйте.

  void Reset_Handler()
  {
#ifdef __DEBUG_SRAM__
    __set_MSP((uint32_t)&_estack);
#endif

    SystemInit();
    
    

3. При отладке из SRAM с тем линкерскриптом, что я приложил, можно/нужно пропустить код копирования инициализированного сегмента данных, он же и так уже в RAM слинкован и загружен. У меня как-то так. В своём стартапе найдите код делающий то же самое.

#ifndef __DEBUG_SRAM__
    extern uint32_t _sidata[], _sdata[], _edata[];
    for (volatile uint32_t *pSrc = _sidata, *pDst = _sdata; pDst != _edata; *pDst ++= *pSrc++) ;
#endif

4. Обязательно проверьте какое значение у вас в  SCB->VTOR загружается. Прежде чем разрешить какие-нибудь прерывания где-нибудь в SystemInit() надо делать что-то типа

extern void(*__vector_table[])();
SCB->VTOR = (uint32_t)&__vector_table;

 

5. Проверьте, чтобы в стартапе таблица векторов прерываний размещалась в той же секции, что указана в линкерскрипте. Сталкивался, что где-то в CMSIS она .isr_vector, где-то просто .vectors - лучше сразу проверить, а не ловить "интересности".

 

6. Если будете загружать код для отладки в SDRAM, то внимательно прочитайте сообщение jcxz про инициализацию SDRAM перед загрузкой кода.

 

STM32F750N8_sram.lds

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


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

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

Смысла отлаживать в QSPI-памяти нет никакого, но можно сделать аналогично процедуре с SDRAM.

Для QSPI наверняка готовый FlashLoader есть, тем более для девборда. 

 

 

  

2 часа назад, eu1cc сказал:

Очевидно, вначале должны стартануть процедуры работы с этой памятью, и где-то в теле программы надо сказать какие куски кода куда складывать?

При штатной работе из Flash, самом собой, стартовый код и будет инициализировать SDRAM. Обратите внимание, чтобы SystemInit() вызывался раньше кода инициализации данных - в нём и включите SDRAM. При отладке перед загрузкой данных в SDRAM отладчик может/должен сделать это сам. Тут есть два пути - написать простенький загрузчик, на подобии того как это делается для QSPI, либо скриптами отладчика. Смотря что для вас проще. А куда что складывать делается через линкерскрипт - он для этого и нужен. Добавляете в него регионы памяти, прописываете какие секции в них размещать. Тут, на самом деле, творческий подход нужен, потому что очень многое зависит от задачи, которую вы решаете. В стартапе всё и разложите по местам согласно таблицами инициализации, которые линкер создаст. Рекомендую стартап на C сразу найти/взять, так будет сильно проще. Для нестандартных конфигураций его править надо будет по любому. Ну и разобраться, в конце концов, придётся - это вам не Cortex-M0.

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


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

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

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

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

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

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

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

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

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

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