Перейти к содержанию
    

Проект для STM32F100 компилируется и линкуется gcc, но не работает на МК

Здравствуйте, я использую gcc тулсет (arm-none-eabi- v4.9), текстовый редактор (Sublime Text 3) и утилиту make. Это мой простой тестовый проект с таким набором ПО.

По факту: проект компилируется, линкуется и я получаю готовый .hex файл. Затем заливаю hex файл в микроконтроллер STM32F100RBT6B (при помощи ST-Link на STM32F1DISCOVERY) и программы STM32 ST-LINK Utility.

Микроконтроллер должен вывести лог. 1 на 8-ю и 9-ю ножки порта C, но этого не происходит. Я грешу на makefile (в свою очередь разобрался с ним, добавил комментарии ко всем операциям и флагам) или скрипт для линковщика.

Прошу помощи в определении причины неработоспособности прошивки.

 

Проект лежит тут (в корне проекта лежат также файлы, получаемые при построении проекта) : ссылка на проект на гитхаб

 

Ниже привожу лог построения проекта:

--- building ARM-test0. defines: -DSTM32F10X_MD_VL -DHSE_VALUE=8000000 -DUSE_STDPERIPH_DRIVER
make clean
make[1]: Entering directory 'D:/4 electronics/soft/Sublime Text projects/ARM-test0'
--- cleaning...
del /f /q .\*.o
del /f /q .\*.d
del /f /q .\*.lst
del /f /q .\*.lss
del /f /q .\*.map
del /f /q .\*.elf
del /f /q .\*.bin
del /f /q .\*.hex
make[1]: Leaving directory 'D:/4 electronics/soft/Sublime Text projects/ARM-test0'
make .\ARM-test0.elf
make[1]: Entering directory 'D:/4 electronics/soft/Sublime Text projects/ARM-test0'
--- compiling stm32f10x_gpio.c...
arm-none-eabi-gcc -c -mcpu=cortex-m3 -mthumb -DSTM32F10X_MD_VL -DHSE_VALUE=8000000 -DUSE_STDPERIPH_DRIVER -I "." -Wa,-adhlns=./stm32f10x_gpio.lst -MD -O1 -g -gdwarf-2 -ffunction-sections -fdata-sections -Wall -Wextra -Wundef -Wcast-align -Winline -o stm32f10x_gpio.o stm32f10x_gpio.c
--- compiling system_stm32f10x.c...
arm-none-eabi-gcc -c -mcpu=cortex-m3 -mthumb -DSTM32F10X_MD_VL -DHSE_VALUE=8000000 -DUSE_STDPERIPH_DRIVER -I "." -Wa,-adhlns=./system_stm32f10x.lst -MD -O1 -g -gdwarf-2 -ffunction-sections -fdata-sections -Wall -Wextra -Wundef -Wcast-align -Winline -o system_stm32f10x.o system_stm32f10x.c
--- compiling core_cm3.c...
arm-none-eabi-gcc -c -mcpu=cortex-m3 -mthumb -DSTM32F10X_MD_VL -DHSE_VALUE=8000000 -DUSE_STDPERIPH_DRIVER -I "." -Wa,-adhlns=./core_cm3.lst -MD -O1 -g -gdwarf-2 -ffunction-sections -fdata-sections -Wall -Wextra -Wundef -Wcast-align -Winline -o core_cm3.o core_cm3.c
--- compiling stm32f10x_rcc.c...
arm-none-eabi-gcc -c -mcpu=cortex-m3 -mthumb -DSTM32F10X_MD_VL -DHSE_VALUE=8000000 -DUSE_STDPERIPH_DRIVER -I "." -Wa,-adhlns=./stm32f10x_rcc.lst -MD -O1 -g -gdwarf-2 -ffunction-sections -fdata-sections -Wall -Wextra -Wundef -Wcast-align -Winline -o stm32f10x_rcc.o stm32f10x_rcc.c
--- compiling main.cpp...
arm-none-eabi-g++ -c -mcpu=cortex-m3 -mthumb -DSTM32F10X_MD_VL -DHSE_VALUE=8000000 -DUSE_STDPERIPH_DRIVER -I "." -Wa,-adhlns=./main.lst -MD -O1 -g -gdwarf-2 -ffunction-sections -fdata-sections -Wall -Wextra -Wundef -Wcast-align -Winline -std=gnu++0x -funsigned-bitfields -fshort-enums -o main.o main.cpp
--- assembling startup_ARMCM3.s...
arm-none-eabi-gcc -c -mcpu=cortex-m3 -mthumb -DSTM32F10X_MD_VL -DHSE_VALUE=8000000 -DUSE_STDPERIPH_DRIVER -I "." -Wa,-adhlns=./startup_ARMCM3.lst -MD -O1 -g -gdwarf-2 -ffunction-sections -fdata-sections -Wall -Wextra -Wundef -Wcast-align -Winline -x assembler-with-cpp -o startup_ARMCM3.o startup_ARMCM3.s
--- linking...
arm-none-eabi-g++ ././stm32f10x_gpio.o ././system_stm32f10x.o ././core_cm3.o ././stm32f10x_rcc.o ././main.o ././startup_ARMCM3.o -mcpu=cortex-m3 -mthumb -Wl,-Map=".\ARM-test0.map",--cref -Wl,--gc-sections -TSTM32F10X_MD_VL.ld -o .\ARM-test0.elf
make[1]: Leaving directory 'D:/4 electronics/soft/Sublime Text projects/ARM-test0'
make .\ARM-test0.hex
make[1]: Entering directory 'D:/4 electronics/soft/Sublime Text projects/ARM-test0'
--- making hex...
arm-none-eabi-objcopy -O ihex .\ARM-test0.elf .\ARM-test0.hex
make[1]: Leaving directory 'D:/4 electronics/soft/Sublime Text projects/ARM-test0'
make .\ARM-test0.lss
make[1]: Entering directory 'D:/4 electronics/soft/Sublime Text projects/ARM-test0'
--- making disassembly...
arm-none-eabi-objdump -dC .\ARM-test0.elf > .\ARM-test0.lss
make[1]: Leaving directory 'D:/4 electronics/soft/Sublime Text projects/ARM-test0'
arm-none-eabi-size -d .\ARM-test0.elf
  text	   data	    bss	    dec	    hex	filename
  1592	   1076	     28	   2696	    a88	.\ARM-test0.elf
