Последнее обновление:
July 6, 2020

Есть мысль... Жми, напиши!
Что имеем: Постов : 140 Авторов: 1 Категорий: 22

Qt 5.12 + Android с чего начать или Hello World

Потребовалось в очередной раз обновить Qt для кросскомпиляции под Андроид. В моём случае разработка идёт под Линукс, но с Виндой, думаю, особых проблем не будет.

Качаем Android SDK, для этого нужно скачать SDKManager. (На странице ищем «Command line tools only»), пока что не распаковываем.

Рабочим каталогом у меня будет «~/Projects/ANDROID», все манипуляции будут отталкиваться от него, как от основного.

Дальше запускаем Qt Update Manager (в папке с установленным Qt, называется «MaintanceTool») и добавляем все (либо только под целевую архитектуру) компоненты, связанные с Андроидом для вашей версии Qt.

Качаем JDK версии 8!, распаковываем куда-нить.
Кстати, подойдёт и OpenJDK 8 версии (sudo apt install openjdk-8-jre)
И сразу зададим, какую использовать версия Java, а то ошибок может быть куча:

 JAVA_HOME=/home/pavelk/Projects/ANDROID/jdk1.8.0_251/

Да, и консольку не закрываем, иначе придётся перепрописывать заново.

Создаём папку, в которой будет наш SDK:

mkdir ./SDK

и распаковываем в неё наш sdkmanager, что бы он оказался в подпапке tools (а в ней были bin и lib). Ну и начинаем с помощью него ставить все необходимые пакеты и утилиты:

cd ~/Projects/ANDROID
./SDK/tools/bin/sdkmanager --sdk_root="/home/pavelk/Projects/ANDROID/SDK" "platform-tools" "platforms;android-28"
./SDK/tools/bin/sdkmanager --sdk_root="/home/pavelk/Projects/ANDROID/SDK" "build-tools;28.0.1"

Очень внимательно читаем все лицензии, консультируемся с юристами и принимает, благославясь:

./SDK/tools/bin/sdkmanager --sdk_root="/home/pavelk/Projects/ANDROID/SDK" --license

Как Вы поняли, качаем под Android 9 (API 28 уровня), SDK будет распологаться по пути, указанным в —sdk_root
Полный список команд тут: https://developer.android.com/studio/command-line/sdkmanager.

На 64х битном Лине необходимо доставить 32х битные пакеты (но это не точно):

sudo apt install libstdc++6:i386 libgcc1:i386 zlib1g:i386 libncurses5:i386 libsdl1.2debian:i386

Версии зависят от вашего дистрибутива. Если какой-то нет, то вполне возможно, что придётся вручную качать пакет и устанавливать из старой версии.

Настраиваем QtCreator:
Tools > Options > Devices > Android
Выбираем пути до OpenJDK, AndroidSDK и AndroidNDK

Ну чтож, создадим первый проект.

Как обычно создаём новый проект, в моём случае QML.
Когда доёдёт до стадии выбора комплекта — выбираем архитектуру, которая на вашем устройстве для отладки (да, тестить будем на реальном девайсе). Если не вкурсе какая именно архитектуру процессора вашего девайса, то из Play Market ставим AIDA иди CPU-z.

Сразу прожимаем «запуск», и откроется окно с предложением выбрать девайс.

Включаем на телефоне режим разработчика, для этого нужно 7 раз кликнуть в настройках, подменюшка «о телефоне» по номеру сборку.
Дальше включаем «отладку по USB» в «Настройки» -> «Система» -> «Для разработчиков»

Первый раз телефон нужно подключить по USB, потом будем по WiFi.
Выясняем его ID:

lsusb

Вытыкаем девайс и снова набираем эту же команду, сравниваем вывод и выясняем, какая строка пропала. Запоминаем значение, которое сразу за «ID» идёт (к примеру «1d6b»).

Теперь пропишем правила монтирования, что бы при подключении по USB автоматически выдавались нужные права, а так же ADBAndroid Debug Bridge — Отладочный мост Android, через него мы как раз тправляем и тлаживаем приложение на устройстве) был вкурсе нашего устройства.

echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="<ID>", MODE="0666", GROUP="plugdev"' | sudo tee --append /etc/udev/rules.d/51-android.rules
echo '<ID>' | sudo tee --append ~/.android/adb_usb.ini

sudo chmod a+r /etc/udev/rules.d/51-android.rules
sudo udevadm control --reload-rules 
sudo udevadm trigger

Перезапускаем ADB

./SDK/platform-tools/adb kill-server
./SDK/platform-tools/adb start-server

Дальше приконнектимся к телефону по wifi, т.к. по проводу лень.

./SDK/platform-tools/adb tcpip 5555
./SDK/platform-tools/adb connect <IP девайса>

IP девайса можно узнать в настройках, подменюшка «о телефоне», в «общая информация».
По USB телефон теперь можно отключить и спокойно деплоить по WiFI.

Возвращаемся к Qt, жмём «Обновить список», выбираем наше устройство — справа в строке должен быть IP адрес его.

Гляньте в «консоль сборки», возможно, будут автоматически скачаны какие-либо пакеты дополнительные (возможно, при медленном соединеении, будут ошибки, поэтому запускать несколько раз придётся).

Кстати, если открыта Android Studio, то, при отладке в Qt, её придётся закрыть.

