К сожалению, предыдущий пост оказался ошибочный. В реале, линкер вставлял код бинарника совсем не туда куда хотелось, а работало потому что код загрузчика уже был прописан ранее. После полного стирания чипа, разумеется, все перестало работать.
Пришел к другому варианту инжектирования кода бинарника в код проекта, только пришлось использовать дополнительную утилиту конвертирования bin в массив данных asm.
Сам же код trampoline_uc3.s82 выглядит следующим образом:
Код
#include "trampoline_uc3.h"
RSEG SSTACK:DATA:NOROOT(2)
// This must be linked @ 0x80000000 if it is to be run upon reset.
RSEG RESET:CODE:NOROOT(1)
PUBLIC __trampoline
__trampoline:
// Здесь был переход на собственнй код:
//rjmp program_start
//...теперь вставлен код бутлоадера DFU:
#include "at32uc3a3-isp.s82"
ORG PROGRAM_START_OFFSET
program_start:
// Initialize the stack pointer.
lddpc sp, ??SPS
// Jump to the C runtime startup routine.
lddpc pc, ??cmain
// Constant data area.
ALIGN 2
??SPS:
DC32 SFE(SSTACK) & ~3
EXTERN ?main
??cmain:
DC32 ?main
END
где файл at32uc3a3-isp.s82 получен путем конвертирования:
bin2asm.exe at32uc3a3-isp.bin at32uc3a3-isp.s82В настройках проекта для линкера также указывается точка входа в код:
Entry symbol имеет значение
__trampolineЖелаю всем успехов!
Прикрепленные файлы
bin2asm.7z ( 64.6 килобайт )
Кол-во скачиваний: 38