"Errors: none"
[Finished in 1.3s]

 

P.S.: я положил все файлы исходников в корень проекта для того что бы исключить возможное "недобавление" какого-то файла в передачу компилятору или ещё что-то. Как прошивка заработает, то раскидаю по папкам как положено.

Изменено пользователем r44083

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, забыл сказать, что использую ОС Windows.

Саму "среду разработки" на основе Sublime Text 3 вы можете скачать тут (она полностью портабельная): Sublime Text для ARM 2015.09.12 win32 (portable) (кнопка на скачивание в правом верхнем углу страницы)

Что бы открыть проект, нужно распаковать папку по ссылке выше и запустить Sublime Text с помощью bat файла в той же папке.

Затем в верхнем меню саблайма: Project -> Open Project -> в папке тестового проекта ARM-test0 (ссылка на гитхаб выше) выбрать и открыть файл ARM-test0.sublime-project

Что бы построить проект нужно нажать Ctrl+B.

Изменено пользователем r44083

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При чём туту sublime text вообще? Вам надо настроить сборку проекта при помощи make. А откуда вы вызываете make - дело десятое.

Поэтому советую - возьмите какой-нибудь тестовый проект целиком, запустите его, а уже потом изменяйте под себя.

Например, вот этот.

(Ваш makefile, похоже, базируется на makefile из этого проекта, так что должно быть несложно).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Затем заливаю hex файл в микроконтроллер STM32F100RBT6B

