середу, 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


вівторок, 23 серпня 2016 р.

STM32: Підключення 1602 LCD Keypad Shield до STM32F103 Nucleo в засобі розробки mbed


Компанія STMicroelectronics виробляє плати розробника серії STM32 Nucleo, які підтримуються в онлайн засобі розробки mbed. І мають роз'єм сумісний з популярними і розповсюдженими платами розширення сімейства ARDUINO. Спробуємо на практиці підключити ось таку плату розширення LCD Keypad Shield з рідкокристалічним текстовим дисплеєм 1602 (16 символів, 2 рядки) та клавіатурою з 5 кнопок (вверх, вниз, ліворуч, праворуч, вибір), які підключені через резисторний дільник до одного аналогового входу A0. Кнопка "RST" (скидання) дублює аналогічну кнопку, що на платі розробника. Такі плати розширення LCD Keypad Sield та її клони існують в декількох варіантах. В мене, наприклад, спрощена схема підсвічування індикатора. Підсвічування вмикається від живлення плати. А є плати де підсвічування дисплею виведено на окремий A3 вивід і підсвічуванням дисплею можна керувати програмно. Увімкнути чи вимкнути підсвічування, або навіть регулювати яскравість підсвічування, коли налаштувати вихід A3 як PwmOut.
1602 LCD keypad shield
Підключати будемо до плати розробника STM32F103 Nucleo, але підійде будь яка плата серії Nucleo з роз'ємами arduino connector.
STM32F103 Nucleo
Підключення на рівні заліза дуже просте. Просто з'єднати плату розробника та плату розширення одну до одної "бутербродом" відповідними роз'ємами. Помилитись складно.

А от над програмним підключенням попрацюємо. Заходимо через браузер до "mbed compiler workspace". Ви маєте бути там зареєстровані. Як це зробити у дописі: "Знайомство з STM32F103 Nucleo та засобом розробки mbed".

Створюємо новий проект. Тиснемо "New" у верхньому лівому кутку засобу розробки mbed, або комбінацію кнопок"Ctrl+N". У вікні, що з'явиться обираємо "Nucleo-F103RB", або свою платформу, якщо відрізняється. З шаблонів обираємо пусту програму "Empty Program" і даємо назву програмі "1602_LCD_keypad_shield".
Створення нової прогарами
Тиснемо "OK". В просторі "Program Workspace" створиться наш новий пустий проект. 
Тепер наповнимо наш проект змістом. На назві нашої нової програми "1602_LCD_keypad_shield" клікаємо правою кнопкою миші (викликаємо контекстне меню) і обираємо створити новий файл "New File".
Створюємо новий файл
Даємо ім'я новому файлу "main.cpp" і тиснемо "OK".
Даємо назву main.cpp
Далі потрібно додати до проекту бібліотеку mbed. Аналогічно як додавали до проекту новий файл main.cpp, викликаємо контекстне меню проекту і обираємо "Import Library". Далі "From Import Wizard". В рядку пошуку "search" вводимо "mbed" без лапок і тиснемо кнопку "Search". Обираємо подвійним кліком миші бібліотеку "The official mbed C/C++ SDK provides the software platform and libraries to build your applications".
Підключення бібліотеки mbed
Ще потрібно підключити бібліотеку для роботи з нашим "LCD Keypad Shield". Аналогічно, як підключали до проекту бібліотеку "mbed", підключаємо бібліотеку для роботи з нашою платою розширення "LCD Keypad Shield". Для цього викликаємо контекстне меню проекту і обираємо "Import Library". Далі "From Import Wizard". В рядку пошуку "search" вводимо "lcd shield" без лапок і тиснемо кнопку "Search". Із списку обираємо бібліотеку "freetronicsLCDShield" A basic library for the Freetronics arduino LCD shield.

Все готово щоб почати писати програму. В дереві проекту обираємо файл "main.cpp" і першими рядками підключимо потрібні бібліотеки:
1
2
#include "mbed.h"
#include "freetronicsLCDShield.h"
Додамо в програму головну функцію main і безкінечний цикл. Тепер шаблон нашої програми буде виглядати так:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#include "mbed.h"
#include "freetronicsLCDShield.h"

int main()
{
    while(1)
    {
        
    }
}
Щоб дізнатись як працювати з бібліотекою "freetronicsLCDShield", заглянемо до довідки. В дереві проекту розгортаємо "freetronicsLCDShield", натиснувши на "+", далі "Classes" і "freetronicsLCDShield". Відкриється вкладка з довідкою на бібліотеку.
freetronicsLCDShield Class Reference
Спочатку до головної функції за допомоги конструктора створимо об'єкт. Дамо йому назву "lcdKeypad", та вкажемо всі потрібні для роботи піни.
1
freetronicsLCDShield lcdKeypad(D8, D9, D4, D5, D6, D7, D3, A0);
Де D8 - rs, D9 - enable, D4-D7 - data, D3 - back light, A0 - keypad.

І тепер в програмі ми можемо звертатись до членів класу через оператор - "."
Де "lcdKeypad" це назва класу, а члени це функції, такі як - cls, setCursor, home, readButton, тощо. Докладно дивитись в довідку по бібліотеці "freetronicsLCDShield".

Спочатку напишемо програму яка буде показувати на екран отримані значення від натискання той чи іншої кнопки. Максимально доповнив програму коментарями, має бути все зрозумілим.
 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
#include "mbed.h"
#include "freetronicsLCDShield.h"

// Оголошуємо клас freetronicsLCDShield з назвою lcdKeypad,
// та вказуємо всі потрібні піни для роботи
freetronicsLCDShield lcdKeypad(D8, D9, D4, D5, D6, D7, D3, A0); 

int main()
{
    // оголошуємо змінну типу float для значень з аналогового
    // входу A0, куди підключений keypad
    float val_button;
    // Очищаємо дисплей
    lcdKeypad.cls();
    // В позицію 0,0 пишемо текстовий рядок "STM32: mBed"
    lcdKeypad.printf("STM32: mBed");
    // чекаємо 2-ві секунди
    wait(2);
    
    while(1)
    {
        // Встановлюємо курсор в позицію 1,0 
        lcdKeypad.setCursorPosition(1, 0);
        // Зчитуємо значення на аналоговому вході A0.
        // Так як значення в межах від 0 до 1, то множимо на 1000
        val_button = lcdKeypad.readButton()*1000;
        // Друкуємо на дисплей отримані значення на аналоговому вході A0
        lcdKeypad.printf("Value: %4.0f", val_button);
        // Чекаємо 0.2 секунди щоб отримані значення не так швидко "мерехтіли"
        wait(0.2);
    }
}
Після того як ввели програму, компілюємо її, та переносимо на диск "Nucleo". Програма "заллється" в мікроконтролер і на екрані в першому рядку з'явиться напис "STM32: mBed", а в другому рядку "Value: 1000".
Результат роботи програми
Натискаємо по черзі на кнопки і занотовуємо отримані значення. Мої значення при натисканні на кнопки такі: нічого не натиснуто - 1000, left - 728, down - 468, up - 196, right - 0, select - 1000. Отакої! Виходить, що натискання на кнопку "SELECT" я ніяк не зможу відстежити, мабуть це
якийсь брак конкретно мого екземпляру. Але нічого страшного, достатньо і чотирьох кнопок.

Як виявилось це не брак плати, а "конфлікт" напруг. Напруга, яку подають на резистивний дільник з кнопками, дорівнює 5 вольтам, а максимальна напруга яку міряє наш АЦП - 3.3 вольта. Тому, все що вище 3.3 вольта, не відстежується. Треба плату LCD доопрацювати. Це або живити дільник від 3.3 вольт, або змінити номінали резисторів на дільнику.

