Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: как сместить программу на адрес 0x08002000
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
viakon
Есть проект для STM32 под Eclipse. Пока в скрипте линкера stm32f100rb_flash.ld строка
FLASH (rx) : ORIGIN = 0x08000000

программа работает
стоит изменить на ORIGIN = 0x08002000
все престает работать. После загрузки проги в контроллер первый же шаг в отладчике выкидывает куда-то в середину тела проги. кроме этого приходится перезагружать openOCD.
До NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000); даже не доходит где-то раньше проблема возникает.
Непомнящий Евгений
Даташит читали?
По адресу 8000000 должны лежать как минимум 8 байт - начальный адрес стека и начальный адрес программы.
Если вы хотите сместить программу, то эти 8 байт все равно должны быть. Кроме того, надо не забыть перенастроить смещение таблицы прерываний (VTOR по моему)
viakon
Цитата(Непомнящий Евгений @ Sep 11 2012, 12:42) *
Даташит читали?
По адресу 8000000 должны лежать как минимум 8 байт - начальный адрес стека и начальный адрес программы.
Если вы хотите сместить программу, то эти 8 байт все равно должны быть. Кроме того, надо не забыть перенастроить смещение таблицы прерываний (VTOR по моему)


про стек можно поподробнее я только переход там положил
Непомнящий Евгений
первые 4 байта - начальный адрес стека
вторые 4 байта - начальный адрес программы

Очень рекомендую PM0056 STM32F10xxx/20xxx/21xxx/L1xxxx Cortex-M3 programming manual
viakon
дело похоже вот в чем:
в окне консоли в Eclipse я вижу

Loading section .bload, size 0x34 lma 0x8000000
Loading section .isr_vector, size 0x1d0 lma 0x8002000
Loading section .text, size 0x10cf8 lma 0x80021d0
Loading section .bootprg, size 0x6c lma 0x8012ec8
Loading section .data, size 0x40 lma 0x8012f34
Loading section .string, size 0x94 lma 0x8012f74
Loading section .configuration, size 0x508 lma 0x801e000
Start address 0x800ad7c, load size 70980
Transfer rate: 24 KB/sec, 6452 bytes/write.
никаких сообщений об ошибках

а в консоли openOCD

Info : Padding image section 0 with 8140 bytes
Info : Padding image section 1 with 45048 bytes
Error: corrupted fifo read pointer 0x20000000

реально же грузится только секция .bload и все.

если секцию .bload поместить в общую кучу, то прога грузится нормально с 0x08002000 и работатет.
MBR
Как ни крути, но там два таргета получается: FLASH с таблицей векторов и FLASH2, с ремапленной программой. Нужно дополнительный блок в .ld вписывать, а не просто адрес менять.
_Артём_
Цитата(viakon @ Sep 11 2012, 09:37) *
Есть проект для STM32 под Eclipse. Пока в скрипте линкера stm32f100rb_flash.ld строка
FLASH (rx) : ORIGIN = 0x08000000

программа работает
стоит изменить на ORIGIN = 0x08002000
все престает работать. После загрузки проги в контроллер первый же шаг в отладчике выкидывает куда-то в середину тела проги. .

Тут как мне кажется нужно две программы писать:
1) распологается с адреса 0x08000000
на выходе делает что-то типа такого
Код
typedef void (*ISRPtr) (void);
void StartSecondProgram()
{
    __set_MSP(*(uint32_t *)0x08002000);
    ISRPtr application_reset_handler=(ISRPtr)(*(uint32_t *)0x08002004);
    application_reset_handler();
}

2) вторая просто смещена на адрес 0x08002000

viakon
В общем разобрался добавил секцию .ld файл

.bload :
{
. = ALIGN(4);
*(.bload)
*(.bootwrite)
*(.bootprg)
*(.string)
. = ALIGN(0x2000);
} >FLASH

в результате все работает
пробовал помещать бутлоадер не в раздел FLASH тут же возникли проблемы с отладкой. при загрузке программы в контроллер происходит попытка записи в область 0x06000000, что приводит сбою в обмене по SWD. Возможно это баг openOCD.

помимо этого еще в скрипте stm32f1x.cfg пришлось установить

set _WORKAREASIZE 0x2000

было set _WORKAREASIZE 0x4000 опять же была попытка записи в память которой нет и сбой в обмене по SWD

MBR
что-то мне говорит, что причина может быть в инициализированных данных, которые попадают не в ту секцию. Постите тогда уж весь ld, а то гадание на кофейной гуще.
viakon
Цитата(MBR @ Sep 12 2012, 12:24) *
что-то мне говорит, что причина может быть в инициализированных данных, которые попадают не в ту секцию. Постите тогда уж весь ld, а то гадание на кофейной гуще.

Проблема решена, может не совсем по правилам, но решена. Когда появится свободное время, покопаюсь поглубже.
viakon
решение здесь http://electronix.ru/forum/index.php?showtopic=106283

теперь секции нормально грузятся куда надо
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.