Надеюсь, сборка прошла успешно! Добро пожаловать в мир тормозов и лагов чудесный.

Пост на основе https://doc.qt.io/qt-5/android-getting-started.html

Views :

24

STM32F3 Discovery первый проект или с чего начать? Hello World.


Статья устарела, обновление:  http://pavelk.ru/stm32f3-discovery

Пришла долгожданная STM32F3 Discovery. До этого моргал только светодиодами на Arduino =)

Так как я полностью новичёк в программировании ARMов, начну, пожалуй, с выбора IDE, и запуском первого проекта.

Выбор IDE был не долгий, выбрал Keil. Так как в остальных (CoIde, Code::Blocks) небыло поддержки чипа STM32F303VC.

Брал сами знаете где. После установки предложит выбор пакетов — выбирайте для STM32F3xx  как то так назывался.

Теперь нужны либы:

CMSIS  —   в ней содержатся описания для доступа к регистрам периферии и   STM32F30x_StdPeriph_Driver

Распаковываем архивы в удобное место.

Цепляем плату к компу (На плате usb шник в разьём USB ST-LINK). Комп должен установить драйвера.

Проверить нужно в диспетчере устройств, если не поставились автоматом, то из установочной директории Keilа запускаем \Keil\ARM\STLink\USBDriver\ST-dpinst_amd64.exe

Ну и жмём обновить драйвера. Должен подхватить автоматом. P.S. Windows 8 x64 — всё ок.

После установки драйвера и подключения платы, светодиод COM должен постоянно гореть.  Если нет — проблемы с подключением/с драйвером.

 

Дальше создаём новый проект и настраиваем:

  1. Project -> new uVision project
  2. В открывшемся окне выбираем наш проц
  3. В открывшемся окне в списке отмечаем Device -> Startup
  4. Слева в менеджере на проекте  клацаем контекстную менюшку и выбираем Options for Target ….
  5. Дальше на вкладке Debug  выбираем ST-Link Debugger, клацаем рядом кнопку  Settings,
  6. в открывшемся окне выбираем вкладку Debug, находим Port  ставим  SW
  7. открываем вкладку Flash Download, нужно задать тип памяти,  жмём Add, я выбрал STM32F3xx Flash.   Жмём Add.
  8. Жмём Ok и переходим на вкладку Utilities, снимаем галку «Use debug driver» и выбираем снова ST-Link Debugger и настраиваем как на предыдущем шаге
  9. Переходим на вкладку С/С++ и в поле define  вписываем «USE_STDPERIPH_DRIVER,STM32F30X«,   без этого проект не соберётся.
  10. Дальше  на этой же вкладке  жмём на кнопку справа от поля Include Paths  и добавляем пути по которым искать заголовочники либ
    1. путьУстановкиStdPeriph_Driver\STM32F30x_StdPeriph_Driver\inc
    2. путьУстановкиStdPeriph_Driver\STM32F30x_StdPeriph_Driver\src
    3. путьУстановкиCMSIS\Device\ST\STM32F30x\Include
    4. путьУстановкиCMSIS\Device\ST\STM32F30x\Source
  11. Добавим файлы  в проект, в менеджере проекта выбираете группу «Source Group 1» и в  контекстной менюшке выбираете: «Add new item to group …»
  12. Первым делом нужно добавить заголовочный файл с названием stm32f30x_conf.h (Иначе Keil будет ругаться при сборке) и в Location укажите папку conf и добавьте эту папку так же как на предыдущем шаге в Include Paths
  13. Ну а дальше добавляем файл исходников, называем main.cpp
  14. На этом настройки проекта закончены

Настало время немножко покодить, в main.c

//-- подключаем необходимые заголовочники
#include "stm32f30x_conf.h"
#include "stm32f30x_gpio.c"
#include "stm32f30x_rcc.c"
#include "stm32f30x.h"

GPIO_InitTypeDef gpio; //-- храним настройки портов

//-- реализуем функцию задержки
void delay(long ms)
{
	for(long i=0; i<ms; i++) __NOP();
}
 
//-- настраиваем порты
void initAll()
{
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE, ENABLE);
 
    gpio.GPIO_Mode = GPIO_Mode_OUT;
    gpio.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15 ;
    GPIO_Init(GPIOE, &gpio);
}

int main()
{
	initAll();
	int pins[8] = {GPIO_Pin_8, GPIO_Pin_9, GPIO_Pin_10, GPIO_Pin_11, GPIO_Pin_12, GPIO_Pin_13, GPIO_Pin_14, GPIO_Pin_15 };
		
	int i = 0;
	while(1){	
		
		if (i>=8) {
			i=0;
			GPIO_ResetBits(GPIOE, pins[7]);
		}
		
		if (i>0) {
			GPIO_ResetBits(GPIOE, pins[i-1]);
		}
		
		GPIO_SetBits(GPIOE, pins[i]);
		delay(60000);
		
		i++;		
		
	}
}

Пересобираем проект:  Project -> Build target  и заливаем на плату: Flash -> Download

Жмём на плате кнопку RESET и смотрим на бегающие по кругу огоньки.

Этот пост решает проблемы:

  • Error: Flash Download failed — \Keil\ARM\STLink\ST-LINKIII-KEIL.dll
  • Error:  Flash download failed «CORTEX-M4»

 

Views :

13078