Внесемо зміни до програми. Щоб при натисканні на кнопки, на дисплей виводився напис, яку кнопку ми натиснули. 

 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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include "mbed.h"
#include "freetronicsLCDShield.h"

// Оголошуємо клас freetronicsLCDShield з назвою lcdKeypad,
// та вказуємо всі потрібні піни для роботи
freetronicsLCDShield lcdKeypad(D8, D9, D4, D5, D6, D7, D3, A0); 

int main()
{
    // оголошуємо змінну типу float для значень з аналогового
    // входу A0, куди підключений keypad
    float val_button;
    // Очищаємо дисплей
    lcdKeypad.cls();
    // В позицію 0,0 пишемо текстовий рядок "STM32 : mBed"
    lcdKeypad.printf("STM32 : mBed");
    // чекаємо 2-ві секунди
    wait(2);
    
    while(1)
    {
        // Встановлюємо курсор в позицію 1,0 
        lcdKeypad.setCursorPosition(1, 0);
        // Зчитуємо значення на аналоговому вході A0.
        // Так як значення в межах від 0 до 1, то множимо на 1000
        val_button = lcdKeypad.readButton()*1000;
        // Перевіряємо яку кнопку натиснуто
        if (val_button < 50)
        {
            lcdKeypad.printf("BUTTON: Right  ");
        }
        else if (val_button < 250)
        { 
            lcdKeypad.printf("BUTTON: Up     ");
        } 
        else if (val_button < 500)
        { 
            lcdKeypad.printf("BUTTON: Down   ");
        } 
        else if (val_button < 800)
        { 
            lcdKeypad.printf("BUTTON: Left   "); 
        } 
        else if (val_button > 950)
        { 
            lcdKeypad.printf("BUTTON: Nothing");
        }
        // Чекаємо 0.1 секунду
        wait(0.1);
    }
}
Компілюємо, переносимо до диску "Nucleo". Програма "заллється" до мікроконтролеру і на екрані побачимо таку "картину".
Результат роботи програми
Тепер при натисканні кнопок на дисплей буде виводитись напис: up, down, left, right.

В кого в "LCD Keypad Shield" підсвічування дисплею під'єднане коректно до піну D3, то треба додати до програми рядок "lcdKeypad.setBackLight(true);", щоб увімкнути підсвічування, або "lcdKeypad.setBackLight(false);", щоб вимкнути підсвічування. Наприклад, якщо натиснута кнопка "up" - вмикаємо підсвічування, "down" - вимикаємо.

Відео приклад

Коротке відео, як створити новий пустий проект, під'єднати потрібні бібліотеки. Далі вставляємо програму що вище з цієї статті, компілюємо, "заливаємо" до мікроконтролеру та розглядаємо як працює програма.


середу, 17 серпня 2016 р.

STM32: Знайомство з STM32F103Nucleo та засобом розробки mbed

Знайомство з STM32F103 Nucleo та засобом розробки mbed

Огляд плати розробника STM32F103 Nucleo

Загальний вигляд плати розробника STM32F103 Nucleo
Плата STM32F103 Nucleo має борту піддослідний чіп STM32F103RB. Це мікроконтролер з ядром Cortex-M3, 128Kbytes FLASH пам'яті, 72 MHz максимальна тактова частота процесора, максимальна кількість портів вводу/виводу 51, чотири - 16 бітних таймери, годинник реального часу RTC, інтерфейси: UART, SPI, I2C, USB, CAN, DMA, та ЦАП з АЦП. Докладна документація на сайті виробника за цим посиланням.

