r44083 0 13 сентября, 2015 Опубликовано 13 сентября, 2015 (изменено) · Жалоба Здравствуйте, я использую 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.: я положил все файлы исходников в корень проекта для того что бы исключить возможное "недобавление" какого-то файла в передачу компилятору или ещё что-то. Как прошивка заработает, то раскидаю по папкам как положено. Изменено 13 сентября, 2015 пользователем r44083 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
r44083 0 13 сентября, 2015 Опубликовано 13 сентября, 2015 (изменено) · Жалоба Кстати, забыл сказать, что использую ОС 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. Изменено 13 сентября, 2015 пользователем r44083 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 13 сентября, 2015 Опубликовано 13 сентября, 2015 · Жалоба При чём туту sublime text вообще? Вам надо настроить сборку проекта при помощи make. А откуда вы вызываете make - дело десятое. Поэтому советую - возьмите какой-нибудь тестовый проект целиком, запустите его, а уже потом изменяйте под себя. Например, вот этот. (Ваш makefile, похоже, базируется на makefile из этого проекта, так что должно быть несложно). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 10 13 сентября, 2015 Опубликовано 13 сентября, 2015 · Жалоба Затем заливаю hex файл в микроконтроллер STM32F100RBT6B С железом порядок? Кварц на 8МГц, ножки BOOT со своими уровнями? Есть генерация кварца? Может, схему покажете? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
r44083 0 13 сентября, 2015 Опубликовано 13 сентября, 2015 (изменено) · Жалоба Проект, сделанный в Keil, отлично работает и светодиоды святятся, поэтому я думаю что железо в порядке. Использую плату STM32VLDISCOVERY. При чём туту sublime text вообще? Вам надо настроить сборку проекта при помощи make. А откуда вы вызываете make - дело десятое. Поэтому советую - возьмите какой-нибудь тестовый проект целиком, запустите его, а уже потом изменяйте под себя. Например, вот этот. (Ваш makefile, похоже, базируется на makefile из этого проекта, так что должно быть несложно). Боюсь что ваш проект не соберется, так как я же указал что использую Windows. Надо будет переделать команды вызова системных утилит ну и много где ещё. В makefile у вас указан скрипт для линковщика, а в папке проекта его нет. К тому же флаг "LD_FLAGS += -nostartfiles" предпалогает некий свой стартап файл, а его в папке проекта тоже нет, и по всей видимости он наверное у вас нестандартный, а какой-то свой (я имею ввиду не такой как в CMSIS). CMSIS вы, как я понял, тоже не используете? А по поводу Sublime Text - так я же выше (в первом посте) написал, что использую make в связке с Sublime Text как текстовым редактором. Очень помогло, если бы я действительно нашел такой проект, который собрался бы и заработал, что бы я его изучил. Кстати, Антоха, я брал ваш makefile (в заголовке была подпись АНТОХА), для этого теста, и потом изменял его под винду, добавил для себя комментарии :). Но всё равно никак не заведется прошивка. Я всё таки грешу на makefile. (Начал читать как прикрутить отладчик, что бы посмотреть, что на самом деле делает микроконтроллер) Изменено 13 сентября, 2015 пользователем r44083 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 13 сентября, 2015 Опубликовано 13 сентября, 2015 · Жалоба Боюсь что ваш проект не соберется, так как я же указал что использую Windows. Тот проект собирается и под Windows тоже (с msys). Скрипт линковщика лежит рядом, в первом проекте. Стартап - тоже лежит рядом. Этот стартап не из CMSIS, стартап из CMSIS на момент написания примера не был пригоден для c++ (не вызывал конструкторы). Кстати, вы убрали "LD_FLAGS += -nostartfiles", поэтому у вас линкуется не ваш CMSIS-овский стартап (startup_ARMCM3.s), а тот, что предлагает компилятор. Так что не ждите вызова SystemInit(). Возможно, эти два стартапа конфликтуют, и от этого ваш проект не работает. Кстати, Антоха, я брал ваш makefile (в заголовке была подпись АНТОХА), для этого теста, и потом изменял его под винду, добавил для себя комментарии :). Я узнал makefile, потому и написал: (Ваш makefile, похоже, базируется на makefile из этого проекта, так что должно быть несложно). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
r44083 0 13 сентября, 2015 Опубликовано 13 сентября, 2015 (изменено) · Жалоба Тот проект собирается и под 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 при построении проекта. Как можно устранить причину такой ошибки? Изменено 13 сентября, 2015 пользователем r44083 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 14 сентября, 2015 Опубликовано 14 сентября, 2015 · Жалоба Попробуйте заменить в startup_ARMCM3.s _start на main. Откуда вы взяли этот файл? Он очень кривой. Вектора прерываний не те, bss не обнуляется, конструкторы глобальных объектов не вызываются. Возьмите файл от ST, из StdPeriph_Libj. Причём берите парой - стартап и скрипт линкера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
r44083 0 14 сентября, 2015 Опубликовано 14 сентября, 2015 (изменено) · Жалоба Попробуйте заменить в 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. Можно ли и нужно ли использовать белее свежую версию? Как поступаете вы? Изменено 14 сентября, 2015 пользователем r44083 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 14 сентября, 2015 Опубликовано 14 сентября, 2015 · Жалоба Ну и славно. _estack - это начальное значение для указателя стека, его вершина. Это значение засовывается на первую позицию таблицы векторов. Поскольку стек растёт вниз, то обычно _estack указывает на конец ОЗУ. А поскольку AAPCS (ARM Architecture Procedure Call Standard) требует, чтобы стек был выровнен на 8 байт, правильным инициализирующим значением в этом случае будет ALIGN(ORIGIN(RAM) + LENGTH(RAM) - 8 ,8). Что касаемо _Minimum_Stack_Size - это минимальное место в ОЗУ под стек. Если останется меньше (займёте место переменными и кучей), то линкер заругается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
r44083 0 14 сентября, 2015 Опубликовано 14 сентября, 2015 · Жалоба И последний вопрос: нужно ли делать "Full chip erase" перед тем, как прошить STM? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 15 сентября, 2015 Опубликовано 15 сентября, 2015 · Жалоба Если прошивается без этого, то не надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться