середа, 31 серпня 2016 р.

STM32: Імпорт проекту в CooCoxIDE з CubeMX


Передмова

Розглянемо спосіб імпорту проекту до засобу розробки CooCoxIDE створеного за допомоги CubeMX (генератор коду для ініціалізації). В CubeMX офіційної підтримки CooCox немає, але знаючи декілька маленьких "хитрощів" можна генерувати робочий, повноцінний код для ініціалізації мікроконтролера. Цей спосіб підходить, як для CooCoxIDE 1.7, так і для CooCoxIDE 2.0Beta. Мікроконтролер чи плата розробника може бути будь-якою, принцип зберігається. Я для прикладу візьму плату розробника STM32VLDISCOVERY з мікроконтролером STM32F100RB. У вас може бути інша плата чи мікроконтролер.

Створюємо проект в CooCoxIDE

Спочатку треба створити пустий проект в засобі розробки CooCoxIDE. Якщо спочатку створити проект в CubeMX і зберегти його, то новий проект в CooCoxIDE не можливо буде зберегти в тій же теці. Потрібно буде зберігати окремо, що потягне за собою незручності у додатковому копіюванні файлів проекту. А також неможливо буде оновлювати проект з CubeMX, якщо будуть вноситись якісь зміни. Тому Запускаємо CooCoxIDE 1.7 чи 2.0Beta. Створюємо новий проект. І називаємо його "import example". Як встановити CooCoxIDE і створити новий проект в статті "CooCox IDE встановлення і перший запуск".
Створюємо новий проект
Після натискання кнопки "Next" потрібно обрати свій мікроконтролер. Я обираю STM32F100RB. Далі пропонують обрати з репозиторію потрібні бібліотеки.
Важливо! В репозиторію нічого не обирати. Проект має бути зовсім пустий. Також треба видалити з проекту файл "main.c", а також видалити сам файл "main.c" з диску, який знаходиться в теці проекту CooCoxIDE 1.7. А в CooCoxIDE 2.0Beta можна видалити з диску теку "APP" (в ній знаходиться файл "main.c"), яка знаходиться в теці проекту "import example".
Видалення файлу main з проекту
З CooCoxIDE поки що все і можна його згорнути.

Створюємо проект в CubeMX

Запускаємо CubeMX. Створюємо новий проект "New Project". В вікні, що з'явиться обираємо свій мікроконтролер, вкладка "MCU Selector". Або плату розробника, вкладка "Board Selector". На малюнку позначено червоним "1". CubeMX не підтримує плату розробника STM32VLDiscovery, але мікроконтролер в списку є, так що обираємо "MCU Selector" і прямуємо далі. Там де на малюнку позначено червоним "2" обираємо серію "Series", лінійку "Lines" і так далі. З списку обираємо свій мікроконтролер STM32F100RBTx - позначено червоним "3".
Обираємо свій мікроконтролер

Налаштування проекту

З'явиться вкладка "Pinout" з зображенням обраного мікроконтролеру. В області "Configuration" обираємо "RCC". В списку що розгорнеться обираємо "High Speed Clock (HSE)" - "Crystal/Ceramic Resonator" (на малюнку позначено червоним "1"). Це ми підключимо до мікроконтролеру зовнішній кварц на 8 МГц. Далі обираємо "SYS" і в списку, що розгорнеться, обираємо "Debug - Serial Wire" (на малюнку позначено червоним "2"). Це ми підключили інтерфейс SWD через який заливаємо "прошивки" до мікроконтролеру і працюємо в режимі Debugger. Тепер оголошуємо, що до виводів PC8, PC9 під'єднані голубий і зелений світлодіоди. Спочатку позначаємо що це "GPIO_Output" натиснувши ЛКМ (ліва кнопка миші). А натиснувши ПКМ (права кнопка миші) введемо текстову позначку. Для зручності так і назвемо "LED_BLUE" і "LED_GREEN" (на малюнку позначено червоним "3"). Оголосимо ще кнопку, обравши "PA0" як "GPIO_Input" і назвемо цей вивід як "USER_BUTTON" (на малюнку позначено червоним "4"). Ці два світлодіоди і кнопка входять до складу плати розробника STM32VLDiscovery. Як у вас інша плата розробника, то оголошуйте периферію відповідно до своєї плати. Або якщо ваша плата є в списку CubeMX, то оберіть її у вкладці "Board Selector".
Конфігурація виводів
Переходимо до вкладки "Clock Configuration" (на малюнку позначено червоним "1"). Обираємо "PLL Source MUX" як "HSE" (на малюнку позначено червоним "2"). Далі обираємо "System Clock MUX" як "PLLCLK" (на малюнку червоним "3"). А там де "HCLK (MHz)" обираємо частоту - максимально дозволено 24 МГц (позначка 4). 
Конфігурація тактування
Можна ще для ознайомлення перейти до вкладки "Configuration" і "Power Consumption Calculator", але для наших цілей вже проект налаштований і можна його зберегти та згенерувати код ініціалізації.

Генерування коду ініціалізації

Спершу збережемо в теку проекту "import example" створеного в CooCoxIDE файл проекту створений в CubeMX, обравши меню "File -> Save Project". Вказати шлях до вже створеної в CooCoxIDE теки проекту та назвати файл проекту "import example.ioc".
Зберігання проекту
Тепер налаштуємо сам проект для генерування коду. В меню CubeMX обираємо "Project -> Setting". В вікні, що з'явиться, у вкладці "Project" (окреслено червоним. дивись малюнок):

  1. Вказуємо ім'я проекту "Project Name" - Важливо! Ім'я проекту має бути таке саме як і назва проекту, що вже створили в CooCoxIDE - "import example".
  2. Шлях до теки з проектами "Project Location" - має бути шляхом до "workspace" для CoCooxIDE.
  3. Перевіряємо шлях, щоб був "..\workspace\import example", а не "..\workspace\import example\import example" якщо вказати шлях в "Project Location" не до "workspace", а до "workspace\import example".
  4. Та обираємо засіб розробки "Toolchain / IDE" як "TrueSTUDIO".
Налаштування проекту
У вкладці "Code Generator" залишаємо як є. Перевірте щоб було як на малюнку. Тиснемо "OK".
Налаштування проекту
Інші опції "Generated Files" та "HAL Settings" можуть бути обрані або ні. Для цього прикладу це не важливо. Впливають на саму структуру проекту та деякі аспекти ініціалізації мікроконтролера.
Все готово для генерації коду ініціалізації мікроконтролера. Тиснемо меню "Project -> Generate Code". CubeMX згенерує проект і збереже в теку "import example". З'явиться вікно про успішне завершення. Обираємо "Open Folder".
Відкриваємо теку з проектом

Переходимо до CooCoxIDE

Запускаємо CooCoxIDE, якщо був закритий, та розгортаємо, якщо був згорнутий. На тлі CooCoxIDE розгортаємо вікно провідника з проектом. Теки "Drivers", "Inc" і "Src" перетягуємо до теки проекту в CooCoxIDE (як на малюнку):
Підключення файлів до проекту
Файли підключено і проект має складатись з трьох тек "Drivers", "Inc" і "Src". Тепер викличемо конфігурацію проекту, або натиснувши кнопку в місці з позначкою "1", або викликавши контекстне меню проекту як позначено червоним в місці "2".
Конфігурація проекту
З'явиться вкладка "Configuration". У вкладці "Compile" поставити позначку на "Support C++", в розділі "Defined Symbols" додати рядки "USE_HAL_DRIVER" та "STM32F100xB".
Конфігурація компілятора для CoCooxIDE 1.7

Конфігурація компілятора для CooCoxIDE 2.0Beta трішечки відрізняється. Достатньо в розділі "Defined Symbols" додати рядки "USE_HAL_DRIVER", "STM32F100xB". Все інше так само як і для CoCooxIDE 1.7.
Конфігурація компілятора для CoCooxIDE 2.0Beta
Поясню звідки береться рядок "STM32F100xB", що додаємо до "Defined Symbols", так як мікроконтролери різні і потрібно знати точно який рядок додавати. Йдемо до дерева проекту і відкриваємо файл за таким шляхом: "\Drivers\CMSIS\Device\ST\STM32F1xx\Include\stm32f1xx.h" і у файлі шукаємо блок дефайнів "@addtogroup Device_Included". Нас цікавить мікроконтролер STM32F100RB, тому підходить перший рядок:
#if defined(STM32F100xB)
  #include "stm32f100xb.h"
Копіюємо через буфер обміну "STM32F100xB" в "Defined Symbols" тиснемо "Add" і вставляємо з буфера обміну рядок.

Далі відкриваємо файл за таким шляхом: "\Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates\gcc\startup_stm32f100xb.s" шукаємо рядок з "_estack" і міняємо на "_eram" (можливо що треба поміняти не в одному рядку, скористайтесь пошуком щоб переконатись що всі "_estack" поміняні на "_eram").
find estack
Переконаємось що все зроблено правильно і компілюється без помилок. Тиснемо "Build" або "F7". Як зроблено все вірно то компіляція пройде без помилок. Можемо написати мікроконтролерний "Hello World" і поблимати світлодіодами що є на платі розробника.

Мікроконтролерний "Hello World"

В CooCoxIDE відкриваємо файл "main.c" в теці "Src". Так як CubeMX зробив всю роботу за нас по ініціалізації мікроконтролера і підключеної до мікроконтролера периферії, нам залишається тільки керувати всім тим. Але, щоб при змінах режимів роботи мікроконтролера, додавання периферії, коли перезаписуємо проект з CubeMX не втратити написаний користувачем програмний код, треба писати свій код в спеціально визначених CubeMX місцях. Наприклад між рядками "/* USER CODE BEGIN 1 */"  та "/* USER CODE END 1 */" та інші подібні де зустрічається ключове слово "USER"  розташовуйте код між "begin" та "end".
По-перше в головній функції "int main(void)" увімкнемо синій світлодіод і зачекаємо пів секунди.
/* USER CODE BEGIN 1 */
 HAL_GPIO_WritePin(LED_BLUE_GPIO_Port,LED_BLUE_Pin,SET);
 HAL_Delay(500);
  /* USER CODE END 1 */
А далі в безкінечному циклі будемо міняти стан світлодіодів синього і зеленого з періодом пів секунди на протилежний.
/* USER CODE BEGIN WHILE */
  while (1)
  {
   HAL_GPIO_TogglePin(LED_BLUE_GPIO_Port,LED_BLUE_Pin | LED_GREEN_Pin);
   HAL_Delay(500);
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */
Компілюємо "Build" або "F7". Заливаємо до мікроконтролеру "Flash -> Program Download". Милуємось світлодіодним блиманням.

Відео як імпортувати в CooCoxIDE з CubeMX для 1.7 та 2.0Beta


Немає коментарів:

Дописати коментар