Pingvin писал(а):
Потестил ваш бутлоадер на Армаде - работает!
Красиво грамотно все оформлено - прям академически, молодцом!
Шьётся бинарик быстрее, чем HEX.
Но я хочу разобраться - в чем проблема с моим, который тоже в конце флеша располагается.
Вроде все тоже самое делал для запуска прошивки (кроме HAL_Deinit()), и прошивка стартовала и работала, кроме настрой к Блютус модуля.
Странно...
И такой вопрос - как задать другое расположение вашему загрузчику?
Хочу повыше поднять.
Только в скрипте линкера переопределить FLASH и FLASH_SIZE?
Возможно не работает USART из-за того, что использует прерывания, а таблица не перенесена корректно в новое место, и контроллер ищет вначале флеша.
Я выше не правильно написал: прерывания у моего загрузчика есть. Они необходимы, например, для USB. Перенос таблицы прерываний внутри SystemInit:
Код:
#define VECT_TAB_OFFSET ((uint32_t) &_isr_real - 0x8000000)
...
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;
&_isr_real определена внутри линкер-скрипта. Уже забыл с тех пор, как писал код)
Расположение кода можно менять тут:
Код:
MEMORY
{
/*FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 512K*/ - ну эта строчка закомменчена, она ничего не делает
INTERRUPTS_STUB (rx) : ORIGIN = 0x8000000, LENGTH = 4K - сюда кладется заглушка для таблицы прерываний, которая при запуске без прошивки передаёт управление загрузчику. После первой прошивки эта страница перезапишется.
FREE_SPACE (rx) : ORIGIN = 0x8001000, LENGTH = 462K - это свободное место, куда будет зашиваться программа
FLASH (rx) : ORIGIN = 0x8074800, LENGTH = 44K - вот отсюда начинается загрузчик. Можно подвинуть, главное не забыть исправить LENGTH у этой и предыдущей секции
STATE (rx) : ORIGIN = 0x807F800, LENGTH = 2K - это - страница состояния загрузчика, типа как eeprom. К сожалению, меньше 2кб нельзя сделать...
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K - это не нужно менять, начало ОЗУ
}
Только сильно ужать не получится. Много место занимает USB и Fat