Периферія, що на борту плати розробника серії Nucleo доволі скромна і має тільки користувацькі світлодіод і кнопку. Має два типи роз'ємів для спілкування з зовнішнім світом. Це Arduino connector та ST Morpho connector. Розташування елементів і роз'ємів на платі зображено на малюнку.
Розташування елементів на платі
Документація по цій платі доступна на сайті розробника за цим посиланням. Як і інші плати розробника, містить програматор ST-link v2, яким також можна прошивати інші мікроконтролери STM. У разі застосування плати в кінцевий продукт, програматор ST-link, можна легко від'єднати від основної плати. І отримати в своє розпорядження окремий програматор.
ST-Link V2
На загал, доволі стандартно. Зосередимось на особливостях.

Головна особливість плат серії Nucleo це можливість підключення великої кількості "Arduino Shield", плат розширення периферії системи ARDUINO, за рахунок сумісності роз'ємів з Arduino connector. А також компанія ST пропонує плати розширення периферії своєї розробки. Це дозволяє швидко розширяти можливості плати і будувати доволі складні програмно-апаратні системи.
Arduino connector
Роз'єми ST Morpho дозволяють скористатись повним набором периферії та можливостей мікроконтролера STM32F103RB.
ST Morpho
На платі STM32F103 Nucleo не впаяний зовнішній кварцовий резонатор і два конденсатора для тактування мікроконтролера, хоча місце для нього на платі зарезервовано і при необхідності можна самому допаяти резонатор і два конденсатори. Можна і без нього, мікроконтролер має внутрішній генератор тактових імпульсів. Читав що плата постачається також і без зовнішнього годинникового кварцу для RTC, але особисто моя плата, такий кварц має.

Огляд засобу розробки mbed

Серія плат Nucleo входить до складу засобу розробки і компілятора mbed. Це така собі соціальна мережа розробників. Тут є все необхідне для швидкого старту. Засоби написання коду, компілятор, приклади програм, бібліотеки, форум розробників, тощо. Дуже зручно, що можна мати доступ до своїх розробок з будь якого місця, комп'ютера і ОС, з одного боку. І дуже не зручно з іншого боку, бо те все працює тільки при наявності доступу до інтернет.

Перш за все потрібно зареєструватись на цьому ресурсі. Заходимо за посиланням та реєструємось натиснувши кнопку "Signup". Далі тиснемо на "no, i haven't created an accaunt before" і дотримуючись інструкцій заповнюємо необхідні поля. Після успішної реєстрації отримаєте повідомлення "Welcome to mbed! To register a board, please plug the board in and click on MBED.HTM". Тепер можна додати свою плату натиснувши "Platform" та обрати STM32F103 Nucleo, або ту плату, що є у вас в наявності і підтримується mbed. Далі з'явиться робочий простір "Workspace Management". Як приклад, моя сторінка на mbed.
Workspace management
Все майже готово для початку. Залишилось завантажити і встановити "свіжі" драйвера для ST-LINK на свій ПК за цим посиланням. Та оновити "прошивку" самого програматора ST-LINK. Як це зробити, можна дізнатись за посиланням.

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

Випробуємо декілька простих програм такого собі мікроконтролерного "Hello World", це блимання світлодіодом і реагування на кнопку.

Заходимо через браузер до "mbed compiler workspace". Створюємо нову програму. Тиснемо меню "New".
Створюємо нову програму
З'явиться вікно де потрібно обрати свою платформу, шаблон і ім'я програми. Наша платформа "Platform: NUCLEO-F103RB", шаблон обираємо "Template: Blinky LED Hello World", ім'я програми "Program Name: Nucleo_blink_led" генерується, в цьому випадку, автоматично, але можна поміняти при бажанні.
Обираємо шаблон з списку
Тиснемо "OK" і отримуємо робочий простір з деревом проекту програми (1), списком файлів (2) і детально про програму (3).
Проект програми blink led
В дереві проекту (1) тиснемо на файлі "main.cpp" і ознайомлюємось з шаблоном програми.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#include "mbed.h"

DigitalOut myled(LED1);

