скрытое меню

Старт программы на STM32

Предлагаю разобраться с этим вопросом раз и навсегда. Использовать будем как обычно Atollic True Studio, по причине ее абсолютной бесплатности и открытости, и контроллер , который просто попался под руку : STM32F205.

Чтобы начать понимать старт контроллера надо отладчиком в самом начале , в самой первой команде как-то остановиться :

метка ResetHandler файла startupxxxxxx.s

фотка 1

Кто-то устанавливает PC (program counter) счетчик команд контроллера сначала в 0x080111ED . Адрес этот может меняться от кода, компоновки и много чего еще.

Но кто же этот волшебник, который устанавливает начальный PC? Отладчиком нам туда не достучаться.

Есть такой (дилетантский) способ через LD скрипты компоновщика (см. LD файл) определить две области (два региона) FLASH для хранения кода и постепенно переносить весь код в ld во второй регион (FLASH2 у нас ).

MEMORY
{
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 128K
FLASH1 (rx)      : ORIGIN = 0x8000000, LENGTH = 64K
FLASH2 (rx)      : ORIGIN = 0x8010000, LENGTH = 940K
}

И выяснится, что можно ВСЕ перенести в регион FLASH2 ( у нас начинается с 0х8010000) КРОМЕ таблицы векторов прерываний isr_vector.

Таблица векторов прерываний пока у нас располагается по умолчанию с адреса 0х00000000. Видим это в list генерируемым True Studio :

 *(.isr_vector)
 .isr_vector    0x08000000      0x184 startup\startup_stm32f205xx.o
                0x08000000                g_pfnVectors
                0x08000184                . = ALIGN (0x4)

Тут мы однозначно понимаем, что исходный код таблицы векторов прерываний находится в файле startup_stm32f205xx.o.

В коде файла startup создается таблица векторов прерываний.

Перенесем в компоновщике LD все области во регион FLASH2 , в том числе и таблицу векторов прерываний.

Посмотреть собранную прошивку лучше просто в результирующем HEX файле прошивки (и не в коем случае НЕ в BIN):

фотка 1

ED 11 01 08 или наоборот : 08 01 11 ED . Ага второй элемент 4 битовых значений таблицы это и есть наш адрес 0x080111ED .

Так вот такая программа никогда работать не будет потому , что контролер ВСЕГДА СНАЧАЛА обращается к адресу 0х08000000 и адресу 0х08000004 (где лежит адрес перехода на реально первую инструкцию кода Reset_Handler). А у нас прошивка начинается сразу с адреса 0х8010000 и мы туда никогда не попадем с такой программой.

А может ли таблица векторов прерываний отсутствовать с адреса 0х8000000?

Получается это невозможно!

Но с другой стороны можно сделать еще одну таблицу векторов прерываний в другом месте и переключится на нее. Но главное , что по адресу 0х8000000 ДОЛЖНА БЫТЬ таблица векторов прерываний (по крайней мере первые два элемента таблицы).

Как это сделать на ассемблере в startup файле или на С в main.c читайте на соседней странице.