ichthyandr 0 6 августа, 2020 Опубликовано 6 августа, 2020 · Жалоба Всем привет. Есть StmCudeIDE, есть желание изменить дефолтный стартовый адрес с 0x08000000 на 0x08010000 и запустить отладчик. Изменил в скрипте линкера: /* Memories definition */ MEMORY { RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K FLASH (rx) : ORIGIN = 0x8010000, LENGTH = 192K } /* FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 256K */ в system_stm32f1xx.c изменил смещение таблицы прерываний: /* #define VECT_TAB_SRAM */ #define VECT_TAB_OFFSET 0x00010000U /*!< Vector Table base offset field. This value must be a multiple of 0x200. */ в настройках проекта с дефолта меняю стартовый адрес (vector table=0x08010000) в STMProgrammer вижу что бинарик залит по адресу 0x08010000. При попытке запуска отладчика программа падает. Кто сталкивался, что делаю не так или еще что-то нужно сделать? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 6 августа, 2020 Опубликовано 6 августа, 2020 · Жалоба Что бы вы там не меняли в настройках, микроконтроллер все равно будет стартовать с 0x08000000. Примерно так )))) Сначала - https://www.litres.ru/dzhozef-u/yadro-cortex-m3-kompanii-arm-polnoe-rukovodstvo-48411055/ А потом Cube ))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 2 6 августа, 2020 Опубликовано 6 августа, 2020 · Жалоба 1 minute ago, dimka76 said: Что бы вы там не меняли в настройках, микроконтроллер все равно будет стартовать с 0x08000000. Примерно так )))) Это так. Собственно а зачем стартовать с оффсета? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 6 августа, 2020 Опубликовано 6 августа, 2020 · Жалоба В линкерскрипте есть запись ENTRY(Reset_Handler). Отладчик по ней запускает код. Не важно с какого адреса он расположен. А вот при включении питания загрузчик, расположенный по адресу 0x08000000, должен передать управление куда надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ichthyandr 0 6 августа, 2020 Опубликовано 6 августа, 2020 · Жалоба 11 minutes ago, VladislavS said: В линкерскрипте есть запись ENTRY(Reset_Handler). Отладчик по ней запускает код. Не важно с какого адреса он расположен. А вот при включении питания загрузчик, расположенный по адресу 0x08000000, должен передать управление куда надо. оно так и предполагается, по 0x08000000 будет бутлоадер. Бутлоадер уже работает, шьет прошивку, но при переходе на адрес 0x08010000 всё виснет, в main.c бутлоадера: #define FIRMWARE_START (FLASH_BASE + 0x10000) далее typedef void (*pFunction)(void); pFunction JumpToApplication; HAL_RCC_DeInit(); SysTick->CTRL = 0; SysTick->LOAD = 0; SysTick->VAL = 0; __disable_irq(); __DSB(); JumpToApplication = (void (*)(void)) (*((uint32_t *) ((FIRMWARE_START + 4)))); __set_MSP(*(__IO uint32_t*) FIRMWARE_START); JumpToApplication(); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 6 августа, 2020 Опубликовано 6 августа, 2020 · Жалоба Для этого есть отладчик. Смотрите всё, начиная с reset'a и до перехода на программу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 2 6 августа, 2020 Опубликовано 6 августа, 2020 · Жалоба Вот мой переход. #define INTERNAL_FLASH_SECTOR_0 FLASH_BASE #define INTERNAL_FLASH_SECTOR_1 (INTERNAL_FLASH_SECTOR_0 + 16_kb) #define INT_FLASH_SIZE (INTERNAL_FLASH_SECTOR_1 + INT_FLASH_OFFSET_SIZE) #define INT_FLASH_CRC (INTERNAL_FLASH_SECTOR_1 + INT_FLASH_OFFSET_CRC32) #define INT_FLASH_START (INTERNAL_FLASH_SECTOR_1 + 4) ... __set_MSP(*(uint *)(INTERNAL_FLASH_SECTOR_1)); SCB->VTOR = INTERNAL_FLASH_SECTOR_1; ((void(*)())(*((uint *)INT_FLASH_START)))(); // Offset 4: firmware length, firmware crc, reset handler Работает отлично Вы не перекидываете вектора прерываний VTOR. Вполне возможно при следующем прерывании вызывается обработчик, которого нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 6 августа, 2020 Опубликовано 6 августа, 2020 · Жалоба 46 минут назад, RadiatoR сказал: Вот мой переход. __set_MSP(*(uint *)(INTERNAL_FLASH_SECTOR_1)); SCB->VTOR = INTERNAL_FLASH_SECTOR_1; ((void(*)())(*((uint *)INT_FLASH_START)))(); // Offset 4: firmware length, firmware crc, reset handler Работает отлично А если у ТС-а процессор в thread-mode работает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 2 6 августа, 2020 Опубликовано 6 августа, 2020 · Жалоба в бутлоадере? Даже если и так, то он предусмотрит это. По крайней мере должен понимать как работать со своей средой... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 6 августа, 2020 Опубликовано 6 августа, 2020 · Жалоба 1 hour ago, RadiatoR said: SCB->VTOR = Это обычно делается в SystemInit() и руками не нужно устанавливать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 2 6 августа, 2020 Опубликовано 6 августа, 2020 · Жалоба Just now, x893 said: Это обычно делается в SystemInit() и руками не нужно устанавливать. В моем случае до замены VTOR проводится обновления FLASH и расчет CRC. Только после совпадения происходит переход. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ichthyandr 0 7 августа, 2020 Опубликовано 7 августа, 2020 · Жалоба Вобщем по первому вопросу всё решилось, для перемещения стартового адреса программы нужно править ld скрипт и в опциях запуска задавать адрес таблицы прерываний. Из под IDE норм работает и в дебаге и в релизе. Основная проблема вот в чем, в загружаемой бутлоадером прошивке перестают работать прерывания, таблица правильная, nvic по ходу не работает. На первом же HAL_Delay прошивка остается навсегда Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 7 августа, 2020 Опубликовано 7 августа, 2020 · Жалоба 21 час назад, x893 сказал: Это обычно делается в SystemInit() и руками не нужно устанавливать. Возможно, в этом и проблема. После перехода из загрузчика в основную прошивку эта функция переопределяет значение VTOR на адрес начало флеш-памяти, т.е. на таблицу векторов загрузчика. А это совсем не то, что требуется для работы прерываний в основной программе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ichthyandr 0 7 августа, 2020 Опубликовано 7 августа, 2020 (изменено) · Жалоба 13 minutes ago, Darth Vader said: Возможно, в этом и проблема. После перехода из загрузчика в основную прошивку эта функция переопределяет значение VTOR на адрес начало флеш-памяти, т.е. на таблицу векторов загрузчика. А это совсем не то, что требуется для работы прерываний в основной программе. там оффсет в прошивке задан, system_stm32f1xx.c: /* #define VECT_TAB_SRAM */ #define VECT_TAB_OFFSET 0x00010000U /*!< Vector Table base offset field. This value must be a multiple of 0x200. */ в SystemInit SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */ м.б. таблицу покорежило, надо смотреть ... таблица правильная, systick хендлер описан верно Изменено 7 августа, 2020 пользователем ichthyandr Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ichthyandr 0 7 августа, 2020 Опубликовано 7 августа, 2020 (изменено) · Жалоба del Изменено 7 августа, 2020 пользователем ichthyandr Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться