Opencv на stm32f7-discovery
Содержание:
Запуск на STM32F7Discovery
На 32F746GDISCOVERY есть несколько аппаратных разделов памяти, которые мы можем так или иначе использовать
- 320KiB оперативной памяти
- 1MiB флэш-памяти для образа
- 8MiB SDRAM
- 16MiB QSPI NAND-флэшка
- Разъём для microSD-карточки
SD-карту можно использовать для хранения изображений, но в контексте запуска минимального примера это не очень полезно.
Дисплей имеет разрешение 480×272, а значит, память под фреймбуффер составит 522 240 байт при глубине 32 бита, т.е. это больше, чем размер оперативной памяти, так что фреймбуффер и кучу (которая потребуется в том числе для OpenCV, чтобы хранить данные для изображений и вспомогательных структур) будем располагать в SDRAM, всё остальное (память под стэки и прочие системные нужды) отправится в RAM.
Если взять минимальный конфиг для STM32F7Discovery (выкинуть всю сеть, все команды, сделать стэки как можно меньше и т.д.) и добавить туда OpenCV с примерами, с требуемой памятью будет следующее:
Для тех, кто не очень знаком с тем, какие секции куда складывается, поясню: в и лежат интструкции и константы (грубо говоря, readonly-данные), в лежат данные изменяемые, в лежит «занулённые» переменные, которым, тем не менее, нужно место (эта секция «отправится» в RAM).
Хорошая новость в том, что / должны помещаться, а вот с беда — под образ есть только 1MiB памяти. Можно выкинуть из картинку из примера и читать её, например, с SD-карты в память при запуске, но fruits.png весит примерно 330KiB, так что проблему это не решит: большая часть состоит именно из кода OpenCV.
По большому счёту, остаётся только одно — загрузка части кода на QSPI-флэшку (у неё есть спец. режим работы для мэпирования памяти на системную шину, так что процессор сможет обращаться к этим данным напрямую). При этом возникает проблема: во-первых, память QSPI-флэшки недоступна сразу после перезагрузки устройства (нужно отдельно инициализировать memory-mapped-режим), во-вторых, нельзя «прошить» эту память привычным загрузчиком.
В итоге было решено слинковать весь код в QSPI, а прошивать его самописным загрузчиком, который будет получать нужный бинарник по TFTP.
Результат
Идея портировать эту библиотеку на Embox появилось ещё примерно год назад, но раз за разом это откладывалось из-за разных причин. Одна из них — поддержка libstdc++ и standart template library. Проблема поддержки C++ в Embox выходит за рамки этой статьи, поэтому здесь только скажу, что нам удалось добиться этой поддержки в нужном объёме для работы этой библиотеки 🙂
В итоге эти проблемы были преодолены (по крайней мере, в достаточной степени для работы примера OpenCV), и пример запустился. 40 длительных секунд занимает у платы поиск границ фильтром Кэнни. Это, конечно, слишком долго (есть соображения, как это дело оптимизировать, об этом можно будет написать отдельную статью в случае успеха).
tl;dr: пошаговая инструкция
0: Качаем исходники Embox, например так:
1: Начнём со сборки загрузчика, который «прошьёт» QSPI-флэшку.
Теперь нужно настроить сеть, т.к. загружать образ будем по TFTP. Для того, чтобы задать IP-адреса платы и хоста, нужно изменить файл conf/rootfs/network.
Пример конфигурации:
— адрес хоста, откуда будет загружаться образ, — адрес платы.
После этого собираем загрузчик:
2: Обычная загрузка загрузчика (простите за каламбур) на плату — здесь ничего специфичного, нужно это сделать как для любого другого приложения для STM32F7Discovery. Если вы не знаете, как это делается, можно почитать об этом тут.
3: Компиляция образа с конфигом для OpenCV.
4: Извлечение из ELF секций, которые нужно записать в QSPI, в qspi.bin
В директории conf лежит скрипт, который это делает, так что можно запустить его
5: С помощью tftp загружаем qspi.bin.bin на QSPI-флэшку. На хосте для этого нужно скопировать qspi.bin в корневую папку tftp-сервера (обычно это /srv/tftp/ или /var/lib/tftpboot/; пакеты для соответствующего сервера есть в большинстве популярных дистрибутивов, обычно называется tftpd или tftp-hpa, иногда нужно сделать для старта).
На Embox-е (т.е. в загрузчике) нужно выполнить такую команду (предполагаем, что у сервера адрес 192.168.2.1):
6: С помощью команды нужно «прыгнуть» в QSPI-память. Конкретная локация будет варьироваться в зависимости от того, как образ слинкуется, посмотреть этот адрес можно командой (адрес старта укладывается во второе 32-битное слово образа); также потребуется выставить стэк флагом , адрес стэка лежит по адресу 0x90000000, пример:
7: Запускаем
и наслаждаемся 40-секундным поиском границ 🙂
Если что-то пойдёт не так — пишите issue в нашем репозитории, или в рассылку embox-devel@googlegroups.com, или в комментарии здесь.
Pinout
Hover the mouse over a pin function for more information. Clicking in a function will tell you how to use it in Espruino.
- Purple boxes show pins that are used for other functionality on the board. You should avoid using these unless you know that the marked device is not used.
- ! boxes contain extra information about the pin. Hover your mouse over them to see it.
- 3.3v boxes mark pins that are not 5v tolerant (they only take inputs from 0 — 3.3v, not 0 — 5v).
- GND is ground (0v).
- ADC is an Analog to Digital Converter (for reading analog voltages)
- DAC is a Digital to Analog Converter (for creating analog voltages). This is not available on all boards.
- PWM is for Pulse Width Modulation. This creates analog voltages from a digital output by sending a series of pulses.
- SPI is the 3 wire Serial Peripheral Interface.
- USART is a 2 wire peripheral for Serial Data.
- I2C is the 2 wire Inter-Integrated Circuit bus.
- CAN is for the Controller Area Network. It is not supported by Espruino.
5V
F10
PWM
SPI2 SCK
F1
3.3v
OSC
I2C2 SCL
C15
3.3v
OSC RTC
C13
3.3v
PWM
E5
MEMS
PWM
E3
GYRO
PWM
E1
GYRO
PWM
USART1 RX
B9
3.3v
CAN
AUDIO
I2C1 SDA
PWM
VDD
B7
3.3v
MEMS
I2C1 SDA
PWM
USART1 RX
B5
PWM
SPI1 MOSI
SPI3 MOSI
USART2 CK
B3
PWM
SPI3 SCK
SPI1 SCK
USART2 TX
D6
PWM
USART2 RX
D4
AUDIO
PWM
D2
UART5 RX
D0
CAN
C11
PWM
SPI3 MISO
USART3 RX
UART4 RX
A15
3.3v
JTAG
I2C1 SCL
PWM
USART2 RX
A13
JTAG
PWM
A11
CAN
USB
PWM
A9
3.3v
USB
I2C2 SCL
PWM
USART1 TX
C9
PWM
NC
GND
5V
PWM
SPI2 SCK
F9
CAN
D0
OSC RTC
3.3v
C14
E6
MEMS
PWM
E4
MEMS
PWM
E2
GYRO
PWM
USART1 TX
E0
CAN
I2C1 SCL
PWM
3.3v
B8
BOOT0
AUDIO
I2C1 SCL
PWM
USART1 TX
3.3v
B6
PWM
SPI1 MISO
SPI3 MISO
USART2 RX
B4
PWM
USART2 CK
D7
USART2 TX
D5
D3
CAN
PWM
D1
AUDIO
PWM
SPI3 MOSI
USART3 CK
UART5 TX
C12
AUDIO
PWM
SPI3 SCK
UART4 TX
USART3 TX
C10
JTAG
I2C1 SDA
PWM
USART2 TX
3.3v
A14
I2C2 SCL
PWM
3.3v
F6
CAN
USB
PWM
A12
USB
I2C2 SDA
PWM
USART1 RX
3.3v
A10
PWM
USART1 CK
A8
PWM
C8
GND
3V
NRST
C0
3.3v
USB
C2
3.3v
ADC
F2
3.3v
ADC
A0
3.3v
ADC
BTN1
A2
3.3v
ADC
PWM
USART2 TX
A4
3.3v
ADC
DAC
AUDIO
PWM
USART2 CK
A6
3.3v
ADC
GYRO
PWM
SPI1 MISO
C4
3.3v
ADC
USART1 TX
B0
3.3v
ADC
PWM
B2
3.3v
ADC
E8
3.3v
LED2
PWM
E10
3.3v
ADC
LED3
PWM
E12
3.3v
ADC
PWM
E14
3.3v
LED6
PWM
B10
3.3v
MIC
PWM
USART3 TX
B12
3.3v
USART3 CK
B14
3.3v
PWM
SPI2 MISO
D8
3.3v
USART3 TX
D10
3.3v
USART3 CK
D12
3.3v
PWM
D14
3.3v
PWM
C7
AUDIO
PWM
GND
3V
GND
ADC
3.3v
C1
ADC
MIC
3.3v
C3
ADC
PWM
3.3v
A1
ADC
PWM
USART2 RX
3.3v
A3
ADC
3.3v
F4
ADC
DAC
GYRO
SPI1 SCK
3.3v
A5
ADC
GYRO
PWM
SPI1 MOSI
3.3v
A7
ADC
USART1 RX
3.3v
C5
ADC
PWM
3.3v
B1
ADC
3.3v
E7
ADC
LED1
PWM
3.3v
E9
ADC
LED5
PWM
3.3v
E11
ADC
PWM
3.3v
E13
LED4
USART3 RX
3.3v
E15
PWM
USART3 RX
3.3v
B11
ADC
PWM
SPI2 SCK
3.3v
B13
PWM
SPI2 MOSI
3.3v
B15
USART3 RX
3.3v
D9
3.3v
D11
PWM
3.3v
D13
PWM
3.3v
D15
PWM
C6
GND
Программирование STM32VLDiscovery через Keil.
Подключаем нашу платку к USB, и ждем пока она определится как внешний носитель. Если Windows не увидел вашу плату (как было у меня), то советую проверить в первую очередь кабель и разъем для него на плате. У меня, например, отошел контакт на Discovery и я очень долго пытался понять, почему же плата не работает
Но чаще всего подключение проходит без проблем, так что двигаемся дальше. Идем в папку с Keil’ом и находим драйвер для USB. Он лежит вот тут:
ARM\STLink\USBDriver (это в папке, куда установлен Keil)
Запускаем ST-Link_V2_USBdriver.exe и устанавливаем его. Возвращаемся чуть назад – в папку C:\Keil\ARM\STLink и видим там файл STLinkUSBDriver.dll размером около 65 кб. Его надо заменить на файл – STLinkUSBDriver.dll (подменять файл следует только в том случае, если ST-LINK завести не удается (!) ).
Первый этап позади!
Запускаем Keil и открываем там проект, который будем заливать в железку. Открываем меню Flash-Configure Flash Tools. Во вкладке Debug выбираем Use ST-Link Debugger и ставим галочку Run to main():
Теперь открываем вкладку Utilities и тоже выбираем ST-Link Debugger.
Думаете все? А вот нет, танцы с бубном только начинаются! Нажимаем кнопку Settings и в появившемся окне нужно добавить Programming algorithm для нашего девайса:
В этом же окне открываем вкладку Debug, находим поле Port и вместо JTAG ставим SW:
С настройкой закончили, но и это еще не все. Открываем файл stm32f10x.h и находим в районе 45-55 строк такой текст:
#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_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_XL /* STM32F10X_XL: STM32 XL-density devices */ /* #define STM32F10X_CL */ /* STM32F10X_CL: STM32 Connectivity line devices */ #endif
Надо чтобы тут обязательно была раскомментирована строка #define STM32F10X_MD_VL и закомментированы все остальные, иначе программа зашьется, но не заведется.
Не забываем в настройках проекта попросить компилятор генерировать hex:
Собираем проект и нажимаем кнопку Load. В случае удачной прошивки видим строки:
Если все-таки почему-то у вас не вышло прошить плату через Keil, то есть второй способ.
Запуск в эмуляторе
На эмуляторе отлаживаться гораздо проще, поэтому сначала убедимся, что библиотека работает на qemu. В качестве эмулируемой платформы я выбрал Integrator/CP, т.к. во-первых, это тоже ARM, а во-вторых, Embox поддерживает вывод графики для этой платформы.
В Embox есть механизм для сборки внешних библиотек, с его помощью добавляем OpenCV как модуль (передав все те же опции для «минимальной» сборки в виде статических библиотек), после этого добавляю простейшее приложение, которое выглядит так:
Собираем систему, запускаем — получаем ожидаемый вывод.
Следующий шаг — запустить какой-нибудь пример, лучше всего какой-нибудь стандартный из тех, что предлагают сами разработчики у себя на сайте. Я выбрал детектор границ Кэнни.
Пример пришлось немного переписать, чтобы отображать картинку с результатом напрямую во фрэйм-буффер. Сделать это пришлось, т.к. функция умеет отрисовывать изображения через интерфейсы QT, GTK и Windows, которых, само собой, в конфиге для STM32 точно не будет. На самом деле, QT тоже можно запустить на STM32F7Discovery, но об этом будет рассказано уже в другой статье 🙂
После недолгого выяснения, в каком именно формате хранится результат работы детектора границ, получаем изображение.
Оригинальная картинка
Результат
What’s on the STM32F3DISCOVERY
- STM32F303VCT6 microcontroller featuring 256 KB Flash, 48 KB RAM in an LQFP100 package
- On-board ST-LINK/V2 with selection mode switch to use the kit as a standalone ST-LINK/V2 (with SWD connector for programming and debugging)
- Board power supply: through USB bus or from an external 3 V or 5 V supply voltage
- External application power supply: 3 V and 5 V
- L3GD20, ST MEMs motion sensor, 3-axis digital output gyroscope
- LSM303DLHC, ST MEMs system-in-package featuring a 3D digital linear acceleration sensor and a 3D digital magnetic sensor
- Ten LEDs:
- Two pushbuttons (user and reset)
- USB USER with Mini-B connector
- Extension header for all LQFP100 I/Os for quick connection to prototyping board and easy probing
Подробное описание
В состав набора входит высокоинтегрированная отладочная плата с богатой периферией, включая МЕМС датчики: гироскоп (L3GD20) и совмещенное решение акселерометр с компасом (LSM303DLHC). Такое решение позволит пользователям оценить возможности встроенного ядра цифрового сигнального процессора и блока арифметики с плавающей точкой, а также продемонстрирует одновременную работу с несколькими МЕМС устройствами.
Набор имеет все необходимое программное и аппаратное обеспечение
Помимо МЕМС датчиков на плате расположены порт USB, пользовательские светодиоды, кнопки и что самое важное – встроенный отладчик-программатор ST-LINK/V2
Отличительные особенности:
- полнофункциональная высокоинтегрированная отладочная плата;
- установлен микроконтроллер STM32F303VCT6:
- ядро ARM Cortex-M4, рабочая частота до 72 МГц;
- поддержка DSP инструкций с плавающей точкой;
- модуль защиты памяти;
- 256 КБайт Flash-память, 48 КБайт ОЗУ;
- 12-канальный DMA контроллер;
- до 13 таймеров с расширенным функционалом;
- часы реального времени с календарем и будильником;
- четыре АЦП с конфигурируемым разрешением 12/10/8/6 бит;
- два 12-битных ЦАП;
- 7 аналоговых компараторов;
- 4 программируемых операционных усилителя;
- поддержка сенсорного интерфейса;
- коммуникационные интерфейсы: CAN, I2C, USART/UART, I2S, USB 2.0;
- до 87 линий ввода/вывода общего назначения;
- питание от интерфейса USB или от внешнего источника 3 В или 5 В;
- установлен 3-осевой цифровой МЕМС гироскоп;
- установлена МЕМС система-в-корпусе, содержащая 3-осевой цифровой линейный акселерометр и 3-осевой цифровой геомагнитный сенсор;
- 10 светодиодов, две пользовательские кнопки;
- пользовательский порт USB;
- линии ввода/вывода микроконтроллера доступны на боковых коннекторах платы для возможности расширения или подключения внешних устройств;
- встроенный USB отладчик/программатор ST-LINK/V2 с возможностью использования в качестве отладчика/программатора для внешних микроконтроллеров;
- полная программная поддержка, примеры приложений и демонстрационные приложения.
Основные параметры
Параметр | Значение |
Интерфейс подключения | USB |
Ядро базового элемента | ARM Cortex-M4 |
Базовый компонент | STM32F303VCT6 |
Разрядность, бит | 32 |
Вспомогательный компонент |
L3GD20 LSM303DLHC LD3985M33R |
Целевое напряжение, В | 3.3 / 5.0 |
Напряжение питания, В | 5.0 |
Источник питания | USB/внешний |
Комплектация:
- Отладочный набор STM32F3DISCOVERY
Перевод: Vadim по заказу РадиоЛоцман
На английском языке: Discovery kit STMicroelectronics STM32F3DISCOVERY
Для комментирования материалов с сайта и получения полного доступа к нашему форуму Вам необходимо зарегистрироваться. |
Публикации по теме
- Новости STMicroelectronics выпускает многофункциональный отладочный набор для быстрой разработки устройств Интернета вещей — B-L475E-IOT01A1, B-L475E-IOT01A2
- Новости Компания STMicroelectronics сообщила о полномасштабном производстве микроконтроллеров серии STM32 F3 и представила отладочный набор STM32 F3 Discovery Kit — STM32F3 Discovery Kit
- Новости STMicroelectronics выпускает отладочный набор для разработки беспроводных IoT приложений по технологии LoRa — P-NUCLEO-LRWAN1
- Новости STMicroelectronics выпускает отладочный набор STM32 Discovery Kit
- Новости Отладочный набор упрощает разработку проектов технологии CapSense
Frameworks¶
Name | Description |
---|---|
Arduino Wiring-based Framework allows writing cross-platform software to control devices attached to a wide range of Arduino boards to create all kinds of creative coding, interactive objects, spaces or physical experiences | |
The ARM Cortex Microcontroller Software Interface Standard (CMSIS) is a vendor-independent hardware abstraction layer for the Cortex-M processor series and specifies debugger interfaces. The CMSIS enables consistent and simple software interfaces to the processor for interface peripherals, real-time operating systems, and middleware. It simplifies software re-use, reducing the learning curve for new microcontroller developers and cutting the time-to-market for devices | |
Arm Mbed OS is an open source embedded operating system designed specifically for the ‘things’ in the Internet of Things. It includes all the features you need to develop a connected product based on an Arm Cortex-M microcontroller, including security, connectivity, an RTOS and drivers for sensors and I/O devices | |
STM32Cube embedded software libraries, including: The HAL hardware abstraction layer, enabling portability between different STM32 devices via standardized API calls; The Low-Layer (LL) APIs, a light-weight, optimized, expert oriented set of APIs designed for both performance and runtime efficiency |
Photos
Open32F3-D development board
Open32F3-D development board back view
Open32F3-D Programming
Connecting to various peripherals
STM32 Cortex-M4 MCU board
STM32 Cortex-M4 MCU board
STM32 Cortex-M4 MCU board
STM32 Cortex-M4 MCU board
Open32F3-D μC/OS-II (Ⅰ)
Open32F3-D μC/OS-II (Ⅱ)
Open32F3-D μC/OS-II (Ⅲ)
Open32F3-D μC/OS-II (Ⅳ)
Connecting to RS232 Board
Connecting to RS485 Board
Connecting to USB UART Board
Connecting to 8 Push Buttons
Connecting to 5 IO Keypad
Connecting to AD Keypad
Test Board on the AD/DA port
Connecting to FRAM Board
Multi I2C peripheral Module connected to the I2C bus
Connecting to DataFlash Board
Connecting to audio Board
Connecting to VS1003B MP3 Board
Connecting to NRF24L01 RF Board
Connecting to Micro SD Storage Board
Connecting to CAN Board
Connecting to any accessory board you need
Note: The Open32F3-D Standard does not include STM32F3DISCOVERY, nor any other accessory board.
What’s on the mother board
- STM32F3DISCOVERY socket: for easily connecting the STM32F3DISCOVERY
- ZigBee interface: for connecting ZigBee modules such as CC2530 module.
- USART2 interface: easily connects to RS232, RS485, USB TO 232, etc.
- ONE-WIRE interface: easily connects to ONE-WIRE devices (TO-92 package), such as temperature sensor (DS18B20), electronic registration number (DS2401), etc.
- 8I/Os interface: for connecting accessory boards such buttons, motors, etc.
-
SPI1 / SPI2 + DAC + ADC interfaces:
- easily connects to SPI peripherals such as DataFlash (AT45DBxx), SD card, MP3 module, etc.
- easily connects to AD/DA modules
- Humidity sensor socket: for connecting humidity sensor such as HS1101LF, etc.
- I2S / I2C1 interface: easily connects to I2S peripherals such as audio module, etc.
- LCD connector: for connecting touch screen LCD
- CAN interface: communicates with accessory boards which feature the CAN device conveniently
- PS/2 interface: easily connects to PS/2 keyboard and/or mouse
- I2C1 / I2C2 interface: easily connects to I2C peripherals such as I/O expander (PCF8574), FRAM (FM24CLxx), etc.
- Resistive sensor socket: for connecting resistive sensor such as photoresistor, etc.
- USART1 interface: easily connects to RS232, RS485, USB TO 232, etc.
- 5V DC jack
- 5V/3.3V power input/output: usually used as power output, also common-grounding with other user board
- MCU pins connector: all the MCU I/O ports are accessible on expansion connectors for further expansion
- STM32-JTAG/SWD interface: for STM32 debugging/programming
- ZigBee-JTAG interface: for ZigBee debugging/programming
- Power switch
- Boot mode switch: for configuring BOOT0 pin
-
Joystick jumper
- short the jumper to connect the joystick to default I/Os used in example code
- open the jumper to connect the joystick to custom I/Os via jumper wires
-
PS/2 interface jumper
- short the jumper to connect the PS/2 devices to default I/Os used in example code
- open the jumper to connect the PS/2 devices to custom I/Os via jumper wires
-
LDR jumper
- short the jumper to use resistive sensor, certain I/Os are required
- open the jumper to disconnect from the I/Os
-
Humidity jumper
- connect the left two pins to retrieve data from capacitive sensor
- connect the right two pins to retrieve data from 180p capacitor (for testing)
- Power indicator
- Joystick: five positions
- ZigBee reset