С железом порядок? Кварц на 8МГц, ножки BOOT со своими уровнями? Есть генерация кварца?

Может, схему покажете?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проект, сделанный в Keil, отлично работает и светодиоды святятся, поэтому я думаю что железо в порядке. Использую плату STM32VLDISCOVERY.

 

При чём туту sublime text вообще? Вам надо настроить сборку проекта при помощи make. А откуда вы вызываете make - дело десятое.

Поэтому советую - возьмите какой-нибудь тестовый проект целиком, запустите его, а уже потом изменяйте под себя.

Например, вот этот.

(Ваш makefile, похоже, базируется на makefile из этого проекта, так что должно быть несложно).

Боюсь что ваш проект не соберется, так как я же указал что использую Windows. Надо будет переделать команды вызова системных утилит ну и много где ещё. В makefile у вас указан скрипт для линковщика, а в папке проекта его нет.

К тому же флаг "LD_FLAGS += -nostartfiles" предпалогает некий свой стартап файл, а его в папке проекта тоже нет, и по всей видимости он наверное у вас нестандартный, а какой-то свой (я имею ввиду не такой как в CMSIS). CMSIS вы, как я понял, тоже не используете?

А по поводу Sublime Text - так я же выше (в первом посте) написал, что использую make в связке с Sublime Text как текстовым редактором. Очень помогло, если бы я действительно нашел такой проект, который собрался бы и заработал, что бы я его изучил.

 

Кстати, Антоха, я брал ваш makefile (в заголовке была подпись АНТОХА), для этого теста, и потом изменял его под винду, добавил для себя комментарии :). Но всё равно никак не заведется прошивка. Я всё таки грешу на makefile. (Начал читать как прикрутить отладчик, что бы посмотреть, что на самом деле делает микроконтроллер)

Изменено пользователем r44083

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Боюсь что ваш проект не соберется, так как я же указал что использую Windows.

Тот проект собирается и под Windows тоже (с msys). Скрипт линковщика лежит рядом, в первом проекте. Стартап - тоже лежит рядом. Этот стартап не из CMSIS, стартап из CMSIS на момент написания примера не был пригоден для c++ (не вызывал конструкторы).

Кстати, вы убрали "LD_FLAGS += -nostartfiles", поэтому у вас линкуется не ваш CMSIS-овский стартап (startup_ARMCM3.s), а тот, что предлагает компилятор. Так что не ждите вызова SystemInit(). Возможно, эти два стартапа конфликтуют, и от этого ваш проект не работает.

 

Кстати, Антоха, я брал ваш makefile (в заголовке была подпись АНТОХА), для этого теста, и потом изменял его под винду, добавил для себя комментарии :).

Я узнал makefile, потому и написал:

(Ваш makefile, похоже, базируется на makefile из этого проекта, так что должно быть несложно).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тот проект собирается и под Windows тоже (с msys). Скрипт линковщика лежит рядом, в первом проекте. Стартап - тоже лежит рядом. Этот стартап не из CMSIS, стартап из CMSIS на момент написания примера не был пригоден для c++ (не вызывал конструкторы).

Кстати, вы убрали "LD_FLAGS += -nostartfiles", поэтому у вас линкуется не ваш CMSIS-овский стартап (startup_ARMCM3.s), а тот, что предлагает компилятор. Так что не ждите вызова SystemInit(). Возможно, эти два стартапа конфликтуют, и от этого ваш проект не работает.

 

 

Я узнал makefile, потому и написал:

Я вас понял, это я наоборот понял значение флага nostartfiles

Ещё хотел спросить: вот я добавил флаг -nostartfiles и передал линковщику стартап файл от CMSIS (для GCC), и при построении проекта в лог выпала ошибка:

--- linking...
arm-none-eabi-g++ ././stm32f10x_gpio.o ././system_stm32f10x.o ././core_cm3.o ././stm32f10x_rcc.o ././main.o ././startup_ARMCM3.o -mcpu=cortex-m3 -mthumb -Wl,-Map=".\ARM-test0.map",--cref -Wl,--gc-sections -TSTM32F10X_MD_VL.ld -nostartfiles -o .\ARM-test0.elf
././startup_ARMCM3.o: In function `Reset_Handler':
D:\4 electronics\soft\Sublime Text projects\ARM-test0/startup_ARMCM3.s:168: undefined reference to `_start'
collect2.exe: error: ld returned 1 exit status

Подобные ошибки (только они касались "__data_start__", "__data_end__", "__end__", "__exidx_start") ранее выпадали в лог построения проекта, до того момента, как я не заменил ваш скрипт для линковщика на тот, что предлагает CMSIS.

Теперь осталась только вышеприведенная ошибка. Похоже на то, что она вызвана тем, что в скрипте (от CMSIS) для линковщика, нигде не фигурирует "_start" на которую ругается GCC при построении проекта. Как можно устранить причину такой ошибки?

Изменено пользователем r44083

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте заменить в startup_ARMCM3.s _start на main.

Откуда вы взяли этот файл? Он очень кривой. Вектора прерываний не те, bss не обнуляется, конструкторы глобальных объектов не вызываются.

Возьмите файл от ST, из StdPeriph_Libj. Причём берите парой - стартап и скрипт линкера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте заменить в startup_ARMCM3.s _start на main.

Откуда вы взяли этот файл? Он очень кривой. Вектора прерываний не те, bss не обнуляется, конструкторы глобальных объектов не вызываются.

Возьмите файл от ST, из StdPeriph_Libj. Причём берите парой - стартап и скрипт линкера.

Представляете, заменил как вы сказали в startup_ARMCM3.s _start на main и заработало. В итоге заменил и стартап и скрипт для линковки на те, что шли в StdPeriphLib 3.5.

Вписал данные о памяти в скрипт для линковщика, и прошивка тоже заработала. Только остался непонятным вопрос о переменной "_estack" в скрипте для линковщика.

Как она считается, просто начальный адрес ОЗУ + длина ОЗУ? Ещё видел такие варианты: _estack = ORIGIN(RAM) + LENGTH(RAM) - 8. И такие: _estack = ORIGIN(RAM) + LENGTH(RAM) - 4.

Правильно ли я вписал _estack тут для STM32F100RBT6B:

/* Memory Spaces Definitions */

MEMORY
{
  RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 8K
  FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 128K
}

/* higher address of the user mode stack */
_estack = 0x20001F40;

Кстати почему в некоторых проектах переменная "_Minimum_Stack_Size = 0x100 ;", а в других (для другого мк) она уже равна: "_Minimum_Stack_Size = 0x144 ;" Из какой документации можно узнать "_Minimum_Stack_Size"?

И что за переменная такая "_estack"? Судя по комментариям в коде это максимальный адрес пользовательского стека, то есть тут идет речь, что максимальный адрес стека не может быть больше чем конец ОЗУ?

Также интересно, что ARM уже выпустила CMSIS версии 3.01, а в StdPeriphLib 3.5 используется CMSIS версии 1.3. Можно ли и нужно ли использовать белее свежую версию? Как поступаете вы?

Изменено пользователем r44083

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну и славно.

_estack - это начальное значение для указателя стека, его вершина. Это значение засовывается на первую позицию таблицы векторов. Поскольку стек растёт вниз, то обычно _estack указывает на конец ОЗУ. А поскольку AAPCS (ARM Architecture Procedure Call Standard) требует, чтобы стек был выровнен на 8 байт, правильным инициализирующим значением в этом случае будет

ALIGN(ORIGIN(RAM) + LENGTH(RAM) - 8 ,8).

Что касаемо _Minimum_Stack_Size - это минимальное место в ОЗУ под стек. Если останется меньше (займёте место переменными и кучей), то линкер заругается.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...