[Решал] загрузчик и метод сборки приложений не Arduino

Staticmem
Вторник 8 мая 2018 г. 1:32
У меня есть "generic_boot20_pb9.Bin "загрузочный загрузчик, установленная на LC Studio STM32F103RBT6.
Чтобы проверить это, я использовал общий пример Blink STM32F103R после изменения светодиодного штифта. Это наносится нормально, и я могу использовать загрузочный загрузчик, чтобы прошить его под Arduino, поэтому, похоже, это работает нормально.

У меня есть программа, которую я написал, которая построена с GCC и использует STM32F10X_STDPERIPH_LIB_V3.5.0 библиотека и драйверы USB, которые они предоставляют. Я могу построить и прошить двоичный файл, используя STM32Flash через последовательный порт или используя ST-Flash через ST-Link, и он мигает и работает нормально. Моя программа использует USB, и при подключении A /Dev /TTYACMX создается устройство.

У меня есть пара вопросов...

Перед тем, как загрузчик передает элемент управления в прошивше? Программа Blink, по -видимому, обладает поддержкой TTYACM в рамках сборки, и я вижу это, но с помощью моего приложения GCC я не вижу своего устройства ttyacm.

Другой вопрос, вероятно, у меня проблема, но я не уверен, что мне нужно сделать. Когда загрузочный загрузчик работает по адресу 0x08000000, Arduino изменяет адрес связывания кода, так что эскизы собираются для другого адреса, когда программист установлен для использования загрузчика загрузчика? Я считаю, что информация по строительству Arduino IDE, которая выводит очень запутанную, настолько сложно узнать, с чего начать смотреть, чтобы увидеть, какой адрес загрузки он использует.

Мое приложение использует файл загрузки линкера "STM32_Flash.Ld ". Внутри этого есть:
/* Specify the memory areas */ MEMORY { FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 128K RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K }

Rogerclark
Вторник 8 мая 2018 г., 4:31
Вам нужно изменить адрес векторной таблицы и основание Flash на

0x8002000

я.e Это не только файл линкера, который необходимо изменить

Staticmem
Вторник 8 мая 2018 г. 6:01
Файл линкера, который я использую, от STM32F10X_STDPERIPH_LIB_V3.5.0 Библиотека.

STM32F10X_STDPERIPH_LIB_V3.5.0/project/stm32f10x_stdperiph_template/truestudio/stm3210b-eval/stm32_flash.лд

Этот линкер-файл является единственным, который, кажется, совместим с моей цепочкой инструментов (Arm-None-Eabi).
/* The startup code goes first into FLASH */ .isr_vector : { . = ALIGN(4); KEEP(*(.isr_vector)) /* Startup code */ . = ALIGN(4); } >FLASH

Rogerclark
Вторник 8 мая 2018 г., 6:03
Адрес векторной таблицы где -то совершенно другое в SPL.

Просто используйте свой редактор для поиска вектора, он должен что -то найти, и он, вероятно, будет установлен на 0x8000000

Staticmem
Вторник 8 мая 2018 г. 8:04
Был в этом весь день и никуда не добраться.

Я могу найти много совпадений для вектора, используя GREP, но единственные, которые я вижу, имеют смысл в каком -либо смысле ».LSL «Файлы, такие как STM32F10X_STDPERIPH_TEMPLATE/HITOP/STM3210B-EVAL/STURTS/STM32F10X_MD.LSL

Там есть:
#ifndef __VECTOR_TABLE_ROM_ADDR # define __VECTOR_TABLE_ROM_ADDR 0x08000000 #endif

Эдогальдо
Вторник 8 мая 2018 г. 8:06 утра
Как правило, у вас должен быть -dvect_tab_addr = 0x8002000 (или что -то подобное) в команде компилятора.

Редактировать: я бы сказал -d__vector_table_rom_addr = 0x08002000 для SPL

Staticmem
Вторник 8 мая 2018 г. 8:43 утра
[Эдогальдо - Вторник 8 мая 2018 г. 8:06 утра] - Как правило, у вас должен быть -dvect_tab_addr = 0x8002000 (или что -то подобное) в команде компилятора.

Редактировать: я бы сказал -d__vector_table_rom_addr = 0x08002000 для SPL
Но разве это не для того, чтобы просто определить значение для исходных файлов, чтобы использовать? Вся идея линкера, которую, как я думал, заключалась в том, чтобы объединить скомпилированный код LIB для выполнения по конкретному адресу, так что должна быть просто выпуск линкера.

Эдогальдо
Вторник 8 мая 2018 12:13
Хорошо, как я вижу, ядро ​​STM32Duino использует разные .LD -файлы для перезабоченности кода; я.эн. Доски.TXT для варианта Maple Mini (с новой опцией загрузчика) используется: mapleMini.menu.bootloader_version.bootloader20.build.ldscript=ld/bootloader_20.ld

Staticmem
Вторник 8 мая 2018 12:34
Эдогальдо написал: Память
{
ОЗУ (RWX): Origin = 0x20000000, длина = 20K
ROM (RX): Origin = 0x08002000, длина = 120K
}

Эдогальдо
Вторник 8 мая 2018 г. 13:02
мммм...
Я смотрю на SPL_F1 V. 3.5.0 И я не могу найти никакого определения для __VECTOR_TABLE_ROM_ADDR..
Вместо этого я вижу: #define VECT_TAB_OFFSET 0x0 /*!< Vector Table base offset field. This value must be a multiple of 0x200. */ [...] #ifdef VECT_TAB_SRAM SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */ #else SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */ #endif [...]

Staticmem
Вторник 8 мая 2018 г. 13:38
[Эдогальдо - Вторник 8 мая 2018 г. 13:02] - мммм...
Я смотрю на SPL_F1 V. 3.5.0 И я не могу найти никакого определения для __VECTOR_TABLE_ROM_ADDR..
$ CD STM32F10X_STDPERIPH_LIB_V3.5.0
$ grep -r __vector_table_rom_addr *

118 совпадений найдены.

Эдогальдо
Вторник 8 мая 2018 г. 13:55
Хорошо, в любом случае, это кажется посвященным Hitop IDE, которая, кажется, старая IDE.

РЕДАКТИРОВАТЬ: В разделе примеров NVIC есть пример перемещения векторной таблицы..

Rogerclark
Вторник 8 мая 2018 г. 8:43 вечера
КСТАТИ.

Вам не нужно менять базовый адрес ОЗУ, он’S только для очень старого загрузчика Maple, который поддерживает загрузку в ОЗУ

Эта опция была удалена в загрузчике STM32Duino, и эта оперативная память была бесплатной’заправить и отдать на эскиз приложения

Staticmem
Ср. 09 мая 2018 г. 1:53
[Эдогальдо - Вторник 8 мая 2018 г. 13:55] - Хорошо, в любом случае, это кажется посвященным Hitop IDE, которая, кажется, старая IDE.

РЕДАКТИРОВАТЬ: В разделе примеров NVIC есть пример перемещения векторной таблицы..
(Редактировать Hitop -> Файл загрузки TrueStudio) был единственным, который будет работать для меня без каких -либо изменений, так как я думаю, что он использовал стандартные файлы загрузки GCC, где, как и другие, кажется, там делают это, и/или различные цепочки инструментов.

РЕДАКТИРОВАТЬ: НЕТ «HITOP» был Fluestudio Load Files, которые работали из коробки для меня.

Я иду в память, как это было 7 лет назад, и я никогда не использовал ни одного из IDE, и только в последнее время использовал Arduino, но не для этого проекта. Я не думаю, что ST когда -либо поставлял примеры построения командной строки, поэтому мне пришлось выработать все свои собственные make -файлы, чтобы соответствовать использованию командной строки GCC.

@Rogerclark: отметил!

Я сделаю еще один ход сегодня. Я действительно хочу получить опцию загрузчика даже 7 лет назад.

Staticmem
Ср 09 мая 2018 г., 3:21
Эдогальдо написал: РЕДАКТИРОВАТЬ: В разделе примеров NVIC есть пример перемещения векторной таблицы..

Staticmem
Ср 9 мая 2018 г., 4:03
Я думаю, что сейчас работает. Частью проблемы была мой тестовый код, который я добавил в флеш -светодиоды, я не инициализировал прерывание таймера.
До сих пор единственное изменение было в файле нагрузки: Flash (RX): Origin = 0x08002000, длина = 128K-8K

Я отмечу эту ветку как [решен] позже, после того, как я прошел еще несколько тестирования.

Staticmem
Ср 09 мая 2018 г., 5:50 утра
Staticmem написал:Я отмечу эту ветку как [решен] позже, после того, как я прошел еще несколько тестирования.

Rogerclark
Ср. 09 мая 2018 г., 5:54
Да

Посмотрите в ядре Libmaple, вы должны поместить PA12 в режим GPIO и поднять его высоко или низко (я не могу вспомнить, что), что -то вроде 500US

Это взлом, а не официальный способ навязать перечисление, но обычно он работает

Эдогальдо
Ср 9 мая 2018 г., 5:55 утра
До сих пор единственное изменение было в файле нагрузки: Flash (RX): Origin = 0x08002000, длина = 128K-8K Вы также заметили #define VECT_TAB_OFFSET 0x3000

Staticmem
Чт 10 мая 2018 г., 4:33
Эдогальдо написал: Вы также заметили #define VECT_TAB_OFFSET 0x3000

Rogerclark
Чт 10 мая 2018 г., 4:34
Прохладный