ITCM stm32h7
ITCM stm32h7
Всем привет. Кто ни будь догадался как в принципе использовать ITCM?
Как я понял это обычный Executable SRAM с быстрым доступом (0 wait state).
Как я предполагаю-у, я должен скомпилировать код под область ITCM, но залить его как Data блок во Flash,
затем моё пользовательское приложение должно перенести этот Data блок из Flash в ITCM и... передать управление?
Или я чо-то недопер?
Как я понял это обычный Executable SRAM с быстрым доступом (0 wait state).
Как я предполагаю-у, я должен скомпилировать код под область ITCM, но залить его как Data блок во Flash,
затем моё пользовательское приложение должно перенести этот Data блок из Flash в ITCM и... передать управление?
Или я чо-то недопер?
- Реклама
Re: ITCM stm32h7
Помощь зала попрошу.
Проц. STM32H750. Во флеш расположен только свой загрузчик и больше ничего.
Загрузчик принимает рабочую прошивку по UART и кладет её в RAM D1.
Рабочая программа - отдельный проект, подразумевается работа без флеш.
Собирается с STM32H750VBTX_RAM.ld и в отладчике работает.
Всё в сборе - не работает переход от загрузчика к рабочей программе.
Где виснет непонятно, отладку запускаю в проекте загрузчика,
загрузчик свое отрабатывает и после перехода в основную программу все виснет.
Адрес запуска основной программы беру из её HEX , типа такого :
#define APPLICATION_ADDRESS 0x24003500UL
В отладке видно, что PC и SP изменились, но дальше пошаговая не работает.
Может, у кого есть работающий вариант перехода для H7?
Проц. STM32H750. Во флеш расположен только свой загрузчик и больше ничего.
Загрузчик принимает рабочую прошивку по UART и кладет её в RAM D1.
Рабочая программа - отдельный проект, подразумевается работа без флеш.
Собирается с STM32H750VBTX_RAM.ld и в отладчике работает.
Всё в сборе - не работает переход от загрузчика к рабочей программе.
Где виснет непонятно, отладку запускаю в проекте загрузчика,
загрузчик свое отрабатывает и после перехода в основную программу все виснет.
Адрес запуска основной программы беру из её HEX , типа такого :
#define APPLICATION_ADDRESS 0x24003500UL
В отладке видно, что PC и SP изменились, но дальше пошаговая не работает.
Может, у кого есть работающий вариант перехода для H7?
- Вложения
-
- STM32H750VBTX_RAM.ld.txt
- (4.65 КБ) 65 скачиваний
-
- jmp.txt
- (1.01 КБ) 58 скачиваний
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: ITCM stm32h7
Программа скомпилирована с того адреса куда её загружают и пытаются запустить?
Re: ITCM stm32h7
в ld файле RAM_EXEC (xrw) : ORIGIN = 0x24000000, LENGTH = 512K
всё там сейчас - и программа и все данные.
Стек в DTCMRAM.
Если запускаю отладчиком в RAM, то всё работает.
Если загружаю загрузчиком HEX ->BIM и в ОЗУ с 0x24000000, и запускаю с адреса старта программы, то не работает
Когда запускаю отладчиком в RAM, потом выхожу из отладки и подключаюсь отладкой в конфигурации "БЕЗ ЗАГРУЗКИ"
то работает.
Если подключусь отладкой без загрузки к тому , ч то флеш загрузчик перенес, то отладка тоже не то показыват.
всё там сейчас - и программа и все данные.
Стек в DTCMRAM.
Если запускаю отладчиком в RAM, то всё работает.
Если загружаю загрузчиком HEX ->BIM и в ОЗУ с 0x24000000, и запускаю с адреса старта программы, то не работает
Когда запускаю отладчиком в RAM, потом выхожу из отладки и подключаюсь отладкой в конфигурации "БЕЗ ЗАГРУЗКИ"
то работает.
Если подключусь отладкой без загрузки к тому , ч то флеш загрузчик перенес, то отладка тоже не то показыват.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: ITCM stm32h7
Посмотрите листинг во что компилируется вызов JumpToApplication(); Былт недавно. После того как вы стек передвинули он продолжал использоваться и всё падало.
- Реклама
Re: ITCM stm32h7
[uquote="pixar",url="/forum/viewtopic.php?p=4559854#p4559854"]Если подключусь отладкой без загрузки к тому , ч то флеш загрузчик перенес, то отладка тоже не то показыват.[/uquote]Не понимаю проблемы... Отладчик вроде имеется. Почему тогда просто не отладить им - не найти где именно стопорится? Зачем без толку продолжать пинать колёса?
Скорее всего (имхо) ваша рабочая программа начинает работать с периферией (инитить её) в расчёте на то, что регистры периферии содержат дефолтные значения (послесбросовые). А ваш загрузчик уже что-то записал в какой-то регистр и не восстановил дефолтное.
С помощью отладчика такое находится на раз.
Скорее всего (имхо) ваша рабочая программа начинает работать с периферией (инитить её) в расчёте на то, что регистры периферии содержат дефолтные значения (послесбросовые). А ваш загрузчик уже что-то записал в какой-то регистр и не восстановил дефолтное.
С помощью отладчика такое находится на раз.
Re: ITCM stm32h7
дело за малым - подключить отладчик после загрузки кода загрузчиком.
/*
* ARM clearly says that changing the VTOR requires a DSB after it
* and changing the stack pointer requires an ISB after it.
*/
Вот с этим вроде как заработало.
__set_MSP(*(__IO uint32_t*) startToProgramAddress);
__ISB(); /* Instruction Synchronization Barrier */
и вот это еще:
// Make sure, the CPU is in privileged mode.
#define EnablePrivilegedMode() __asm("SVC #0");
if( CONTROL_nPRIV_Msk & __get_CONTROL( ) )
{ /* not in privileged mode */
EnablePrivilegedMode();
}
/*
* ARM clearly says that changing the VTOR requires a DSB after it
* and changing the stack pointer requires an ISB after it.
*/
Вот с этим вроде как заработало.
__set_MSP(*(__IO uint32_t*) startToProgramAddress);
__ISB(); /* Instruction Synchronization Barrier */
и вот это еще:
// Make sure, the CPU is in privileged mode.
#define EnablePrivilegedMode() __asm("SVC #0");
if( CONTROL_nPRIV_Msk & __get_CONTROL( ) )
{ /* not in privileged mode */
EnablePrivilegedMode();
}
Re: ITCM stm32h7
[uquote="pixar",url="/forum/viewtopic.php?p=4560585#p4560585"]Вот с этим вроде как заработало.
__set_MSP(*(__IO uint32_t*) startToProgramAddress);
__ISB(); /* Instruction Synchronization Barrier */[/uquote]Ну так и есть, как я и говорил - проблема в вашем "загрузчике". Кривой он. Загрузчик, перед передачей управления загруженной программе, должен ВСЕ регистры CPU и периферии перевести в начальное (послесбросовое) состояние. Ваш загрузчик значит этого не делает.
__set_MSP(*(__IO uint32_t*) startToProgramAddress);
__ISB(); /* Instruction Synchronization Barrier */[/uquote]Ну так и есть, как я и говорил - проблема в вашем "загрузчике". Кривой он. Загрузчик, перед передачей управления загруженной программе, должен ВСЕ регистры CPU и периферии перевести в начальное (послесбросовое) состояние. Ваш загрузчик значит этого не делает.
Re: ITCM stm32h7
попробуйте против шерсти. скорее всего выбрасывает на исключение или прирывание. зажги в обработчике светодиод и захалтуй проц. отладчик для обезьян. 
Re: ITCM stm32h7
__ISB - это не про обнуление регистров.


