В HTML      В PDF
микроэлектроника, микросхема, микроконтроллер, память, msp430, MSP430, Atmel, Maxim, LCD, hd44780, t6963, sed1335, SED1335, mega128, avr, mega128  
  Главная страница > Статьи > Средства разработки

реклама

 
радиационно стойкие ПЗУ Миландр

Продажа силового и бронированного кабеля и провода в Москве

текст еще



Реальная программа

В этом примере скомпилируем и скомпонуем один из примеров программы, поставляемый в составе пакета программ для демонстрационной платы, "STM32VLDISCOVERY firmware package". STMicroelectronics как-то не жалует GCC, например у Atmel имеется серия примеров компиляции проектов для GCC. Демонстрационные проекты Atmel могут собираться из командной строки средствами GCC, а большинство демонстрационных проектов STM рассчитаны на коммерческие среды разработки.

В составе демо пакета имеется набор файлов стандарта CMSIS и файлы библиотеки SPL (Standard peripherial library).

CMSIS - стандарт программного интерфейса микроконтроллеров с ядром Cortex. Этот стандарт разрабатывает и продвигает компания ARM, существует несколько версий и стандарт продолжает развиваться. В использованном в примере пакете, версия CMSIS 1.30.

Стартовая программа должна соответствовать некоторым требованиям, предъявляемым к ней стандартом CMSIS. Названия системных исключений должны соответствовать CMSIS. Инициализация аппаратуры микроконтроллера (в том числе настройка синхронизации), выполняется функцией SystemInit() , из состава CMSIS.

Средства CMSIS предоставляют сервисы базового уровня, эти сервисы используют средства SPL.

Стартовый код на ассемблере, из предыдущих примеров необходимо доработать. Произвольные названия векторов прерывания, нужно изменить на стандартные названия. Ниже приведён образец системного исключения по сбросу:

	
.word Reset_Handler + 1
	 

Обработчик по сбросу задан в стартовом коде и ни где в программе не должен встречаться. Для обработчиков прочих системных исключений, применяется специальная техника. Кроме как в стартовом коде, обработчик может быть описан в другом модуле, с большим приоритетом. После компиляции, обработчики в стартовом коде будут игнорироваться, а реально выполняться обработчики, реализованные в другом модуле. Для этого существует ассемблерная директива .weak. Символ после этой директивы будет "слабым". Если в другом модуле будет объявлен символ с таким же именем, то "слабый" символ "проиграет", этот символ будет игнорироваться. Конечно, можно реализовать обработчик на ассемблере в тексте стартового модуля. В примере, обработчик NMI объявлен таким образом:

	
        .word    NMI_Handler + 1
        .weak    NMI_Handler
        .thumb_set NMI_Handler,Default_Handler
	

Символ NMI_Handler , задан как "слабый". Директива .thumb_set специфична для ARM. Эта директива сообщает, что NMI_Handler - это адрес функции Thumb и его значение равно значению символа Default_Handler. А обработчик Default_Handler - это простейшая ловушка цикл.

В библиотеке SPL обработчики прерываний вынесены в отдельный файл stm32f10x_it.c. Если этот файл скомпилировать и скомпоновать с остальными модулями, то будут действовать обработчики из этого файла, а обработчики стартового кода будут игнорироваться.

Ещё одно изменение, это необходимость вызова SystemInit() . Можно вызывать эту функцию из стартового кода, а можно из функции main. Если вызывать из стартового кода, перед вызовом main, нужно вызвать SystemInit().

Структура каталогов проекта:

	
|-- Libraries
|   |-- CMSIS
|   |   |-- CM3
|   |       |-- CoreSupport
|   |       |-- DeviceSupport
|   |           |__ ST
|   |               |__ STM32F10x
|   |-- STM32F10x_StdPeriph_Driver
|       |__ inc
|       |__ src
|-- Obj
|   |__ main.o
|   |__ misc.o
|   |__ stm32f10x_exti.o
|   |__ stm32f10x_flash.o
|   |__ stm32f10x_gpio.o
|   |__ stm32f10x_it.o
|   |__ stm32f10x_rcc.o
|   |__ STM32vldiscovery.o
|   |__ st.o
|   |__ system_stm32f10x.o
|-- Src
|   |__ main.c
|   |__ main.h
|   |__ stm32f10x_conf.h
|   |__ stm32f10x_it.c
|   |__ stm32f10x_it.h
|   |__ st.s
|__ Utilities
|__ l.ld
|__ lnk.sh
|__ main.bin
|__ main.elf
|__ mk.sh 
 

Каталоги /Libraries и /Utilities скопированы без изменений из демо пакета. Из подкаталога /Project/Examples/RCC , файлы примеров скопированы в каталог Src.

Для удобства компиляции файлов демо проекта, я написал скрипт командного интерпретатора bash. Вот его текст:

	
#!/bin/bash

INCL="-ILibraries/CMSIS/CM3/CoreSupport/ \
-ILibraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x \
-ILibraries/STM32F10x_StdPeriph_Driver/inc \
-IUtilities \
-ISrc"

MACROS="-DSTM32F10X_MD_VL -DUSE_STDPERIPH_DRIVER"
OPT="-O0"
DEBUG="-g"
CFLAGS=" -mcpu=cortex-m3 -mthumb -fno-common  $OPT $DEBUG"
 echo "compiling st.s"
    arm-none-eabi-gcc $CFLAGS $INCL -c ./Src/st.s -o ./Obj/st.o
 echo "compiling system_stm32f10x.c"
  arm-none-eabi-gcc $MACROS  $CFLAGS \
  $INCL -c ./Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.c \
       -o ./Obj/system_stm32f10x.o
 echo "compilimg stm32f10x_it.c"
    arm-none-eabi-gcc $MACROS $CFLAGS \
    $INCL -c ./Src/stm32f10x_it.c -o ./Obj/stm32f10x_it.o
 echo "compiling main.c"
    arm-none-eabi-gcc $MACROS $CFLAGS $INCL -c ./Src/main.c -o ./Obj/main.o
 echo "compiling STM32vldiscovery.c"
    arm-none-eabi-gcc $MACROS $CFLAGS \
    $INCL -c ./Utilities/STM32vldiscovery.c -o ./Obj/STM32vldiscovery.o
 echo "compiling stm32f10x_gpio.c"
   arm-none-eabi-gcc $MACROS $CFLAGS \
   $INCL -c ./Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_gpio.c\
   -o ./Obj/stm32f10x_gpio.o
 echo "compiling stm32f10x_flash.c"
   arm-none-eabi-gcc $MACROS $CFLAGS \
   $INCL -c ./Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_flash.c \
   -o ./Obj/stm32f10x_flash.o
 echo "compilig stm32f10x_rcc.c"
    arm-none-eabi-gcc $MACROS $CFLAGS \
    $INCL -c ./Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rcc.c \
    -o ./Obj/stm32f10x_rcc.o
 echo "compiling stm32f10x_exti.c"
   arm-none-eabi-gcc $MACROS $CFLAGS \
   $INCL -c ./Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_exti.c\
   -o ./Obj/stm32f10x_exti.o
 echo "compiling misc.c"
   arm-none-eabi-gcc $MACROS $CFLAGS \
   $INCL -c ./Libraries/STM32F10x_StdPeriph_Driver/src/misc.c -o ./Obj/misc.o
		 

Одно замечание. Для управления процессом компиляции и сборки программ, имеется ряд специализированных утилит, самая известная из них, это make. Но в некоторых случаях, можно обходиться и скриптом командного интерпретатора. К тому же, при использовании скрипта, становится понятнее процесс сборки программ, и яснее назначение программы make.

Скрипт компилирует файлы проекта, запуская компилятор с нужными параметрами. Для удобства, параметры компиляции сохраняются в переменных, которые подставляются в команды. Опция -I указывает компилятору имя каталога для поиска включаемых в программу заголовочных файлов. Несколько путей поиска, хранится в переменной INCL. Опция -D, позволяет задать макрос в командной строке вызова компилятора. Точно так же, как если бы код программы содержал соответствующую директиву макроопределения. Эта опция широко применяется для управления процессом компиляции из командной строки. В примере, макрос STM32F10X_MD_VL указывает конкретный тип микроконтроллера, для которого будет компилироваться код. Значения подобных макросов обычно даются в описании библиотеки, либо получаются путём анализа исходного текста. Проверка значения макроса выполняется в файле stm32f10x.h из состава CMSIS. Макрос USE_STDPERIPH_DRIVER , указывает, что в программе будут использоваться библиотеки SPL. Значение этого макроса проверяется в том же файле stm32f10x.h. Важным является файл stm32f10x._conf.h , посредством этого файла включаются заголовочные файлы библиотек. В файле STM32vldiscovery.c , функции специфичные для демо платы.

Оптимизация кода отключена и указано, что нужно добавлять информацию для отладчика. Если не требуется отладка программы, то оптимизацию можно включить, флаг "-O2" или "-Os". А флаг "-g" опустить вовсе. После успешной компиляции, в каталоге Obj обнаружится набор объектных файлов.

Для компоновки и создания двоичного образа применяется отдельный командный файл :

	
 #!/bin/bash
echo  "Linking"
arm-none-eabi-gcc -nostdlib -mcpu=cortex-m3 -mthumb -mlittle-endian -Tl.ld \
   -o main.elf \
   ./Obj/st.o \
   ./Obj/system_stm32f10x.o \
   ./Obj/stm32f10x_it.o \
   ./Obj/main.o \
   ./Obj/misc.o \
   ./Obj/stm32f10x_flash.o \
   ./Obj/stm32f10x_gpio.o \
   ./Obj/stm32f10x_rcc.o \
   ./Obj/stm32f10x_exti.o \
   ./Obj/STM32vldiscovery.o 
echo  "make bin"
arm-none-eabi-objcopy -O binary main.elf main.bin
		 

Опция -nostdlib запрещает подключение стандартных библиотек, из имеющихся в составе инструментария. После загрузки бинарного файла в микроконтроллер, светодиоды на плате должны мигать. Самодельный стартовый модуль оказался вполне работоспособен, так же как и скрипт компоновщика.

<-- Предыдущая страница Оглавление Следующая страница -->





 
Впервые? | Реклама на сайте | О проекте | Карта портала
тел. редакции: +7 (495) 514 4110. e-mail:info@eust.ru
©1998-2016 ООО Рынок Микроэлектроники