int main() {
    while(1) {
        myled = 1; // LED is ON
        wait(0.2); // 200 ms
        myled = 0; // LED is OFF
        wait(1.0); // 1 sec
    }
}
В першому рядку підключаємо бібліотеку "mbed". В третьому рядку оголошуємо цифровим виходом LED1 та присвоюємо йому ім'я myled. Далі в основній функції main безкінечний цикл в якому вмикаємо світлодіод на 200 мілісекунд, а потім вимикаємо його на одну секунду і повторюємо знову і знову. Все дуже просто, наочно і зрозуміло.

Тепер потрібно скомпілювати програму. Для цього в меню тиснемо "Compile", або "Ctrl+D" і ваш браузер завантажує готовий для заливки бінарний файл "Nucleo_blink_led_NUCLEO_F103RB.bin" в теку завантажень. Під'єднуємо до ПК через USB свою плату Nucleo і з'явиться електронний диск (флешка) з ім'ям "NUCLEO". Тепер достатньо завантажений бінарний файл з програмою перемістити або скопіювати на цей диск і програма прошиється до мікроконтролеру автоматично. Як все виконали правильно, то на вашій платі Nucleo має блимати зелений світлодіод.

Реагуємо на кнопку

Випробуємо інший приклад програми. Створюємо нову програму - тиснемо в меню "New". З пропонованих шаблонів обираємо "Read the board user button state". І тиснемо "OK". В дереві проекту нашої нової програми обираємо файл "main.cpp" і ознайомлюємось з текстом програми.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include "mbed.h"
 
DigitalIn mybutton(USER_BUTTON);
DigitalOut myled(LED1);
 
int main() {
  while(1) {
    if (mybutton == 0) { // Button is pressed
      myled = !myled; // Toggle the LED state
      wait(0.2); // 200 ms
    }
  }
}
Перший рядок підключаємо бібліотеку "mbed" в третьому рядку оголошуємо USER_BUTTON як цифровий вхід і даємо йому ім'я mybutton. Аналогічно, як в попередньому прикладі, оголошуємо світлодіод myled, як цифровий вихід. А далі, в тілі основній функції main, у безкінечному циклі перевіряємо чи натиснута кнопка - це рядок 8. Якщо так, то змінюємо стан світлодіода на протилежний. Затримка на 200 мілісекунд в 10 рядку і на початок безкінечного циклу.
Компілюємо програму, переносимо або копіюємо завантажений бінарний файл до диску Nucleo і перевіряємо роботу програми на нашій платі STM32F103RB Nucleo натискаючи на блакитну кнопку та спостерігаємо як міняється стан зеленого світлодіода.

Бібліотека mbed

В дереві проекту, Nucleo_blink_led та Nucleo_read_button, крім файлу main.cpp присутня бібліотека mbed, яку ми підключаємо першим рядком програми #include "mbed.h". Насправді, якщо відкрити бібліотеку натиснувши "mbed", натиснувши в дереві проекту побачимо список з документації на класи, групи і структури:
Документація на бібліотеку mbed
Тепер подвійний клік в списку на classes і розгорнеться список з документації на класи. Наприклад розглянемо клас DigitalOut. Подвійний клік на DigitalOut в списку, відкриється опис цього класу:
Опис класу digitalout
Як видно з малюнку, опис складається з всіх доступних функцій і параметрів для цього класу, та з невеличкого прикладу програми. 

Тепер ви вже можете самостійно спробувати та ознайомитись з іншими прикладами програм, що надаються mbed compiler. Та розглянути документацію інших класів, структур та груп.

Відео приклад "Blinky LED" та "Read Button"

Коротеньке наочне відео як завантажити приклади, компілювати їх, та "прошити" до мікроконтролера. 

середу, 10 серпня 2016 р.

STM32VLDISCOVERY та RTC. Помилка на платі.

Запускав на платі розробника STM32VLDiscovery, що на мікроконтролері STM32F100RB, годинник реального часу (RTC). Годинник працював відмінно. Але коли захотів перевірити як зберігається час від резервного живлення (окремої батарейки яка під'єднується до окремої "ноги" мікроконтролера), а не вийшло. Бо на платі STM32VLDiscovery не правильно зробили розведення доріжок. По схемі в документації все вірно.

Якщо роз'єднати перемичку SB1, а на EXT VBAT подати живлення від окремої батарейки у 3В, то при пропаданні основного живлення, час буде зберігатись, а точніше - буде продовжувати "йти". Але на самій платі розведення доріжок  не відповідає схемі. Ось реально що є. 

При знятій перемичці SB1 в повітрі висить VBAT з С16, а 1 пін чипу, як був з'єднаний з основним живленням, так і залишився. І при пропаданні основного живлення RTC буде обнулятись.

Майте на увазі. Потрібно самому робити зміни в схемі. Наприклад, відпаяти 1 пін мікроконтролеру від схеми і вивести окремо vbat.

середу, 3 серпня 2016 р.

Про важливість оновлення ST-LINK Utility та ST-LINK Upgrade

Придбав собі окремий програматор ST-LINK V2 (купити можна як на ebay так і на aliexpress, або деінде).
Програматор ST-Link v2

Бо, наприклад, такі плати не мають на борту свого програматора і тому приходиться підключатись до програматора у складі якоїсь плати розробника STM32 Discovery, STM32 Nucleo, тощо, які мають на своєму борту програматор ST-Link V2. А це доволі не зручно.
STM32F103C8T6 Minimum System Development Board
З підключенням не виникло проблем. Чотирьох-дротовим кабелем, що постачався в комплекті з програматором, з'єднати між собою програматор і плату однойменні виводи. Це 3.3V, GND, CLK і DIO (живлення +3.3В, земля, синхронізація і данні вхід/вихід).
З заливкою програм з засобу розробки CooCoxIDE 1.7 теж проблем не виникло. Але вже з CooCoxIDE 2.0 Beta залити програму до мікроконтролеру не вдалось. Виникала постійна помилка (з'єднайте кабель, підключіть програматор).
Як згодом виявилось, "прошивку" самого програматора, теж треба оновлювати. Бо не відомо скільки той програматор у продавця пролежав на складі і наскільки софт програматора вже застарів.
Завантажив з сайту st.com утиліту STM32 ST-LINK utility (ви маєте бути зареєстровані на сайті, щоб завантажувати). Встановив собі до ПК. Встановлення стандартне, без особливостей. Ця утиліта доволі універсальна і корисна. Одна з функцій, що нас зараз цікавить, це оновлення софту програматора.
Запустіть програму STM32 ST-LINK utility. Відкриється таке вікно.
Далі тиснемо меню ST-LINK -- FirmWare Updater і запуститься програма ST-LinkUpgrade яка має такий вигляд.
Далі тиснемо кнопку "Device Connect". Програматор має бути вже під'єднаний до ПК. З'явиться напис з поточною версією що у вашому програматорі "Firmware Version: V2.J27.S6 STM32+STM8 Debugger" та наявна остання версія на сайті ST - "Upgrade the firmware: V2.J27.S6". Це тільки приклад для мого конкретного програматора і на цей момент. В вас можуть бути інші версії "прошивок". Моя "прошивка" вже оновлена до останньої і прошивати не потрібно. А як у вас "старіша" версія, то тисніть кнопку YES для оновлення "прошивки". 
Після оновлення програмного забезпечення, програматор став без проблем "шити" мікроконтролер і з CooCoxIDE 2.0 Beta.
Є ще на сайті ST окрема утиліта ST-LINK/V2 firmware upgrade. Але спробувавши її, виявилось що утиліта пропонує встановити старішу "прошивку" чим вже є в програматорі.
Таке враження, що ці утиліти мають різні репозиторії. Так що майте на увазі. І перевіряйте де в наявності свіжіша "прошивка".