Видео ролики бесплатно онлайн

Смотреть мама и сын видео

Официальный сайт ysaa 24/7/365

Смотреть видео бесплатно

23.08.2011 21:37

h0rr0rr_drag0nПрограммируем STM32VLDiscovery в Linux'е и только в Linux'е!

Подобно многим любителям садистски потыкать раскаленным паяльником в нежные внутренности электронных девайсов я не избежал увлечения микроконтроллерами серии STM32 от STMicroelectronics, за их небольшую цену прозванные "убийцами" 8/16-битных микроконтроллеров, таких как AVR.
Поскольку основной операционной системой на моем компьютере является Линукс, а альтернативных операционных систем на нем нет и не предвидится, то встал вполне естественный вопрос - чем собирать программы под STM32 и чем их прошивать в имеющуюся у меня STM32VLDiscovery? Иначе говоря передо мной встал вопрос инструментального обеспечения.
Большинство руководств, найденных мною в Интернете, либо советовали перезагружаться в Windows, либо использовать утилиту stm32flash, которая прошивает кристалл при помощи встроенного bootloader'а через UART. При всем при этом, в некоторых руководствах еще и предлагалось немного пошаманить с состоянием выводов BOOT0 и BOOT1 или использовать такие громоздкие среды разработки как Eclipse.
Мне все вышеперечисленное показалось крайне неприемлемым и я стал искать свой способ работы с STM32VLDiscovery под Linux'ом. Результаты моих изысканий приведены далее, под катом.

Инструментальная цепочка

В деле программирования я предпочитаю минимализм - мне достаточно текстового редактора (хорошего текстового редактора, такого как vim или emacs), компилятора и утилиты make, которая будет собирать мой исходный код и мои инструментальные средства в один проект.
Для проектов под встраиваемые системы важно еще наличие каких-либо библиотек, облегчающих работу с выбранной встраиваемой системой и утилиты для загрузки скомпилированного кода в ядро встраиваемой системы.
Для STM32VLDiscovery нам потребуется:

Компилятор и отладчик ищите в репозиториях своего дистрибутива. На крайний случай можно скачать готовые бинарники от CodeSourcery (правда я не помню есть ли в них gdb). Библиотеки CMSIS и STM32StdPeriphLib можно взять единым архивом с сайта STMicroelectronics - http://www.st.com/internet/mcu/product/216844.jsp , вкладка "Design Support" и пункт ""STM32F 10X standard peripheral library".
Теперь перейдем к тому, как все это упаковать в один большой проект.

Шаблон проекта

Шаблонный проект для нашей отладочной платы будет иметь следующую структуру:

stm32vldiscovery-linux-template/
|-- cmsis/
| |-- core_cm3.c
| `-- core_cm3.h
|-- stlink/
|-- flashing_stm32vldiscovery.sh
|-- main.c
|-- Makefile
|-- README
`-- stm32_lib/
|-- device_support/
| `-- gcc/
| |-- startup_stm32f10x_md_vl.S
| `-- stm32f100rb_flash.ld
|-- stm32f10x_conf.h
|-- stm32f10x_gpio.c
|-- stm32f10x_gpio.h
|-- stm32f10x.h
|-- stm32f10x_it.c
|-- stm32f10x_it.h
|-- stm32f10x_rcc.c
|-- stm32f10x_rcc.h
|-- system_stm32f10x.c
`-- system_stm32f10x.h

Все необходимые исходники библиотек и нестандартных утилит я предпочитаю держать в дереве проекта, чтобы можно было сразу скомпилировать и загрузить программу просто получив ее исходный код, без поисков "где же скачать и установить утилиту stlink" и так далее.
Итак, исходный код stlink'а и CMSIS лежит в соответствующих директориях, эти директории могут кочевать из проекта в проект без каких бы то ни было изменений.
Исходный код библиотеки стандартной периферии от STM32 лежит в подкаталоге stm32_lib. Содержимое этого подкаталога может варьироваться в зависимости от того, какие драйвера для программы нужны. Так, например, в нашем шаблонном проекте используются выводы общего назначения (чтобы зажечь светодиоды) - соответственно я скопировал из скачанного архива библиотеки файлы stm32f10x_gpio.c и stm32f10x_gpio.h. Остальные файлы в каталоге шаблонного проекта являются необходимыми для компиляции проекта, особенно стартовый ассемблерный код и скрипт для линкера.

Перед написанием своей программы с использованием библиотеки от STM32 необходимо произвести некоторые настройки, в соответствии с используемым в проекте микроконтроллером и применяемыми драйверами.
Для драйверов периферии недостаточно скопировать их исходный код в дерево проекта - нужно еще подключить соответствующие заголовочные файлы. Делается это в файле stm32f10x_conf.h, раскомментированием соответствующих строк:
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/* Includes ------------------------------------------------------------------*/
/* Uncomment/Comment the line below to enable/disable peripheral header file inclusion */
/* #include "stm32f10x_adc.h" */
/* #include "stm32f10x_bkp.h" */
/* #include "stm32f10x_can.h" */
/* #include "stm32f10x_cec.h" */
/* #include "stm32f10x_crc.h" */
/* #include "stm32f10x_dac.h" */
/* #include "stm32f10x_dbgmcu.h" */
/* #include "stm32f10x_dma.h" */
/* #include "stm32f10x_exti.h" */
/* #include "stm32f10x_flash.h" */
/* #include "stm32f10x_fsmc.h" */
#include "stm32f10x_gpio.h"
/* #include "stm32f10x_i2c.h" */
/* #include "stm32f10x_iwdg.h" */
/* #include "stm32f10x_pwr.h" */
#include "stm32f10x_rcc.h"
/* #include "stm32f10x_rtc.h" */
/* #include "stm32f10x_sdio.h" */
/* #include "stm32f10x_spi.h" */
/* #include "stm32f10x_tim.h" */
/* #include "stm32f10x_usart.h" */
/* #include "stm32f10x_wwdg.h" */
/* #include "misc.h" *//* High level functions for NVIC and SysTick (add-on to CMSIS functions) */



И еще нужно подтвердить использование библиотеки стандартной периферии, раскомментировав соответствующий макрос в stm32f10x.h:
1
2
3
4
5
6
7
8
#if !defined  USE_STDPERIPH_DRIVER
/**
* @brief Comment the line below if you will not use the peripherals drivers.
In this case, these drivers will not be included and the application code will
be based on direct access to peripherals registers
*/
#define USE_STDPERIPH_DRIVER
#endif



В этом же файле нужно раскомментировать соответствующее макроопределение для используемого в проекте микроконтроллера. Так например, STM32F100RB относится к линейке "Medium density Value Line" и соответственно нам нужно раскомментировать строчку с макросом STM32F10X_MD_VL:
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/* Uncomment the line below according to the target STM32 device used in your
application
*/

#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !define
d (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32
F10X_XL) && !defined (STM32F10X_CL)
/* #define STM32F10X_LD */ /*!< STM32F10X_LD: STM32 Low density devices */
/* #define STM32F10X_LD_VL */ /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */

/* #define STM32F10X_MD */ /*!< STM32F10X_MD: STM32 Medium density devices */
#define STM32F10X_MD_VL /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */
/* #define STM32F10X_HD */ /*!< STM32F10X_HD: STM32 High density devices */
/* #define STM32F10X_HD_VL */ /*!< STM32F10X_HD_VL: STM32 High density value line devices */
/* #define STM32F10X_XL */ /*!< STM32F10X_XL: STM32 XL-density devices */
/* #define STM32F10X_CL */ /*!< STM32F10X_CL: STM32 Connectivity line devices */
#endif
/* Tip: To avoid modifying this file each time you need to switch between these
devices, you can define the device in your toolchain compiler preprocessor.

- Low-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers
where the Flash memory density ranges between 16 and 32 Kbytes.
- Low-density value line devices are STM32F100xx microcontrollers where the Flash
memory density ranges between 16 and 32 Kbytes.
/* #define STM32F10X_MD */ /*!< STM32F10X_MD: STM32 Medium density devices */
#define STM32F10X_MD_VL /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices
*/
/* #define STM32F10X_HD */ /*!< STM32F10X_HD: STM32 High density devices */
/* #define STM32F10X_HD_VL */ /*!< STM32F10X_HD_VL: STM32 High density value line devices */

/* #define STM32F10X_XL */ /*!< STM32F10X_XL: STM32 XL-density devices */
/* #define STM32F10X_CL */ /*!< STM32F10X_CL: STM32 Connectivity line devices */
#endif



На этом настройка библиотек закончена и можно переходить к написанию своего кода. В шаблонном проекте весь код сосредоточен в файле main.c в корне дерева исходников, но вы вольны использовать любую другую компоновку, немного подправив Makefile.
Для того, чтобы использовать в вашем исходном коде какие-нибудь драйвера из библиотеки от STM32, достаточно подключить заголовочный файл stm32f10x.h. Всякие же подробности использования драйверов скрыты в комментариях к исходному коду этих драйверов.

Сборка проекта

Компиляция и загрузка проекта осуществляется при помощи одного большого Makefile. Я не буду приводить в блоге код полностью - его вы сможете посмотреть сами в исходниках проекта (ссылка приведена в конце статьи).
Отмечу лишь, что для своего проекта вам нужно указать имя бинарника, пути к исходным файлам проекта и, если потребуется, к заголовочным файлам, список получающихся объектных файлов, а также путь к ARM'овскому кросскомпилятору.
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
BIN=stm32vldiscovery-linux-template

TOOLS_PATH=/opt/sgpp-lite-arm-eabi-bin-2010.09.51
TOOLS_PREFIX=arm-none-eabi-
TOOLS_VERSION=4.5.1

CFLAGS+=-I./cmsis -I./stm32_lib -I.

CMSISSRC=./cmsis/core_cm3.c
STM32_LIBSRC=./stm32_lib/system_stm32f10x.c ./stm32_lib/stm32f10x_it.c
STM32_LIBSRC+=./stm32_lib/stm32f10x_rcc.c ./stm32_lib/stm32f10x_gpio.c
SRC=main.c

OBJ=core_cm3.o system_stm32f10x.o stm32f10x_it.o startup_stm32f10x_md_vl.o
OBJ+=stm32f10x_rcc.o stm32f10x_gpio.o
OBJ+=main.o



Прошивка проекта в микроконтроллер производится через make load, при этом собирается утилита stlink из исходников и запускается скрипт flashing_stm32vldiscovery.sh, проверяющий все ли на месте и запускающий сервер для gdb (необходимы привилегии root - sudo спрашивает пароль!). При удачном подключении к плате должен зажечься еще один красный светодиод на ней (следует подождать некоторые время - примерно 7-9 секунд). После этого, вы можете запустить gdb для ARM в другой консоли и выполнить для загрузки прошивки в чип:

target remote :1234
load stm32vldiscovery-linux-template.elf



Загрузка прошивки в STM32VLDiscovery


Для запуска прошитой программы следует ввести команду continue, для остановки - нажать Ctrl+C.
Небольшой подводный камень - после выполнения make load лучше всего не прерывать работу запустившегося stlink'а, не выходить из gdb и не отсоединять STM32VLDiscovery от USB. Иначе возможна нестабильная работа системы, core dump'ы, kernel panic'и и прочие подобные вещи. Собирать ELF'ы лучше всего в отдельной вкладке консоли, а затем переходить на вкладку с GDB, чтобы залить изменения в чип.
Еще один подводный камень - для работы утилиты stlink необходим модуль ядра sg. Соответствующая опция расположена где-то в "Device drivers"->"SCSI drivers"->"....generic...". Если этого модуля нет или он вкомпилирован в ядро - вы получите красивый crashdump и последующую перезагрузку системы.

Если все прошло удачно и шаблонный проект прошился - мы должны получить плату с горящими зеленым и синим светодиодами:




Полезные ссылки

По материалам блога "Дракон-линуксоид"


Тэги: embedded stm32
+ 2 -
Похожие Поделиться

Смотреть онлайн бесплатно

Онлайн видео бесплатно


Смотреть русское с разговорами видео

Online video HD

Видео скачать на телефон

Русские фильмы бесплатно

Full HD video online

Смотреть видео онлайн

Смотреть HD видео бесплатно

School смотреть онлайн