Opencv на stm32f7-discovery

Запуск на STM32F7Discovery

На 32F746GDISCOVERY есть несколько аппаратных разделов памяти, которые мы можем так или иначе использовать

  1. 320KiB оперативной памяти
  2. 1MiB флэш-памяти для образа
  3. 8MiB SDRAM
  4. 16MiB QSPI NAND-флэшка
  5. Разъём для 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

ADC

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/внешний

Комплектация:

  1. Отладочный набор 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

  1. STM32F3DISCOVERY socket: for easily connecting the STM32F3DISCOVERY
  2. ZigBee interface: for connecting ZigBee modules such as CC2530 module.
  3. USART2 interface: easily connects to RS232, RS485, USB TO 232, etc.
  4. ONE-WIRE interface: easily connects to ONE-WIRE devices (TO-92 package), such as temperature sensor (DS18B20), electronic registration number (DS2401), etc.
  5. 8I/Os interface: for connecting accessory boards such buttons, motors, etc.
  6. 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
  7. Humidity sensor socket: for connecting humidity sensor such as HS1101LF, etc.
  8. I2S / I2C1 interface: easily connects to I2S peripherals such as audio module, etc.
  9. LCD connector: for connecting touch screen LCD
  10. CAN interface: communicates with accessory boards which feature the CAN device conveniently
  11. PS/2 interface: easily connects to PS/2 keyboard and/or mouse
  12. I2C1 / I2C2 interface: easily connects to I2C peripherals such as I/O expander (PCF8574), FRAM (FM24CLxx), etc.
  13. Resistive sensor socket: for connecting resistive sensor such as photoresistor, etc.
  14. USART1 interface: easily connects to RS232, RS485, USB TO 232, etc.
  15. 5V DC jack
  16. 5V/3.3V power input/output: usually used as power output, also common-grounding with other user board
  17. MCU pins connector: all the MCU I/O ports are accessible on expansion connectors for further expansion
  18. STM32-JTAG/SWD interface: for STM32 debugging/programming
  19. ZigBee-JTAG interface: for ZigBee debugging/programming
  20. Power switch
  21. Boot mode switch: for configuring BOOT0 pin
  22. 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
  23. 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
  24. LDR jumper

    • short the jumper to use resistive sensor, certain I/Os are required
    • open the jumper to disconnect from the I/Os
  25. 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)
  26. Power indicator
  27. Joystick: five positions
  28. ZigBee reset
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector